從RGB到Lab色彩空間的轉換

2021-06-23 05:24:13 字數 4115 閱讀 6719

從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....