Wednesday, August 3, 2022

【疑難】白點和特定點在 sRGB 色彩空間上的等分計算

這篇是關於社團【色彩管理交流】內的成員求助,問題很有趣,所以來解答看看。

 

 

 

問題描述

社團內的朋友所問的問題如下圖截圖所示,給了一張 CIE 1976 USC Yu'v' 色度圖,給了兩點 RGB 資訊,希望能夠內插出三點 RGB 使得 Yu'v' 色度圖內的座標為四等距。

第一時間看到這個問題,直覺所想到的問題是資訊不足,在發光源的顯色系統中,沒給色彩空間(Color Space)資訊根本沒有辦法往下做下去,所幸後來原發文者有補充說明了這個色彩空間環境的 RGBW u'v' 色度座標,並進一步地說明是 sRGB 色彩空間。好,有色彩空間了,那問題就可以簡化成:

"在 sRGB 色彩空間下,給任意兩個 RGB 資訊,找出三組 RGB 資訊,使得這三組 RGB 資訊在 CIE 1976 u'v' 色度空間中,剛好坐落定於兩組 RGB 對應的 u'v' 座標直線上,將直線分成四等分。"

發文者所給的 RGB 數值分別為 (255, 128, 0) 和 (255, 255, 255),那麼底下就開始進行作業。

 

RGB 的正規化

首先要處理的是正規化的問題,從發文者的資訊推估,演色系統為 8 位元,因此將顏色正規化如下:

\[ \style{text-align:left;} { \begin{align*} C_1 = \begin{bmatrix} \dfrac{255}{255} \\ \dfrac{128}{255} \\ \dfrac{0}{255} \end{bmatrix} = \begin{bmatrix} 1.0000 \\ 0.5020 \\ 0.0000\end{bmatrix} \label{01} \tag{01} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} C_2 = \begin{bmatrix} \dfrac{255}{255} \\ \dfrac{255}{255} \\ \dfrac{255}{255} \end{bmatrix} = \begin{bmatrix} 1.0000 \\ 1.0000 \\ 1.0000\end{bmatrix} \label{02} \tag{02} \end{align*} } \]

 

人眼感知線性化:\(\small \mathsf{RGB}\) to \(\overline{\small \mathsf{RGB}}\)

已知色彩空間為 sRGB ,Gamma Expansion 函數如下:

\[ \style{text-align:left;} { \begin{align*} \require{mathtools} \Gamma(C) = \begin{dcases} \dfrac{C}{12.92}& \quad \text{if } C \leq 0.04045 \\ (\dfrac{C+0.055}{1.055})^{2.4}& \quad \text{otherwise} \end{dcases} \label{03} \tag{03} \end{align*} } \]

根據式 (\(\ref{03}\)) 計算 \(\overline{\small \mathsf{RGB}}\) 如下:

\[ \style{text-align:left;} { \begin{align*} \overline{C_1} = \Gamma(C_1) = \begin{bmatrix} 1.0000 \\ 0.2159 \\ 0.0000\end{bmatrix} \label{04} \tag{04} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \overline{C_2} = \Gamma(C_2) = \begin{bmatrix} 1.0000 \\ 1.0000 \\ 1.0000\end{bmatrix} \label{05} \tag{05} \end{align*} } \]

 

\(\overline{\small \mathsf{RGB}}\) to \(\small \mathsf{XYZ}\)

已知色彩空間為 sRGB ,根據 sRGB 規範,可計算色彩轉換矩陣如下:

\[ \style{text-align:left;} { \begin{align*} M_t = \begin{bmatrix} 0.4124564 & 0.3575761 & 0.1804375 \\ 0.2126729 & 0.7151522 & 0.0721750 \\ 0.0193339 & 0.1191920 & 0.9503041 \end{bmatrix} \label{06} \tag{06} \end{align*} } \]

計算 \(XYZ_1\) 和 \(XYZ_2\) 如下:

\[ \style{text-align:left;} { \begin{align*} XYZ_1 = M_tC_1= \begin{bmatrix} 0.4896 \\ 0.3670 \\ 0.0451\end{bmatrix} \label{07} \tag{07} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} XYZ_2 = M_tC_2= \begin{bmatrix} 0.9500 \\ 1.0000 \\ 1.0888\end{bmatrix} \label{08} \tag{08} \end{align*} } \]

 

\(\small \mathsf{XYZ}\) to \(\small \mathsf{u'v'}\)

\(\small \mathsf{XYZ}\) to \(\small \mathsf{u'v'}\) 轉換式如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} u' \\ v' \end{bmatrix} = \begin{bmatrix} \dfrac{4X}{X+15Y+3Z} \\ \dfrac{9Y}{X+15Y+3Z} \end{bmatrix} \label{09} \tag{09} \end{align*} } \]

根據式 (\(\ref{09}\)) 計算 \(\begin{bmatrix} u' \\ v' \end{bmatrix}_1 \) 和 \(\begin{bmatrix} u' \\ v' \end{bmatrix}_2 \) 如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} u' \\ v' \end{bmatrix}_1 = \begin{bmatrix} 0.3195 \\ 0.5388\end{bmatrix} \label{10} \tag{10} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} u' \\ v' \end{bmatrix}_2 = \begin{bmatrix} 0.1978 \\ 0.4683\end{bmatrix} \label{11} \tag{11} \end{align*} } \]

 

內插

