導航:首頁 > 源碼編譯 > hsv空間亮度調節演算法

hsv空間亮度調節演算法

發布時間:2024-03-20 16:49:21

『壹』 詳解RGB-HSB互相轉換的演算法

在講這個之前,首先簡單介紹一下什麼是RGB,什麼是HSB。

RGB色彩模式是工業界的一種顏色標准,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是運用最廣的顏色系統之一。顯示器大都是採用了RGB顏色標准。

HSB又稱HSV,表示一種顏色模式:在HSB模式中,H(hues)表示色相,S(saturation)表示飽和度,B(brightness)表示亮度。HSB模式對應的媒介是人眼。

(以下為了避免RGB的B和HSB的B混淆,HSB統一寫作HSV)

RGB的色彩模型是一個立方體,而HSV的色彩模型一般為圓柱體或圓錐體。詳見下圖:

當然,色彩模式還有很多,諸如:CMYK,ABL等等,本文不多做介紹。

相對於RGB,HSV模式更便於描述人眼對與顏色的感覺。如圖的HSV椎形坐標,橫截面從下往上亮度值V從0%到100%遞增,橫截面的中心(即圓心位置)是灰色的,隨著半徑增大(相對遠離圓心位置),飽和度S從0向100%遞增,色相H取值0°~360°,代表截面上紅、黃、綠、青、藍、紫的顏色變化。

HSV坐標系最頂部的截面最外圈,飽和度和亮度都是100%,隨著色相從0°到360°變化,RGB值的變化如上圖,紅色、綠色、藍色分別位於0°、120°、240°;0°到60°之間綠色分量均勻增加,60°到120°之間紅色分量均勻減少,以此類銀謹推。設置S=V=100%,調整H的值觀察RGB的變換就能發現這個規律。如下圖:

根據上圖可知,不論H處於哪個位置,RGB值中的(r,g,b)三個數值中最大值一定是255,最小值一定是0。

而由此可見,與H相關的,是RGB值中的判搏頃(r,g,b)三個數值中最大的那個值。

在亮度B=100%時,飽和度S降低,即「不飽和度」會升高,會使得RGB與最大值255相差的部分對應增大,RGB三個分量越趨於相同就使得圖像越灰。而這個「不飽和度」可以用1-S來代替。

而RGB三個分量中的單個分量的數值中,經過我在PS中對色相立方體的多次測試觀察,可以推斷。如下圖,當只改變最大值且使它保持最大值時,顏色只會在Y軸縱向偏移,而改變最小值且使它保持最小值,顏色只會在X軸進行橫向偏移。由此可見max是由純色向著黑色進行漸變的,max越小,顏色越暗,min是由純色向著白色進行漸變的,min越大,顏色越亮。

在明度開始下降時,RGB的三個分量,都會開始同時下降,下降遞減的值,是根據分量本身來定的。

根據「概念二」可知,明度相關的是RGB的最大值。

如:rgb(255,255,255)

那麼這個時候的明度是100%。

 R=255/255=100%=1

G=255/255=100%=1

B=255/255=100%=1

如:rgb(126,24,99)

那麼這個時候的明度是49%。

R=126/255=49=0.49

G=25/255=10=0.1

B=99/255=39=0.39

以PS的色相立方體為模型,H從最底下0°開始上升,到360°=0°,除去0°和360°兩個頂點同為紅色外,60°黃色,120°綠色,180°青色,240°藍色,300°紫色。

以這七個位置作為原點,向右是正向偏移,即f,向左是反向偏移,即1-f。

正掘陸向偏移取的是這六個區間內的左邊的值,反向偏移取的是這六個區間右邊的值。

如:130°,相對120°的綠色,正向偏移了10°,相對180°的青色反向偏移了50°

而這個時候的綠色為255,藍色從左自右逐漸遞增,紅色始終為0。

由此可見正向偏移得到的是最大值max,反向偏移得到的是中間值med。

在確定H的值之前,需要知道H代表的是什麼,以及H和RGB之間的關系。

