RGB和HSB的转换推算

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
相关文章
相关标签/搜索