色彩(顏色)空間原理(上)
RGB色彩空間轉換
我最近在進行色彩科學方面的工作,當您要正確使用數字色彩值時,從一種色彩空間轉移到另一種色彩空間成為一種常見操作。通常,我們只是將數字顏色視為RGB值,但是有許多方法可以用數字方式描述顏色。只需打開PhotoShop的拾色器,您就可以選擇除標准RGB之外的其他顏色作為HSV,Lab或CMYK值。如果您對PhotoShop有所了解,您甚至可以嘗試使用“顏色設置”,它具有更多選項,包括您的圖像將使用哪個RGB版本。我將重點關注多個RGB空間的概念。
根據您最終的到來方式,可能有多種類型的RGB可能會令人驚訝,因此,我將盡力介紹一些背景信息,並引入一個稱為XYZ的色彩空間。然后,我們將逐步講解在所有這些RGB變體之間進行轉換的數學方法,並討論為什么您甚至考慮這樣做。最后,我將介紹一些用於實現色彩空間轉換的示例代碼。
多個RGB空間
當您告訴像素使用RGB組件進行繪制時,您將為輸出到該像素的紅色,綠色和藍色原色光指定強度值。當顯示器混合這些燈時,您將獲得所需的顏色。問題在於那里有多種類型的顯示器,並且主光源可能不盡相同。允許的指示燈將相似,但是一台顯示器上的紅色主顯示器可能與另一台顯示器上的紅色主顯示器不完全匹配。例如,舊的CRT電視的原色與新的高清LCD電視不匹配。當原色燈不匹配時,具有相同RGB成分的顏色也將不匹配,因為它將不同的原色相加。
RGB空間的原光可產生的顏色范圍稱為其色域,必須注意的是,當兩個空間的色域不同時,將存在一個空間可以產生而另一空間不能產生的顏色。
對於許多應用程序來說,整個概念實際上並不需要擔心。只要您的紅色看起來偏紅而您的綠色看起來偏綠,一切都很好。當顏色精度很重要時,或者如果您想成為某種顏色的納粹,則需要從一種顏色空間轉換為另一種顏色空間。一種用途是將在LCD監視器上繪制的紋理轉換為匹配的(或盡可能接近匹配的)顏色值,以在CRT電視上顯示。
XYZ色彩空間和色度
到目前為止,我們已經將顏色描述為RGB顏色空間的紅色,綠色和藍色原色的組合。為了將一種顏色空間與另一種顏色空間進行比較,擁有可在其中定義任何可見顏色的標准化通用空間將很有用。幸運的是,在這些事情上有權威可以幫助我們。該委員會國際照明(法國國際照明委員會和通常縮寫為CIE)位於奧地利。
為了以通用方式定義不同的RGB顏色空間,我們將使用CIE 1931 XYZ顏色空間。XYZ空間是圍繞能夠描述人類可見的所有顏色而設計的。我之所以提到“人類視覺”,是因為不同的物種實際上可以查看光譜的不同部分。例如,有些鳥實際上可以看見紫外線,但不會太嫉妒,因為它們也因此會給眼睛帶來更多有害輻射。在繼續之前,我想指出關於XYZ空間的一些事實。
- 所有人類可見的顏色均具有正的X,Y和Z值。這意味着在進行顏色轉換時,我們只關心XYZ空間的一個八度。
- XYZ顏色的Y值表示人眼感知到的顏色的相對亮度(因為所有的眼睛都有點不同,這實際上是根據實驗數據得出的近似值)。Y值較高的顏色被認為更亮,而Y值相等的顏色被認為具有相同的亮度。
- 只有正八分圓的一部分甚至對應於可見光(或與此有關的任何光)表示的實際顏色。換句話說,某些XYZ值在現實世界中沒有對應值。只要我們表現並保持在這個可見的子空間中(即,不只是開始將顏色定義為XYZ隨機值),我們就不會遇到任何問題。
三維彩色圖可能會有些混亂,因此幸運的是,我們CIE的朋友給了我們另一個描述顏色的工具,即二維xy 色度空間。色度是對顏色的描述,忽略了它的亮度。因為可以將顏色唯一地定義為亮度,色調和彩色的組合,所以我們也可以說色度是色調和彩色的組合。例如,說一種顏色是飽和紅色將描述色度,而明亮的飽和紅色將描述亮度和色度。
那么我們如何在數學上指定色度呢?我們可以使用CIE 1931 xyY顏色空間。從這里開始要當心,因為我將使用小寫的x,y和z表示一組值,使用大寫的X,Y和Z表示另一組值。不要為此怪我-這一切都是在奧地利決定的。
我們將按照X,Y和Z定義三個值x,y和z,如下所示(最后是一些數學運算!)。
因為我們可以從x和y得出z,所以實際上只需要指定x和y即可描述唯一的xyz值。如果給定xy值為(0.2,0.3),則我們知道z值為0.5。盡管這似乎有些武斷,但它所做的是創建了一個二維xy空間,我們可以輕松地在二維表面上繪制圖形。
您可能已經注意到,我將此空間列為CIE 1931 xyY顏色空間,而不是xy或xyz顏色空間。這里的理由是我們需要X,Y或Z來重新創建原始顏色。使用xyz值,我們丟失了一些信息。它們可以在二維中唯一表示的事實應該預示着一些陰暗現象正在逐漸消失。盡管可以將任何原始XYZ分量與xy一起使用以重新計算原始顏色,但我們使用Y分量是因為它表示光度,我們也可以使用該數字代替X或Z,但這並不表示任何含義。太容易理解了。
現在我們可以在二維空間中描述顏色(不包括亮度),現在是拍攝照片的理想時間。
我之前提到過,XYZ空間中只有一部分對應於人類可見的顏色。此圖中顯示的區域是該可見范圍的xy表示。您的顯示器無法顯示所有可見的色度(除非您在我寫了這么久之后才讀了這么長時間,太棒了!)。這就是為什么我不用費心在這張圖像上放很多顏色的原因。您所看到的微妙顏色是將所有可見色度壓縮到RGB空間中的一種方式,但是即使如此,這也有點小問題,我不會將顯示的色度視為任何科學依據。
不用太偏離軌道,如果您熟悉線性代數或3D數學,您可能會想知道我們在空間上實際正在看什么(畢竟,這些都是從某個3D XYZ空間開始的)。創建xyz值時,我們實質上是將XYZ空間透視投影到包含點(1,0,0),(0,1,0),(0,0,1)的XYZ平面上。這樣,XYZ空間的正八分圓都以這三個點創建的三角形結束。我們的xy色度圖是此三維三角形沿Z軸的正交視圖。
定義RGB顏色空間
現在我們熟悉了XYZ空間和xy色度坐標,我們可以開始使用它們來定義RGB顏色空間。此定義由紅色基色,綠色基色,藍色基色和白色點的xy色度值以及一個伽瑪校正曲線組成。我將使用sRGB我下面的示例中的色彩空間。sRGB是Internet的標准顏色空間,因此您的瀏覽器應該可以很好地顯示它。這實際上提出了一個有趣的示例,說明可以在其中使用色彩空間轉換。如果假定互聯網都使用sRGB顏色編碼,並且您要制作一些具有不同顯示基色的新手機,則在瀏覽Web時,最好將sRGB空間映射到手機的RGB空間。
紅色,綠色和藍色原色
為顯示器的每個主要部分提供了色度坐標。對於sRGB空間,它們如下:
如果您回想起以前,顏色空間的色域是可以由該空間表示的顏色子集。現在,我們可以在色度圖上繪制sRGB色域。將列出的色度坐標與該圖進行比較,您會發現它們與三角形sRGB色域的角相匹配。
作為互聯網的標准色彩空間(可能非常接近顯示器的色彩空間),只能在網絡上創建該三角形內的色度。我還專門渲染了這張圖像,以准確表示那些色度,前提是您的顯示器已正確校准(可能不是-我的當然不是)。
我第一次看到這些圖表中的一個時,我有點擔心,因為看起來我們的顯示器似乎無法接近綠色。只需查看三角形左上角所有無法顯示的可見顏色即可!幸運的是,事實證明事情並沒有看起來那么糟。xy和XYZ空間相對於我們對顏色的感知方式都有所拉伸和傾斜。您會注意到一堆小點以舌形彎曲在圖表周圍。這些點表示以5納米的間隔分開的波長的可見光譜。它的細節離我們的目標有些偏離,但是知道它們具有一定的線性間距可以幫助我們看到圖中的變形。點從紅光傳播到綠光,並以藍光結束。如你看到的,間距在綠色附近延伸,而在藍色和紅色附近則非常壓縮。本質上,綠色的錯誤並不像該圖所示那樣嚴重。
白點
乍一看可能有點奇怪,但是白點用於指定白色。可能有人會期望白色實際上是白色,但這僅是一半。我說這是“半正確的”,因為從某種意義上說,一種顏色可能看起來是白色的,而實際上它實際上具有某種顏色。人類的視覺系統是一個復雜的野獸,它將或多或少地根據視野選擇將什么顏色感知為白色。這種應該視為白色的顏色稱為白點。
例如,普通的白熾燈泡發出橘紅色的光,而中午的太陽光則更接近中性白色。無論顏色如何變化,在陽光下在燈泡下或外面看時,您都會將白紙感知為白色。當然,您可能會在某種程度上意識到色相的變化,但要點是您不會感到困惑,因為當您在燈泡下時,所有紙張都會變紅。在攝影中,了解這種感知效果實際上很重要。顏色校正通常應用於照片,以便將在其上捕獲圖像的白點轉換為將在其上觀看圖像的白點。
對於sRGB,白點具有色度坐標(0.3127,0.3290)。此白點也稱為D65 ,它是對中午陽光產生的白色的估計。讓我們將其映射在色度圖上。
伽瑪校正曲線
伽馬校正曲線用於將像素亮度從線性標度轉換為指數標度。在對最終像素值進行編碼時,該曲線用於將線性亮度伽瑪壓縮為伽瑪校正值。解碼像素值時,將使用反曲線將值伽馬擴展回線性單位。
我們無法以線性比例感知顏色的亮度,因此這種伽瑪壓縮實際上有助於我們在每個像素有限的位數中存儲更多有用的信息。線性亮度和顏色的感知亮度(也稱為明度)之間的非線性關系如下所示。
如果我們要以線性刻度存儲圖像值,則值的單個步長將對應於刻度低端的亮度大步長,而對應於刻度高端的小亮度步長。結果,我們將在深色中失去很多亮度保真度。
現在,讓我們使用sRGB伽瑪校正曲線查看亮度。
現在,我們在所有值上都獲得了一致的亮度步驟,從而使我們可以在整個范圍內以更高的保真度編碼亮度。盡管此圖像確實顯示出線性亮度(人類感知),但應該強調的是,我們不再使用線性亮度(物理)。
這個概念是較舊的3D視頻游戲中出現許多照明錯誤的根源(實際上,許多新游戲仍然存在問題)。由於硬件限制和性能問題,某些視頻游戲僅在對其紋理進行編碼的非線性RGB空間中執行照明。這導致添加了燈光,從而產生比預期更明亮的效果。在上圖中很容易看到這一點。如果您在每個比例尺中定位具有(128,128,128)灰色的像素,您將看到它在線性亮度圖像中大約占22%,在經過伽瑪校正的圖像中大約占50%。現在,假設您要在此亮度下添加兩個燈光。在線性比例尺中,您將使22%翻倍,從而將44%放入具有正確值(178,178,178)的線性圖像中。
除了對亮度進行編碼的好處之外,還選擇了伽瑪曲線來匹配顯示設備的物理輸出屬性。例如,CRT監視器的電子槍具有非線性輸出,並且必須提供經過伽瑪校正的輸入,以便創建適當的實際亮度。