1. 程式人生 > >色彩空間基礎

色彩空間基礎

本次的文章參考知乎章佳傑的文章:
色彩空間基礎
色彩空間表示與轉換

基礎

大部分人類的視網膜上有三種感知顏色的感光細胞,叫做錐細胞,分別對不同波長的光線敏感,稱為L/M/S型細胞。
三種視錐細胞最敏感的波長分別是橙紅色(長波,Long),綠色(中波,Medium),藍色(短波,Short)。這三種視錐細胞的歸一化感光曲線如下圖:
這裡寫圖片描述

大自然的這千千萬萬種顏色,在人類的眼裡看到,最後傳送到大腦裡的訊號,就只有這三種視錐細胞的電訊號而已。根據這三種電訊號的強弱,大腦解讀成了不同的顏色。這就是三原色理論的生物學依據。

人類眼睛對不同顏色光線混合的反應是線性疊加的。

CIE RGB 色彩空間

使用三種顏色RGB疊加,三種顏色的強度分別為rgb,來模擬某個波長的顏色。
純光譜色的混合疊加資料,就叫做色匹配函式。這個基準下定義的色彩空間,就是CIE RGB色彩空間。
這裡寫圖片描述

通過色匹配函式(Color Matching Function, CMF),可以將任何一種物理上的光譜分佈,轉換到線性色彩空間中。

CIE XYZ 色彩空間

因為有部分出現了負數,在使用和計算上都有不方便,因此就對這個匹配函式進行了一下線性變換,變換到一個所有分量都是正的空間中。變換後的色彩空間就是 CIE XYZ 色彩空間。
這裡寫圖片描述

從線性空間的角度理解色彩空間

人類的色視覺,是相當於在自然界所有顏色的無窮維函式空間中取了一個三維的投影。這個三維空間的基底,既可以是視錐細胞的感光特性曲線(我們的大腦就用的是這套),當然也可以是選取三種顏色的光進行組合(CIE RGB 空間),甚至還可以是用實際中不存在的「光線」進行組合 (CIE XYZ 空間)。

既然這幾個空間實際上是同一個線性空間,只不過由於選擇了不同的基底而有不同的表達形式,那麼根據線性代數的結論,這幾個空間的表述形式之間,只需要通過矩陣乘法就可以完成轉換,這是完全的線性變換

裝置相關的RGB色彩空間

如前文所述,色彩空間的基底的選擇有一定的任意性。事實上,如果允許真正的減法存在,那麼選擇哪三種顏色作為基底是無關緊要的。不過由於實際中我們不能對色光采用減法,只能使用「錐組合」而非「線性組合」,這時候到底如何選取基底就顯得重要了。好的基底不僅能表達的顏色更豐富,而且工程上也易於穩定地實現。

CIE XYZ空間是一個很方便的線性空間,與具體的裝置無關,因此經常用來做各種顏色空間轉換的中間媒介。

要想要某個顏色的光,經過色匹配函式的計算,得到了XYZ的值,如果直接將這三個值作為RGB顏色顯示到螢幕上,顯然是不對的。必須將XYZ的值轉換到RGB空間中的值。
得到線性RGB空間的表示之後,還需要經過伽馬校正,才是最終在螢幕上顯示的RGB的值。

對於 RGB 色彩空間來說,關鍵點在於兩個:1. 如何選擇三個作為基底的顏色;2. 如何定義白色。一旦選好這兩個關鍵引數,那麼從 CIE XYZ 空間到裝置的 RGB 空間的轉換就完全確定了。我們平時常說的 sRGB 空間和 Adobe RGB 空間,他們的區別就在於這兩個關鍵引數的定義不同。
不同的RGB色彩空間所能表示的顏色的範圍是不一樣的,即使是相同的RGB分量,在不同的RGB空間中所代表的顏色也是不一樣的。
很多的數碼相機都可以設定色彩空間,常見的有Adobe RGBsRGBsRGB是目前螢幕顯示的事實標準,大多數螢幕都在sRGB內。

色彩椎體

如果把純光譜色畫在 CIE XYZ 空間中,得到下圖這樣的曲線。
這裡寫圖片描述
連線原點與這條曲線得到的無數條射線,包圍出來一個「錐體」,這個錐體就是人所能感知的所有色彩。

這個曲線在三維空間中是一個極度扭曲的曲線,不論是用來展示還是輔助計算都不方便。我們可以將這條曲線投影到x+y+z=1的平面(上圖中的黃色平面)上,進行歸一化。在這個歸一化的平面上,光譜色曲線就是一條形狀像是舌頭的曲線。這個舌頭形狀的圖,就叫「色品圖(Chromaticity Diagram)」,所有純光譜色,構成色品圖的邊界。在上面那個圖中從上往下看,黃色平面上,色品圖(的邊界)是這個樣子的:
這裡寫圖片描述
圖中藍色數字標明瞭純光譜色對應的波長。

XYZ空間到RGB空間的轉換

之前的文章說到,定義一個 RGB 空間,關鍵在於兩個引數:
1. RGB 三點的座標;
2. 白色點的位置。

這裡就以 sRGB 空間為例,說說如何根據這兩個引數確定轉換關係的。

根據定義,sRGB 的三原色以及白色點的 XYZ 座標是:

這裡寫圖片描述

白色點的意義在於校準三原色在向量空降中的長度,使得當 RGB = (1, 1, 1) 的時候正好對應的是白色。也就是列出這個方程:

W = w r R + w g G + w b B

或者寫成矩陣形式
W = [ R , G , B ] w
求解出 w r , w g , w b 各個係數。這是個三元一次方程,在計算機上非常容易求解,即使手工求解也不難。
w = [ R , G , B ] 1 W
對於 sRGB 的情況來說,帶入數字,可得
w = [ R , G , B ] 1 W = [ 0.64 0.30 0.15 0.33 0.60 0.06 0.03 0.10 0.79 ] 1 [ 0.95047 1.00000 1.08883 ] = [ 0.6445 1.1919 1.2029 ]
接下來,對於某一種顏色 C = (x, y, z),它對應的 sRGB 座標是多少呢?也就是如果將校正長度後的 RGB 三原色作為新的基底,那麼各個分量都是多少呢?我們可以寫出新的方程:
C = r ( w r R ) + g ( w g G ) + b ( w b B )
或者寫成矩陣形式
C X Y Z = [ R , G , B ] [ w r 0 0 0 w g 0 0 0 w b ] [ r g b ] = [ w r R , w g G , w b B ] , C R G B
根據這個所以,從 sRGB 到 XYZ 的轉換矩陣就是:
M = [ w r R , w g G , w b B ] = [ 0.41248 0.35757 0.18044 0.21269 0.77514 0.072174 0.019335 0.11919 0.95029 ]

那麼從 XYZ 轉到 sRGB 的矩陣就是他的逆矩陣:
M 1 = [ w r R , w g G ,