根據上文提到,H代表的是色相,以及「概念一」中提到的可以得知:

h1=[H/60] mod6 

詳解:h1等於H除以60,取整數部分,然後除以六,求出余數。

H/60的整數部分除以六,求出余數。是確定H在的顏色區域。而H/60的小數部分,即為在這個顏色范圍中偏移的值。

如果h1=0,那麼顏色在0°-60°區域

如果h1=1,那麼顏色在60°-120°區域

如果h1=2,那麼顏色在120°-180°區域

如果h1=3,那麼顏色在180°-240°區域

如果h1=4,那麼顏色在240°-300°區域

如果h1=5,那麼顏色在300°-359°區域

f=H/60-h1

詳解:這里變數f求的是顏色在色相環中對應區域的偏移值。已知 [H/60] 是確定區域作用,

根據上文提到,H/60的小數部分是求顏色范圍的偏移值

,那麼h/60-[h/60]=H/60-h1就是求出求出這個偏移值。

p=   V*(1-S)

詳解:這里變數p求的是實際RGB中的最小值,即min。

根據「概念二」得知,1-S求的是不飽和度,則1-S求的是飽和度最低的值,也就是RGB中三個分量中與255相差大的值。這個值乘以明度,即是RGB三個分量中最小的那個值。

q=   V*(1-f*s)

詳解:這里變數q求的是實際RGB中的最大值,即max。

根據「概念一」可以得知,與最大值相關的,就是H,f是h在指定色相區域內的偏移角度,f*s是RGB三個分量中最大的那個值的飽和度,1-f*s得到的就是最大值不飽和度,再乘以明度即是RGB三個分量中最大的那個值。

t=V*(1-(1-f)*s)

詳解:這里變數q求的是實際RGB中的中間值,即med。

根據「概念一」可以得知,與最大值相關的,就是H,f是h在指定色相區域內的偏移角度,而根據「概念4」可以得知,1-f就是反向偏移,反向偏移求的就是中間值,(1-f)*s就是反向偏移的中間值乘以飽和度。(1-(1-f)*s)就是反向偏移的中間值的不飽和度,最後再把明度乘進去,V*(1-(1-f)*s),求的就是RGB的中間值。

當把max,med,min,三個對應RGB中分量的值求出來之後,開始判斷條件,分別代入。

根據上面的式子,我們可以知道,判斷H位置的變數是h1,

結合「概念一」中提到的,紅色、綠色、藍色分別位於0°、120°、240°;0°到60°之間綠色分量均勻增加,60°到120°之間紅色分量均勻減少,等等。以及表格的內容。

那麼就可以將max,med,min,找到對應的位置,填入RGB的三個分量中去。

這里不作詳細解釋,上面圖片里的式子寫的很清楚,自行理解。

以下是查閱(參考資料1)獲得的RGB轉HSV演算法公式,其中求V的演算法是錯誤的。

因為(參考資料1)中沒有說明演算法中的max及min的相關說明。所以我在這里困惑了很久。

通過推導(參考資料2)的過程,可以得知,max和man分別代表的是兩個變數,這兩個變數取自RGB值中的(r,g,b)三個數值中的最大值及最小值。

那麼演算法代表的意義就明確起來。

undefined     if max=min     

詳解:當最大值等於最小值時,h可以為任意值,不會影響實際展示出來的顏色。因為RGB值中的(r,g,b)三個數值都相等。如果RGB的三個數值相等,那麼色彩的范圍在色彩模型中就是圓心的位置,即為黑白灰,與色相H無關。

60°*(g-b)/(max-min)+0°        if max =r and g>=b     

詳解:根據上面總結的規律可以得知如果最大值為r,那麼H的取值范圍就是300°-360°或0°-60°,且如果要滿足g大於等於b,假設g=b,那麼g和b只能為0。當g>b時,H的取值范圍就變為0°-60°,且角度一定是R向G進行偏移,這個時候只需要計算R向著G的偏移度數,即可求出H的值。 g-b為差值,max-min是差值分量,(g-b)/(max-min)是求偏移分量,60*(g-b)/(max-min)是求在這個取色范圍中偏移度數。60*(g-b)/(max-min)+0°是求所在色彩區域距離0°的差值,需要加上。

