從RGB到Lab色彩空間的轉換

2022-10-06 05:39:02 字數 2904 閱讀 5285

色彩模型除了最常見的rgb以外,還有hsb、ycbcr、xyz、lab等。hsb一般僅僅作為影象處理過程中的臨時模式,ycbcr常常用於影象的壓縮處理,而xyz則嚴格按照人眼對光訊號的敏感度進行分布。

這裡將要稍作討論的便是lab模型。網路上諸多的介紹都說lab是基於xyz的,故人們一般也只能找到xyz和lab之間的轉換,而rgb到lab的轉換只能使用xyz作為中間模式間接進行。可惜的是,這種現狀源於誤解。

而在影象處理軟體中(比如photoshop),往往採用乙個更為簡單的演算法。

我們可以先觀察rgb到xyz的轉換:

[x,y,z] = [m] * [r,g,b]

其中m為一3x3矩陣:

[m] = [0.4125, 0.3576, 0.1805;

0.2126, 0.7152, 0.0722;

0.0193, 0.1192, 0.9505],

rgb是經過gamma校正的色彩分量:r=g(r),g=g(g),b=g(b)。

其中rgb為原始的色彩分量。

g是gamma校正函式:

當 x < 0.018 時,g(x) = 4.5318 * x

當 x >= 0.018 時,g(x) = 1.099 * d^0.45 - 0.099

rgb以及rgb的取值範圍則均為[0,1)。計算完成後,xyz的取值範圍則有所變化,分別是:[0, 0.9506),[0, 1),[0, 1.0890)。

以及xyz到lab的轉換:

l = 116 * f(y1) - 16

a = 500 * (f(x1) - f(y1))

b = 200 * (f(y1) - f(z1))

其中f是乙個類似gamma函式的校正函式:

當 x > 0.008856 時,f(x) = x^(1/3)

當 x <= 0.008856 時,f(x) = ( 7.787 * x ) + ( 16 / 116 )

x1、y1、z1分別是線性歸一化之後的xyz值,也就是說,它們的取值範圍都是[0, 1)。此外,函式f的值域也和自變數一樣都是[0, 1)。

計算完成後,l的取值範圍[0, 100),而a和b則約為[-169, +169)和[-160, +160)。

在觀察這些貌似複雜的變換之前,我們必須確定的乙個假設是:在影象處理軟體中,非rgb色彩資料的絕對值並不重要,重要的是他們能夠盡可能準確的還原成rgb影象以顯示在螢幕等相關裝置上。這個假設是我們的簡化得以成立的理由。

上面的從xyz到lab的轉換乍一看起來很奇怪,但若是仔細觀察,不難發現l與y1只是乙個簡單的同區間對映關係,這個對映其實可有可無(如果進行了對映反而必定導致色階丟失)。

這樣,我們取得的第乙個簡化是:l = y1。

接下來接著看a和b的對映過程。大家不難發現,a和b其實是乙個色差訊號(跟cb和cr的性質差不多)。至於它們的轉換係數500和200,大家可以完全忘記,因為他們的值域並不符合8位整數值的表達需要。

我們將會稍後計算出合適的因數,使得a和b都處在[0, 255]的範圍內。

因為xyz必須歸一化轉為x1y1z1,那麼我們其實可以在轉換矩陣m中作出這個修改,令每行乘以乙個係數以使得每行各數之和為1:

[m1] = [0.4339, 0.3762 0.1899;

0.2126, 0.7152, 0.0722;

0.0177, 0.1095, 0.8728]

於是乎,我們得出乙個半成品:

l = y1 = 0.2126 * r + 0.7152 * g + 0.0722 * b

a = fa * (x1 - y1) + da

b = fb * (y1 - z1) + db

其中的fx是調整值域用的係數,dx是乙個正數,用來消除a和b的負值。fx和dx的選取必須令a和b滿足值域在[0, 255]上的分布。

接下來我們來確定fx和dx的值。通過m1我們很容易計算出x1-y1的值域(極端情況)為[-86.784, +86.

784),而y1-z1的值域則為[-204.9536, +204.9536)。

於是乎,fa的值為1.4749,fb的值為0.6245;da和db則都是128。

這時,代入m1有:

l = y1 = 0.2126 * r + 0.7152 * g + 0.0722 * b

a = 1.4749 * (0.2213 * r - 0.3390 * g + 0.1177 * b) + 128

b = 0.6245 * (0.1949 * r + 0.6057 * g - 0.8006 * b) + 128

其中rgb和lab的取值範圍都是[0,255]。

最後的一點工作是演算法的優化。我們可以將這個方程組轉換成常整數乘法與移位的方式(相當於使用定點數)。為了方便閱讀,我仍然將移位寫為除法。

所以我們的最終結果為:

l = y1 = (13933 * r + 46871 * g + 4732 * b) div 2^16

a = 377 * (14503 * r - 22218 * g + 7714 * b) div 2^24 + 128

b = 160 * (12773 * r + 39695 * g - 52468 * b) div 2^24 + 128

至於逆變換則可以用類似的方法推導出來:

設l1=l,a1=(a-128)*174,b1=(b-128)*410,有:

r = l1 + (a1 * 100922 + b1 * 17790) div 2^23

g = l1 - (a1 * 30176 + b1 * 1481) div 2^23

b = l1 + (a1 * 1740 - b1 * 37719) div 2^23

其中rgb和lab的取值範圍都是[0,255],再經過逆gamma函式取得原始的rgb

以上的演算法在delphi中編譯通過。經測試,運算得出的直方圖與**觀感和我手頭的photoshop cs的結果非常相似,但也有一些幅度上的差別,且容以後慢慢細察。

從問題到建議

問題1 行動效果如何?是哪些因素在起作用?其中關鍵因素是什麼?問題2 行動措施是否具體可行?問題3 行動中有無意外變化和干擾?如何排除?問題4 行動背景有無變化?這對行動有無影響?問題5 行動結果有無出乎意料?有哪些新生成?問題6 行動措施的背後有無機制的突破?環節四 反思 總結並形成建議 問題1 ...

從直覺到理性

從直覺到理性 青少年藝術發展中的轉型教育 作者將司空見慣的文字融入耳目一新的情感和理性化的秩序駕馭,從外表到內文,從天頭到地腳,三百六十度的全方位滲透,從視覺效果到觸覺感受始終追求秩序之美的設計理念把握,並能賦予讀者一種文字和形色之外的享受和滿足,從直覺到理性青少年藝術發展中的轉型教育所探索的內容題...

從抽象到具體

從抽象到具體辯證邏輯的一種主要的研究方法和敘述方法。抽象是指事物某一方面的本質規定在思維中的反映,具體是指事物各方面的本質規定在思維中的有內在聯絡的完整反映。所謂從抽象到具體,也就是從物件最一般的本質出發,運用以綜合為主的邏輯方法,認識物件各個方面質的規定性及其內在聯絡,從而在思維中再現出作為多樣性...