本次的文章參考知乎章佳傑的文章:
色彩空間基礎
色彩空間表示與轉換
基礎
大部分人類的視網膜上有三種感知顏色的感光細胞,叫做錐細胞,分別對不同波長的光線敏感,稱爲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 RGB和sRGB,sRGB是目前屏幕顯示的事實標準,大多數屏幕都在sRGB內。
色彩椎體
如果把純光譜色畫在 CIE XYZ 空間中,得到下圖這樣的曲線。
連接原點與這條曲線得到的無數條射線,包圍出來一個「錐體」,這個錐體就是人所能感知的所有色彩。
這個曲線在三維空間中是一個極度扭曲的曲線,不論是用來展示還是輔助計算都不方便。我們可以將這條曲線投影到x+y+z=1的平面(上圖中的黃色平面)上,進行歸一化。在這個歸一化的平面上,光譜色曲線就是一條形狀像是舌頭的曲線。這個舌頭形狀的圖,就叫「色品圖(Chromaticity Diagram)」,所有純光譜色,構成色品圖的邊界。在上面那個圖中從上往下看,黃色平面上,色品圖(的邊界)是這個樣子的:
圖中藍色數字標明瞭純光譜色對應的波長。
XYZ空間到RGB空間的轉換
之前的文章說到,定義一個 RGB 空間,關鍵在於兩個參數:
1. RGB 三點的座標;
2. 白色點的位置。
這裏就以 sRGB 空間爲例,說說如何根據這兩個參數確定轉換關係的。
根據定義,sRGB 的三原色以及白色點的 XYZ 座標是:
白色點的意義在於校準三原色在向量空降中的長度,使得當 RGB = (1, 1, 1) 的時候正好對應的是白色。也就是列出這個方程:
或者寫成矩陣形式
求解出 , , 各個係數。這是個三元一次方程,在計算機上非常容易求解,即使手工求解也不難。
對於 sRGB 的情況來說,帶入數字,可得
接下來,對於某一種顏色 C = (x, y, z),它對應的 sRGB 座標是多少呢?也就是如果將校正長度後的 RGB 三原色作爲新的基底,那麼各個分量都是多少呢?我們可以寫出新的方程:
或者寫成矩陣形式
根據這個所以,從 sRGB 到 XYZ 的轉換矩陣就是:
那麼從 XYZ 轉到 sRGB 的矩陣就是他的逆矩陣:
注意到,這裏的矩陣中出現了負數,也就是說,從 CIE XYZ 空間轉換到 sRGB 空間,是有可能使得中間某個分量小於 0 的。
sRGB 空間下,所有色彩,都將位於這個三角形內部;轉換到三維空間的視角來看,sRGB 空間能表達的色彩,都位於以原點爲頂點,連接這個三角形,所有射線圍成的錐體內部。如果某個分量小於 0,那麼意味着,這個色彩,是落在了這個三角形外部,所以不能被 sRGB 空間所表示出來。
伽馬校正
在轉換完之後,我們只是得到了一個線性的 RGB 值,要被顯示器正確顯示的話,還需要進行 gamma 校正。
每個 RGB 空間對應的 gamma 校正公式不完全一致,大多數情況下都是 ,其中 γ=2.2。
少數情況,比如 Apple RGB 採用的是 γ=1.8 的情況,再比如上面作爲舉例的 sRGB 空間,採用了一種分段的非線性函數進行校正,在粗略的場景下,也可以直接使用 γ=2.2 的公式代替。
不同色彩空間比較的圖
在很多地方,可能都會看到這樣的圖片,尤其是很多手機或者筆記本的屏幕標準。
Adobe RGB 與 sRGB 相比較,能表示的顏色要多很多,所以很多攝影師會在相機內設置 Adobe RGB 作爲色彩空間。然而現在網絡上通用的還是 sRGB,如果不做任何轉換,瀏覽器可能將它視作 sRGB 空間進行渲染,得到的結果就會顯得比較灰暗。所以在把圖片上傳到網絡之前,一定要確認色彩空間是否匹配。而在部分專業的色彩輸出場合,甚至需要用到 ProPhoto RGB 這種表達能力極強的色彩空間。