色彩(顏色)空間原理(中)


色彩(顏色)空間原理(中)

顏色的線性變換

現在我們知道如何定義RGB顏色空間,以及如何使用伽瑪曲線在線性和伽瑪校正值之間進行轉換。剩下的最后一步是將線性RGB顏色轉換為XYZ顏色。一旦進入XYZ空間,我們就可以轉換回我們選擇的任何RGB空間,但這實際上只是開始。因為XYZ空間是定義其他顏色的標准顏色空間,所以我們可以選擇轉換為許多非RGB顏色空間,例如在感知上更統一的Lab顏色空間或生物驅動的LMS顏色空間

線性RGB空間和XYZ空間之間轉換的基本部分是認識到它們都是矢量空間。這基本上意味着數字以線性方式縮放。相反,經伽瑪校正的sRGB空間以非線性方式縮放亮度,因此不是亮度的矢量空間。如果您有某種數學迷信並且想更深入地研究該主題,請查閱  格拉斯曼定律,該定律將色彩感知視為線性組合。

知道我們在向量空間內工作時,便可以使用各種線性代數工具。我們將使用的線性代數中的一種這樣的工具是根據另一種顏色空間定義一種顏色空間的基礎。這類似於在3d空間中定義對象的變換。

正如我們前面所討論的,RGB顏色空間是通過將三種原色相加而建立的。第一個原色靠近光譜的紅色部分。第二個接近綠色。第三個接近藍色。為了獲得黃色,我們將紅色和綠色原色相加。此操作可以視為3維矢量加法。讓向量一世一世 ĴĴ 和 ķķ 分別等於我們的原色紅色,綠色和藍色,這樣

看來我們已經使局勢復雜化了,但它會有所收獲。首先,讓我們來看一些以這種方式定義顏色的示例。

在上面的例子中,RGB原色i、j和k是根據它們自己的RGB顏色空間定義的,這使得這些值相當簡單。當我們開始處理不同的顏色空間(如XYZ)時,事情變得更加有趣。             

目標是找到與線性RGB空間的原色相匹配的三種XYZ顏色。一旦在XYZ空間中有了i、j和k,就可以使用相同的r、g和b標量來找到RGB顏色的XYZ值。我會馬上討論如何推導這些新的初值,但首先我們假設我們已經知道它們的值,這樣我們就可以用一個例子來說明這個過程。設l是XYZ空間中的紅色主元素,m是XYZ空間中的綠色主元素,n是XYZ空間中的藍色邊緣元素。             

我們現在可以計算XYZ空間中的任何線性RGB顏色,將其作為XYZ空間中主色的線性組合。

推導變換矩陣

如先前所示,從線性RGB空間到XYZ空間的轉換矩陣具有從XYZ空間中的主要RGB顏色構建的列。為了找到這些值,我們需要將RGB空間的xy色度坐標用於紅色,綠色,藍色和白色。注意,我們只有x和y坐標。如前所述,我們可以根據x和y計算z坐標,但是我們需要X,Y或Z才能轉換回XYZ坐標。就目前而言,我們沒有足夠的信息從xy色度空間到XYZ空間,但是按照我們轉換的意圖,我們可以再做一個假設。

讓我們澄清一下此轉換的目的。前面我提到過眼睛如何適應照明環境,以選擇應被視為白色的顏色。為了我們的目的,我們希望將感知到的白色視為最大亮度。這意味着,如果我們從RGB空間A轉換為XYZ空間然后再轉換為RGB空間B,我們希望RGB空間A中的白色保持RGB空間B中的亮度。我們要做的就是確保當RGB空間轉換為XYZ空間時,白色值始終以一致的Y(即一致的相對亮度)結束。

我提到過,只要我們保持一致,就可以為白點選擇任何Y發光度,但是標准做法是使用Y值為1以獲得全亮度。有時,您可能會看到100的Y表示全亮度,但是在這種情況下,標准值為1。有了白色的目標Y值,我們現在有足夠的約束來求解矩陣。讓我們列出我們開始的變量。

目標是求解列主變換矩陣M,它將從線性RGB空間轉換到XYZ空間。第一步是使用前面討論的方程z=1−x−y將所有xy色度坐標轉換為xyz色度坐標。

我們知道所有的xyz初值,因此知道上面等式中的左矩陣。我們的未知數現在降到構成右矩陣的三個標量值。請注意,雖然每個標量都被寫成X、Y和Z分量的和,但我們真正關心的只是求和結果,而不是各個部分。這就是為什么我說只有三個未知數,而不是九個。為了解決這三個未知數,我們將使用已知的白點RGB和XYZ值。因為M從RGB變換到XYZ空間,所以我們可以聲明如下等式:

現在我們將把方程的每邊乘以剩下的3x3矩陣的逆。這將把我們所有的已知值放在方程的左邊,我們的未知值放在右邊。如果您不熟悉3x3矩陣的逆運算,我將在本文的末尾提供代碼,但出於理智起見,這里不會編寫完整的推導。Google應該提供大量關於這個過程的結果,包括Wikipedia和Mathwords的這一個。

我們現在可以重建我們的RGB到XYZ轉換矩陣M。將wXYZ向量乘以上述3x3矩陣的倒數將得到將主XYZ坐標轉換為XYZ坐標的標量值。這是我們從M中分解出來的標量矩陣的三個未知數。              

為了得到相反方向的矩陣變換(從XYZ空間到線性RGB空間),我們可以使用M的逆矩陣。我們也可以用與上面類似的方式來推導矩陣,但是在這么多類型化之后,僅僅使用逆似乎是一種更簡單的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM