2.15. 顏色空間¶
“顏色”是一個非常複雜的概念,它取決於物理學、化學和生物學。僅僅因為您有三個數字來描述畫素顏色的“紅色”、“綠色”和“藍色”分量,並不意味著您能夠準確顯示該顏色。顏色空間定義了 RGB 值(例如 255, 0, 0)的實際*含義*。也就是說,在完美校準的環境中,螢幕上應該再現哪種顏色。
為此,我們首先需要對顏色有一個清晰的定義,即以某種方式唯一且明確地定義一種顏色,以便其他人能夠再現它。人類的顏色視覺是三色的,因為人眼具有對三種不同波長的光敏感的顏色感受器。因此需要使用三個數字來描述顏色。慶幸你不是一隻螳螂蝦,因為它們對 12 種不同的波長敏感,所以我們可能要使用 ABCDEFGHIJKL 顏色空間而不是 RGB...
顏色只存在於眼睛和大腦中,是顏色感受器受刺激強度的結果。這基於光譜功率分佈 (SPD),它是一個圖表,顯示光在進入眼睛時,覆蓋可見光譜的波長處的強度(輻射功率)。色度學是研究 SPD 與人腦感知顏色之間關係的科學。
由於人眼只有三個顏色感受器,因此即使光的 SPD 不同,不同的 SPD 也完全可能導致這些感受器產生相同的刺激,並被感知為相同的顏色。
在 20 世紀 20 年代,人們設計了實驗來確定 SPD 與感知顏色之間的關係,由此產生了 CIE 1931 標準,該標準定義了模擬顏色感知的光譜加權函式。具體來說,該標準定義了可以接受 SPD 並計算每個顏色感受器刺激的函式。經過進一步的數學變換後,這些刺激被稱為 *CIE XYZ 三刺激*值,這些 X、Y 和 Z 值明確地描述了人感知的顏色。這些 X、Y 和 Z 值都在 [0…1] 的範圍內。
CIE XYZ 顏色空間中的 Y 值對應於亮度。CIE XYZ 顏色空間通常會轉換為歸一化的 CIE xyY 顏色空間
x = X / (X + Y + Z)
y = Y / (X + Y + Z)
x 和 y 值是色度座標,可以用來定義不含亮度分量 Y 的顏色。這些顏色空間有如此相似的名稱非常容易混淆。請注意,如果顏色用小寫“x”和“y”指定,則使用 CIE xyY 顏色空間。大寫“X”和“Y”指的是 CIE XYZ 顏色空間。此外,y 與亮度無關。x 和 y 一起指定顏色,而 Y 指定亮度。從實踐角度來看,這就是您需要記住的全部內容。如果您感興趣,本節末尾將提供更詳細的閱讀資源。
顯示器或電視透過發射三種不同波長的光來再現顏色,這些光的組合將刺激眼睛中的顏色感受器,從而引起顏色感知。歷史上,這些波長是由顯示器中使用的紅色、綠色和藍色熒光粉定義的。這些*基色*是定義顏色空間的一部分。
不同的顯示裝置將具有不同的基色,並且某些基色比其他基色更適合某些顯示技術。這導致了用於不同顯示技術或用途的各種顏色空間。要定義一個顏色空間,您需要定義三個基色(這些通常定義為 CIE xyY 顏色空間中的 x, y 色度座標),還需要定義白點參考:即當所有三個基色都處於最大功率時獲得的顏色。這決定了基色的相對功率或能量。這通常選擇接近日光,日光已被定義為 CIE D65 標準光源。
總結一下:CIE XYZ 顏色空間唯一地識別顏色。其他顏色空間由 CIE xyY 顏色空間中定義的三個色度座標定義。基於這些座標,可以構建一個 3x3 矩陣,將 CIE XYZ 顏色轉換為新顏色空間中的顏色。
CIE XYZ 和源自特定色度基色的 RGB 顏色空間都是線性顏色空間。但無論是眼睛還是顯示技術都不是線性的。將線性顏色空間中所有分量的值加倍,並不會被感知為兩倍的顏色強度。因此,每個顏色空間還定義了一個傳輸函式,該函式將線性顏色分量值轉換為非線性分量值,這與眼睛和顯示器的非線性效能更匹配。線性分量值表示為 RGB,非線性分量值表示為 R’G’B’。通常,圖形中使用的顏色都是 R’G’B’,除了使用線性 RGB 的 OpenGL。在處理 OpenGL 時應特別注意提供線性 RGB 顏色或使用內建的 OpenGL 支援來應用逆傳輸函式。
定義顏色空間的最後一部分是將非線性 R’G’B’ 轉換為非線性 Y’CbCr 的函式。此函式由所謂的亮度係數確定。同一個顏色空間可能允許有多種 Y’CbCr 編碼。許多顏色編碼更傾向於使用亮度 (Y’) 和色度 (CbCr) 而不是 R’G’B’。由於人眼對亮度差異比對顏色差異更敏感,這種編碼允許人們相對於亮度資料減少顏色資訊量。請注意,亮度 (Y’) 與 CIE XYZ 顏色空間中的 Y 無關。另請注意,Y’CbCr 通常被稱為 YCbCr 或 YUV,儘管嚴格來說這些稱呼是錯誤的。
有時人們會將 Y’CbCr 誤認為是顏色空間。這是不正確的,它只是將 R’G’B’ 顏色編碼為亮度和色度值。與 R’G’B’ 顏色關聯的底層顏色空間也與 Y’CbCr 顏色關聯。
最後一步是 RGB、R’G’B’ 或 Y’CbCr 值如何量化。CIE XYZ 顏色空間中 X、Y 和 Z 在 [0…1] 範圍內描述了人類可以感知的所有顏色,但轉換為另一個顏色空間會產生超出 [0…1] 範圍的顏色。一旦被限制在 [0…1] 範圍內,這些顏色就無法在該顏色空間中再現。這種限制就是減少顏色空間範圍或色域的原因。將 [0…1] 範圍轉換為 [0…255](或更高,取決於色深)範圍內的整數值稱為量化。這*不*是顏色空間定義的一部分。實際上,RGB 或 R’G’B’ 值是全範圍的,即它們使用完整的 [0…255] 範圍。另一方面,Y’CbCr 值是有限範圍的,其中 Y’ 使用 [16…235],Cb 和 Cr 使用 [16…240]。
不幸的是,在某些情況下也使用了有限範圍的 RGB,其中分量使用 [16…235] 範圍。並且也存在使用 [0…255] 範圍的全範圍 Y’CbCr。
為了正確解釋顏色,您需要知道量化範圍、它是 R’G’B’ 還是 Y’CbCr、所使用的 Y’CbCr 編碼以及顏色空間。根據這些資訊,您可以計算出相應的 CIE XYZ 顏色,並再次將其對映到您的顯示裝置所使用的任何顏色空間。
顏色空間定義本身由三個色度基色、白點色度、傳輸函式以及將 R’G’B’ 轉換為 Y’CbCr 所需的亮度係數組成。雖然一些顏色空間標準正確定義了所有這四個方面,但通常顏色空間標準只定義了其中一些,您必須依賴其他標準來補充缺失的部分。顏色空間通常是不同標準的混合體這一事實也導致了非常容易混淆的命名約定,其中標準名稱被用來命名顏色空間,而實際上該標準也是其他各種顏色空間的一部分。
如果您想閱讀更多關於顏色和顏色空間的資訊,以下資源很有用:poynton 對影片工程師來說是一本很好的實用書籍,colimg 具有更廣泛的範圍,描述了顏色的更多方面(物理學、化學、生物學等)。http://www.brucelindbloom.com 網站是一個優秀的資源,尤其是在顏色空間轉換背後的數學方面。維基百科的 CIE 1931 顏色空間 文章也很有用。