將各自的 XYZ 內的 Y 將 u'v' 組合得到 Yu'v' ,根據線性內插,算出兩個 Yu'v' 的等分點如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ u' \\ v' \end{bmatrix}_A = \begin{bmatrix} 0.6835 \\ 0.2587 \\ 0.5036\end{bmatrix} \label{12} \tag{12} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ u' \\ v' \end{bmatrix}_B = \begin{bmatrix} 0.5253 \\ 0.2891 \\ 0.5212\end{bmatrix} \label{13} \tag{13} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ u' \\ v' \end{bmatrix}_C = \begin{bmatrix} 0.8818 \\ 0.2282 \\ 0.4860\end{bmatrix} \label{1$} \tag{14} \end{align*} } \]

 

\(\small \mathsf{Yu'v'}\) to \(\small \mathsf{Yxy}\)

\(\small \mathsf{Yu'v'}\) 轉換成 \(\small \mathsf{Yxy}\) 的轉換式如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ x \\ y \end{bmatrix} = \begin{bmatrix} Y \\ \dfrac{9u'}{6u' - 16v' + 12} \\ \dfrac{4v'}{6u' - 16v' + 12} \end{bmatrix} \label{15} \tag{15} \end{align*} } \]

根據式 (\(\ref{15}\)) 計算 \(\begin{bmatrix} Y \\ x \\ y \end{bmatrix}_A \) 、\(\begin{bmatrix} Y \\ x \\ y \end{bmatrix}_B \) 和 \(\begin{bmatrix} Y \\ x \\ y \end{bmatrix}_C \) 如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ x \\ y \end{bmatrix}_A = \begin{bmatrix} 0.6835 \\ 0.4237 \\ 0.3666\end{bmatrix} \label{16} \tag{16} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ x \\ y \end{bmatrix}_B = \begin{bmatrix} 0.5253 \\ 0.4822 \\ 0.3865\end{bmatrix} \label{17} \tag{17} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} Y \\ x \\ y \end{bmatrix}_C = \begin{bmatrix} 0.7626 \\ 0.3652 \\ 0.3570\end{bmatrix} \label{18} \tag{18} \end{align*} } \]

 

\(\small \mathsf{Yu'v'}\) to \(\small \mathsf{Yxy}\)

\(\small \mathsf{Yu'v'}\) 轉換成 \(\small \mathsf{Yxy}\) 的轉換式如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \begin{bmatrix} \dfrac{xY}{y} \\ Y \\ \dfrac{(1-x-y)Y}{y} \end{bmatrix} \label{19} \tag{19} \end{align*} } \]

根據式 (\(\ref{19}\)) 計算 \(\begin{bmatrix} Y \\ Y \\ Z \end{bmatrix}_A \) 、\(\begin{bmatrix} X \\ Y \\ Z \end{bmatrix}_B \) 和 \(\begin{bmatrix} X \\ Y \\ Z \end{bmatrix}_C \) 如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}_A = \begin{bmatrix} 0.7899 \\ 0.6835 \\ 0.3910\end{bmatrix} \label{20} \tag{20} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}_B = \begin{bmatrix} 0.6555 \\ 0.5253 \\ 0.1785\end{bmatrix} \label{21} \tag{22} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}_C = \begin{bmatrix} 0.8896 \\ 0.8418 \\ 0.6911\end{bmatrix} \label{22} \tag{22} \end{align*} } \]

 

\(\small \mathsf{XYZ}\) to \(\overline{\small \mathsf{RGB}}\)

\(\small \mathsf{XYZ}\) 轉換 \(\overline{\small \mathsf{RGB}}\) 可以參考式 (\(\ref{07}\)) 和式 (\(\ref{08}\)) 的反矩陣轉換如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} \overline{R} \\ \overline{G} \\ \overline{B} \end{bmatrix} = M_t^{-1}\begin{bmatrix} X \\ Y \\ Z \end{bmatrix} \label{23} \tag{23} \end{align*} } \]

 

\(\overline{\small \mathsf{RGB}}\) to \(\small \mathsf{RGB}\)

已知色彩空間為 sRGB ,Gamma Compression 函數如下:

\[ \style{text-align:left;} { \begin{align*} \require{mathtools} \Gamma^{-1}(\overline{C}) = \begin{dcases} 12.92\overline{C}& \quad \text{if } \overline{C} \leq 0.0031308 \\ 1.055\overline{C}^{\frac{1}{2.4}}-0.055& \quad \text{otherwise} \end{dcases} \label{24} \tag{24} \end{align*} } \]

 

結果

在式 (\(\ref{24}\)) 完成後,須注意數值是否介於 0 和 1 之間,若否,則需進行 clamp 或者選擇適合的 intend 進行壓縮,之後將這些數值正規化到 255 後,取四捨五入整數。在這次的運算中發現正規到 255 後的數值超出 255 數值如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 287.4324 \\ 192.9386 \\ 152.8445 \end{bmatrix} \label{25} \tag{25} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 278.9999 \\ 161.2297 \\ 96.4013 \end{bmatrix} \label{26} \tag{26} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 280.6359 \\ 224.0326 \\ 204.6895 \end{bmatrix} \label{27} \tag{27} \end{align*} } \]

為避免這些大於數位訊號能顯示的範圍,必須進行數值限縮,這邊採用等比壓縮法,但這個方法並非合理的限縮方式,但針對貼文者的需求,應該是足夠了。最終結果如下:

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 255.0000 \\ 171.1684 \\ 135.5983 \end{bmatrix} \label{28}\tag{28} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 255.0000 \\ 147.3605 \\ 88.1088 \end{bmatrix} \label{29} \tag{29} \end{align*} } \]

\[ \style{text-align:left;} { \begin{align*} \begin{bmatrix} R \\ G \\ B \end{bmatrix}_A = \begin{bmatrix} 255.0000 \\ 203.5673 \\ 185.9913 \end{bmatrix} \label{30} \tag{30} \end{align*} } \]

 

No comments:

Post a Comment

熱門文章