60°*(g-b)/(max-min)+360°        if max =r and b>g  

詳解:此處是求R值的第二種情況,最大值為r,那麼H的取值范圍就是300°-360°或0°-60°,且如果要滿足b大於g,當g>b時,H的取值范圍就變為300°-360°,且角度一定是B向R進行偏移,這個時候只需要計算B向著R的偏移度數,即可求出H的值。 g-b為差值,max-min是差值分量,(g-b)/(max-min)是求偏移分量,60*(g-b)/(max-min)是求在這個取色范圍中偏移度數。60*(g-b)/(max-min)+360°是求所在色彩區域距離0°的差值,需要加上。

60°*(b-r)/(max-min)+120°        if max =g 

詳解:根據上面總結的規律可以得知如果最大值為g,那麼H的取值范圍就是60°-240°。 b-r為差值,max-min是差值分量,(b-r)/(max-min)是求偏移分量,60*(b-r)/(max-min)是求在這個取色范圍中偏移度數,可以為負數,正數代表G向著B偏移,負數代表G向著R偏移。60*(g-b)/(max-min)+120°是求所在色彩區域距離0°的差值,需要加上。

60°*(r-g)/(max-min)+240°        if max =b

詳解:根據上面總結的規律可以得知如果最大值為b,那麼H的取值范圍就是120-300°。 r-g為差值,max-min是差值分量,(r-g)/(max-min)是求偏移分量,60*(r-g)/(max-min)是求在這個取色范圍中偏移度數,可以為負數,正數代表B向著R偏移,負數代表B向著G偏移。60*(r-g)/(max-min)+240°是求所在色彩區域距離0°的差值,需要加上。

0            if max = 0

詳解:當RGB中的最大值都為0,那麼其他兩個值,也一定為0,此時的顏色為黑色。無飽和度,所以飽和度也為0。

(max-min)/max

詳解:這里max代表的是顏色的飽和度最高值,min代表的是顏色飽和度的最低值,因為max與RGB分量的最大值255更為接近,而min與RGB分量的最小值0更為接近。

這里將max作為這個RGB值分量的最大值,即飽和度的最高值,那麼min就代表的是不飽和度,將飽和度的最大值減去不飽和度,得到的即是飽和度的數值。然後將飽和度的數值除以RGB中的最大分量max,得到的百分比,即使飽和度S的值。

上面公式圖的V的演算法應該是錯誤的,

實際應該是:V=max/255

詳解:根據「概念三」可以得知,與明度相關的值只有max,所以直接用max除以RGB顏色值的最大分量,得到的百分比,即是明度。

完。(以上內容不保證完全正確,僅供參考)

閱讀全文

與hsv空間亮度調節演算法相關的資料

熱點內容
哪裡app可以上高中生物課 瀏覽:472
cad粗糙度快捷鍵命令大全 瀏覽:521
騰訊雲伺服器無法運行軟體 瀏覽:342
奔跑吧哪個app 瀏覽:97
哪個app聽音樂最好 瀏覽:281
考研英語2真題pdf 瀏覽:699
煙台編程積木教育環境好不好 瀏覽:214
python優秀代碼 瀏覽:620
androidtop命令 瀏覽:455
你平時怎麼排解壓力 瀏覽:68
表格中的文件夾怎樣設置 瀏覽:476
em78單片機 瀏覽:960
splitjava空格 瀏覽:248
電腦怎麼谷歌伺服器地址 瀏覽:515
nx自定義工具啟動宏命令 瀏覽:101
程序員怎麼解決無法訪問互聯網 瀏覽:303
java訪問本地文件 瀏覽:747
瓦斯琪伺服器怎麼用 瀏覽:22
安卓主題用什麼app 瀏覽:747
修改伺服器pci地址空間 瀏覽:321