https://www.cnblogs.com/wang726zq/p/3660581.html
RGB三原色是基於人肉眼對光線的生理做用。人眼內有三種椎狀體「對這三種光線頻率所能感覺的帶寬最大,也能獨立刺激這三種顏色的受光體」,所以RGB稱爲三原色。好比,黃色波長的光對人眼的刺激效果,和紅色與綠色同時刺激人眼相同,因此,對人來講R+G=yellow,即(255,255,0).
相對於RGB,HSB(也叫HSV)模式更便於描述人眼對與顏色的感受。如圖的HSB椎形座標,橫截面從下往上亮度值從0%到100%遞增;橫截面的中心點是灰色的,隨着半徑增大,飽和度從0增大到100%;色相取值0°~360°,表明截面上紅、黃、綠、青、藍、粉紅的顏色變化。
HSB座標系最頂部的截面最外圈,飽和度和亮度都是100%,隨着色相從0°到360°變化,RGB值的變化如上圖,紅色、綠色、藍色分別位於0°、120°、240°;0°到60°之間綠色份量均勻增長,60°到120°之間紅色份量均勻減小,以此類推。將
這個演示中的S和B調到100%,調整H的值觀察RGB的變換就能發現這個規律。這時RGB中最大值必定是255(由於亮度爲100%),最小值必定是0(若是不是,好比RGB=(10,20,255),能夠當作在(0,10,255)份量的基礎上加上一個灰色份量(10,10,10),加灰色後飽和度就不是100%了)。
HSB轉RGB
要算出(h,s,b)對應的(r,g,b),能夠分3步,以HSB=(130°,50%,80%)爲例說明:
一、先算出(h,100%,100%)對應的(r',g',b')。
先固定色相,色環圖上色相H∈[-60°,60°]時紅色份量最大,H∈[60°,180°]時綠色份量最大,H∈[180°,300°]時藍色份量最大,此時B=100%,因此RGB的最大份量爲255。
先算出HSB=(130°,100%,100%)對應的(r',g',b'):H=130°,在[60°,180°]區間,因此綠色份量爲g'=255,紅色份量r'=0;進一步地,130°處於[120°,180°],在這60°的區間上,色環上藍色份量對應地從0遞增到255,因此b'=(130°-120°)/60°*255=43。因此(r',g',b')=(0,255,43)
二、固定色相後再調整飽和度,算出(h,s,100%)對應的(r'',g'',b'')。
在亮度B=100%時,從
演示中發現,飽和度S下降,即「不飽和度」(1-S)升高,會使得RGB與最大值255相差的部分對應增大,RGB三個份量越趨於相同就使得圖像越灰。因此,
r''=r'+(255-r')*(1-S) .................................... ①
g''和b''用一樣的方法求出。固然,r'g'b'中的最大值不會變化。(r'',g'',b'')=(128,255,149)
三、最後算出(h,s,b)對應的(r,g,b)。
最後調整亮度,只要依照亮度值的百分比縮小就好了,(r,g,b)=(r'',g'',b'')*80%=(102,204,119)就是HSB=(130°,50%,80%)對應的RGB
View Code
RGB轉HSB
這個從HSB轉RGB倒推回去就會很容易知道亮度和飽和度的算法
亮度:B=max(R,G,B)/255
飽和度:1-S=min(R,G,B)/255,因此飽和度S=1-min(R,G,B)/255
色相:先算出(r,g,b)對應的飽和度和亮度均爲100%時的(r',g',b'),而後既能夠根據色環的規律求出色相了。
r'、g'、b'的序號用0、一、2表示,max、min、mid分別是r'g'b'中最大值、最小值和中間值;設maxIndex、minIndex、midIndex分別是r'g'b'中最大值、最小值和中間值的序號。首先將色相h定位到(maxIndex*120°)而後根據中間值算出偏移量(mid/255*60°),既
h=(maxIndex*120°)±(mid/255*60°)....................................②
關於②中的±號的肯定方法:將當0、一、2順時針寫成一圈,當midIndex在maxIndex的順時針方向(既minIndex在maxIndex的逆時針方向)時取正,不然取負,緣由看色環就能知道。因此±號能夠用(maxIndex-minIndex+3)%3是否等於1來判斷,是取正,不然取負。②式能夠改寫成:
h=(maxIndex*120°)+((maxIndex-minIndex+3)%3==1?1:-1)*(mid/255*60°)....................................③
以(r,g,b)=(102,204,85)爲例,前兩步已求出亮度爲80%,飽和度爲50%。當亮度和飽和度均爲100%而色相不變時,最大值g'必定是255;最小值r'必定是0;中間值b'按照上面HSB轉RGB的後兩步反推回去,先得出亮度爲100%時b''=102/80%=128,再由①式得出飽和度爲100%時b'=43。
由於g'=255最大,先定位到色環上的120°的位置,由於藍色份量不爲0,因此要從120°順時針偏移b'/255*60°=10°,即H=130°
View Code