從rgb
到lab
色彩空間的轉換,色彩模型除了最常見的
rgb以外,故人們一般也只能找到
xyz和
lab之間的轉換,而
rgb到
lab的轉換只能使用
xyz作為中間模式間接進行,我們可以先觀察
rgb到
xyz的轉換:,
rgb是經過
gamma
校正的色彩分量:
r=g(r)
,其中rgb
為原始的色彩分量,以及
xyz到
lab的轉換:,非
rgb色彩資料的絕對值並不重要,上面的從
xyz到
lab的轉換乍一看起來很奇怪,從
rgb到
lab色彩空間的轉換。色彩模型除了最常見的
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
的結果非常相似,但也有一些幅度上的差別,且容以後慢慢細察。
RGB轉LAB色彩空間
1.原理 rgb無法直接轉換成lab,需要先轉換成xyz再轉換成lab,即 rgb xyz lab 因此轉換公式分兩部分 1 rgb轉xyz 假設r,g,b為畫素三個通道,取值範圍均為 0,255 轉換公式如下 等同於如下公式 x var r 0.4124 var g 0.3576 var b 0....
RGB轉LAB色彩空間
1.原理 rgb無法直接轉換成lab,需要先轉換成xyz再轉換成lab,即 rgb xyz lab 因此轉換公式分兩部分 1 rgb轉xyz 假設r,g,b為畫素三個通道,取值範圍均為 0,255 轉換公式如下 等同於如下公式 x var r 0.4124 var g 0.3576 var b 0....
RGB轉LAB色彩空間
1.原理 rgb無法直接轉換成lab,需要先轉換成xyz再轉換成lab,即 rgb xyz lab 因此轉換公式分兩部分 1 rgb轉xyz 假設r,g,b為畫素三個通道,取值範圍均為 0,255 轉換公式如下 0.4124,0.3576,0.1805 0.2126,0.7152,0.0722 0....