颜色空间

摘要:
颜色空间来自:http://blog.csdn.net/juyingmin/article/details/5689591(注意:已经进行了一些改进)1.CMY/CMYK颜色空间青色、洋红、黄色(CMY)颜色模型是彩色图像打印行业使用的颜色空间。在色块中,它们是红、绿、蓝的互补色,称为减色基,红、绿和蓝称为加色基。在CMY模型中,从白光中减去颜色

颜色空间

摘自:http://blog.csdn.net/juyingmin/article/details/5689591  (注:做了一些完善工作)

1,CMY/CMYK颜色空间   

     青、品红、黄(CMY)(Cyan、Magenta、Yellow)彩色模型是彩色图象印刷行业使用的彩色空间,在彩色立方体中它们是红、绿、蓝的补色,称为减色基,而红、绿、蓝称为加色基。在CMY模型中,颜色是从白光中减去一定成分得到的。CMY坐标可以从RGB模型中得到:

                  C = 1 – R

                  M = 1 – G

                  Y = 1 – B  

  由于在印刷时CMY模型不可能产生真正的黑色,因此在印刷业中实际上使用的是CMYK彩色模型,K为第四种颜色,表示黑色(black ink):从CMY 到CMYK的转换:

              K := min(C,M,Y)

              C := C – K

              M := M – K

              Y := Y - K

  1. //RGB转换为CMY  
  2. void rtRGB2CMY(RtScalar rgb, RtScalar& cmy)  
  3. {  
  4.     cmy.val[0] = 255 - rgb.val[0];  
  5.     cmy.val[1] = 255 - rgb.val[1];  
  6.     cmy.val[2] = 255 - rgb.val[2];  
  7. }  
  8.   
  9. //CMY转换为RGB  
  10. void rtCMY2RGB(RtScalar cmy, RtScalar& rgb)  
  11. {  
  12.     rgb.val[0] = 255 - cmy.val[0];  
  13.     rgb.val[1] = 255 - cmy.val[1];  
  14.     rgb.val[2] = 255 - cmy.val[2];  
  15. }  
  16.   
  17. //CMY转换为CMYK  
  18. void rtCMY2CMYK(RtScalar cmy, RtScalar& cmyk)  
  19. {  
  20.     unsigned char temp = 0;  
  21.       
  22.     temp = min(min(cmy.val[0], cmy.val[1]), cmy.val[2]);  
  23.   
  24.     if (temp == 255 )  
  25.     {   
  26.         cmyk = rtScalar(0, 0, 0, 0);  
  27.     }  
  28.     else   
  29.     {  
  30.         cmyk.val[0] = cmy.val[0] - temp;  
  31.         cmyk.val[1] = cmy.val[1] - temp;  
  32.         cmyk.val[2] = cmy.val[2] - temp;  
  33.     }  
  34.     cmyk.val[3] = temp;  
  35. }  
  36.   
  37. //CMYK转换为CMY  
  38. void rtCMYK2CMY(RtScalar cmyk, RtScalar& cmy)  
  39. {  
  40.     cmy.val[0] = cmyk.val[0] + cmyk.val[3];  
  41.     cmy.val[1] = cmyk.val[1] + cmyk.val[3];  
  42.     cmy.val[2] = cmyk.val[2] + cmyk.val[3];  
  43. }  

2,HSI颜色空间

      HSI色彩空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中 方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析 和处理的工作量。HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着 转换关系。

HSI 色彩模型是从人的视觉系统出发,用 H 代表色相 (Hue)、S 代表饱和度 (Saturation) 和 I 代表亮度 (Intensity) 来描述色彩。饱和度与颜色的白光光量刚好成反比,它可以说是一个颜色鲜明与否的指标。因此如果我们在显示器上使用 HIS 模型来处理图像,将能得到较为逼真的效果。 
色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。 
饱和度 (Saturation):又称色度,是指色彩的强度或纯度。饱和度代表灰色与色调的比例,并以 0% (灰色) 到 100% (完全饱和) 来衡量。 
亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。

颜色空间第1张

颜色空间第2张

  1. //RGB转换为HSI  
  2. void rtRGB2HSI(RtScalar rgb, RtScalar& hsi)  
  3. {  
  4.     double maxv = 0, minv = 0, angle = 0;  
  5.     RtScalar temp;  
  6.   
  7.     temp.val[0] = rgb.val[0] / 255.0;  
  8.     temp.val[1] = rgb.val[1] / 255.0;  
  9.     temp.val[2] = rgb.val[2] / 255.0;  
  10.   
  11.     maxv = max(max(temp.val[0], temp.val[1]), temp.val[2]);  
  12.     minv = min(min(temp.val[0], temp.val[1]), temp.val[2]);  
  13.   
  14.     hsi.val[2] = (temp.val[0] + temp.val[1] + temp.val[2]) / 3.0;  
  15.     hsi.val[1] = 1.0 - minv/hsi.val[2];  
  16.   
  17.     angle = (temp.val[0] + temp.val[0] - temp.val[1] - temp.val[2]) / 2.0 * sqrt((temp.val[0] - temp.val[1])*(temp.val[0] - temp.val[1]) + (temp.val[0] - temp.val[2])*(temp.val[1] - temp.val[2]));  
  18.   
  19.     if (temp.val[2] <= temp.val[1])  
  20.         hsi.val[0] = angle / PI * 180.0;  
  21.     else  
  22.         hsi.val[0] = (2 * PI - angle)/PI * 180.0;  
  23. }  
  24.   
  25. //HSI转换为RGB  
  26. void rtHSI2RGB(RtScalar hsi, RtScalar& rgb)  
  27. {  
  28.     int flag = 0;  
  29.     double t1 = 0, t2 = 0, tv1 = 0, tv2 = 0, tv3 = 0;  
  30.     RtScalar temp;  
  31.     temp = hsi;  
  32.     temp.val[0] = hsi.val[0] * PI / 180.0;  
  33.   
  34.     t1 = 2.0 * PI / 3.0;  
  35.     t2 = 2.0 * t1;  
  36.   
  37.     if (temp.val[0] >= t1 && temp.val[0] < t2)  
  38.     {  
  39.         flag = 1;  
  40.         temp.val[0] -= t1;  
  41.     }  
  42.     if (temp.val[0] >= t2)  
  43.     {  
  44.         flag = 2;  
  45.         temp.val[0] -= t2;  
  46.     }  
  47.   
  48.     tv1 = (temp.val[2] * (1 - temp.val[1])) * 255.0;  
  49.     tv2 = (temp.val[2] * (1 + temp.val[1] * cos(temp.val[0]) / cos(PI / 3 - temp.val[0]))) * 255.0;  
  50.     tv3 = (3.0 * temp.val[2] - tv1 - tv2) * 255.0;  
  51.       
  52.     switch (flag)  
  53.     {  
  54.     case 0:  
  55.         rgb = rtScalar(tv2, tv3, tv1, 0);  
  56.         break;  
  57.     case 1:  
  58.         rgb = rtScalar(tv1, tv2, tv3, 0);  
  59.         break;  
  60.     case 2:  
  61.         rgb = rtScalar(tv3, tv1, tv2, 0);  
  62.         break;  
  63.     }  
  64. }  

3,YUV颜色空间 
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y、B-Y, 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。 采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。根据美国国家电视制式委员会,NTSC制式的标准,当白光的 亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行 相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。

YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

  1. // RGB转换为YUV  
  2. void rtRGB2YUV(RtScalar rgb, RtScalar& yuv)  
  3. {      
  4.     yuv.val[0] = 0.299*rgb.val[0] + 0.587*rgb.val[1] + 0.114*rgb.val[2]; // y  
  5.     yuv.val[1] = -0.147*rgb.val[0] - 0.289*rgb.val[1]+ 0.436*rgb.val[2]; // u  
  6.     yuv.val[2] = 0.615*rgb.val[0] - 0.515*rgb.val[1] - 0.1*rgb.val[2]; // v  
  7. }  
  8.   
  9. // YUV转换为RGB  
  10. void rtYUV2RGB(RtScalar yuv, RtScalar& rgb)  
  11. {  
  12.     rgb.val[0] = yuv.val[0] + 1.14*yuv.val[2]; // r  
  13.     rgb.val[1] = yuv.val[0] - 0.39*yuv.val[1] - 0.58*yuv.val[2];   
  14.     rgb.val[2] = yuv.val[0] + 2.03*yuv.val[1];   
  15. }  

4,XYZ颜色空间 
     国际照明委员会(CIE)在进行了大量正常人视觉测量和统计,1931年建立了"标准色度观察者", 从而奠定了现代CIE标准色度学的定量基础。由于"标准色度观察者"用来标定光谱色时出现负刺激值,计算不便,也不易理解,因此1931年CIE在RGB 系统基础上,改用三个假想的原色X、Y、 Z建立了一个新的色度系统。将它匹配等能光谱的三刺激值,定名为"CIE1931 标准色度观察者 光谱三刺激值",简称为"CIE1931标准色度观察者"。这一系统叫做"CIE1931标准色度系统"或称为" 2° 视场XYZ色度系统"。CIEXYZ颜色空间稍加变换就可得到Yxy色彩空间,其中Y取三刺激值中Y的值,表示亮度,x、y反映颜色的色度特性。定义如下:在色彩管理中,选择与设备无关的颜色空间是 十分重要的,与设备无关的颜色空间由国际照明委员会(CIE)制定,包括CIEXYZ和CIELAB两个标准。它们包含了人眼所能辨别的全部颜色。而且,CIEYxy测色制的建立给定量的确定颜色创造了条件。但是,在这一空间中,两种不同颜色之间的距离值并不能正确地反映人们色彩感觉差别的大小, 也就是说在CIEYxy色厦图中,在 不同的位置不同方向上颜色的宽容量是不同的,这就是Yxy颜色空间的不均匀性。这一缺陷的存在,使得在Yxy及XYZ空间不能直观地评价颜色。

Some Common RGB Working Space Matrices

     Using the chromaticities and reference whites of common RGB working spaces, I have done the math for you to compute the RGB-to-XYZ and XYZ-to-RGB matrices. Note that these matrices are given relative to their own reference whites. If you examine the matrices for these working spaces found inside ICC profiles (through the redColorantTaggreenColorantTag and blueColorantTag), those matrices will always be relative to D50, and therefore, the colorants have been subjected to achromatic adaptation transformation if the working space reference white is not also D50.

RGB Working SpaceReference WhiteRGB to XYZ [M]XYZ to RGB [M]-1
Adobe RGB (1998)D65
0.5767309 0.1855540 0.1881852 0.2973769 0.6273491 0.0752741 0.0270343 0.0706872 0.9911085
2.0413690 -0.5649464 -0.3446944 -0.9692660 1.8760108 0.0415560 0.0134474 -0.1183897 1.0154096
AppleRGBD65
0.4497288 0.3162486 0.1844926 0.2446525 0.6720283 0.0833192 0.0251848 0.1411824 0.9224628
2.9515373 -1.2894116 -0.4738445 -1.0851093 1.9908566 0.0372026 0.0854934 -0.2694964 1.0912975
Best RGBD50
0.6326696 0.2045558 0.1269946 0.2284569 0.7373523 0.0341908 0.0000000 0.0095142 0.8156958
1.7552599 -0.4836786 -0.2530000 -0.5441336 1.5068789 0.0215528 0.0063467 -0.0175761 1.2256959
Beta RGBD50
0.6712537 0.1745834 0.1183829 0.3032726 0.6637861 0.0329413 0.0000000 0.0407010 0.7845090
1.6832270 -0.4282363 -0.2360185 -0.7710229 1.7065571 0.0446900 0.0400013 -0.0885376 1.2723640
Bruce RGBD65
0.4674162 0.2944512 0.1886026 0.2410115 0.6835475 0.0754410 0.0219101 0.0736128 0.9933071
2.7454669 -1.1358136 -0.4350269 -0.9692660 1.8760108 0.0415560 0.0112723 -0.1139754 1.0132541
CIE RGBE
0.4887180 0.3106803 0.2006017 0.1762044 0.8129847 0.0108109 0.0000000 0.0102048 0.9897952
2.3706743 -0.9000405 -0.4706338 -0.5138850 1.4253036 0.0885814 0.0052982 -0.0146949 1.0093968
ColorMatch RGBD50
0.5093439 0.3209071 0.1339691 0.2748840 0.6581315 0.0669845 0.0242545 0.1087821 0.6921735
2.6422874 -1.2234270 -0.3930143 -1.1119763 2.0590183 0.0159614 0.0821699 -0.2807254 1.4559877
Don RGB 4D50
0.6457711 0.1933511 0.1250978 0.2783496 0.6879702 0.0336802 0.0037113 0.0179861 0.8035125
1.7603902 -0.4881198 -0.2536126 -0.7126288 1.6527432 0.0416715 0.0078207 -0.0347411 1.2447743
ECI RGBD50
0.6502043 0.1780774 0.1359384 0.3202499 0.6020711 0.0776791 -0.0000000 0.0678390 0.7573710
1.7827618 -0.4969847 -0.2690101 -0.9593623 1.9477962 -0.0275807 0.0859317 -0.1744674 1.3228273
Ekta Space PS5D50
0.5938914 0.2729801 0.0973485 0.2606286 0.7349465 0.0044249 0.0000000 0.0419969 0.7832131
2.0043819 -0.7304844 -0.2450052 -0.7110285 1.6202126 0.0792227 0.0381263 -0.0868780 1.2725438
NTSC RGBC
0.6068909 0.1735011 0.2003480 0.2989164 0.5865990 0.1144845 -0.0000000 0.0660957 1.1162243
1.9099961 -0.5324542 -0.2882091 -0.9846663 1.9991710 -0.0283082 0.0583056 -0.1183781 0.8975535
PAL/SECAM RGBD65
0.4306190 0.3415419 0.1783091 0.2220379 0.7066384 0.0713236 0.0201853 0.1295504 0.9390944
3.0628971 -1.3931791 -0.4757517 -0.9692660 1.8760108 0.0415560 0.0678775 -0.2288548 1.0693490
ProPhoto RGBD50
0.7976749 0.1351917 0.0313534 0.2880402 0.7118741 0.0000857 0.0000000 0.0000000 0.8252100
1.3459433 -0.2556075 -0.0511118 -0.5445989 1.5081673 0.0205351 0.0000000 0.0000000 1.2118128
SMPTE-C RGBD65
0.3935891 0.3652497 0.1916313 0.2124132 0.7010437 0.0865432 0.0187423 0.1119313 0.9581563
3.5053960 -1.7394894 -0.5439640 -1.0690722 1.9778245 0.0351722 0.0563200 -0.1970226 1.0502026
sRGBD65
0.4124564 0.3575761 0.1804375 0.2126729 0.7151522 0.0721750 0.0193339 0.1191920 0.9503041
3.2404542 -1.5371385 -0.4985314 -0.9692660 1.8760108 0.0415560 0.0556434 -0.2040259 1.0572252
Wide Gamut RGBD50
0.7161046 0.1009296 0.1471858 0.2581874 0.7249378 0.0168748 0.0000000 0.0517813 0.7734287
1.4628067 -0.1840623 -0.2743606 -0.5217933 1.4472381 0.0677227 0.0349342 -0.0968930 1.2884099

For those RGB working spaces that are not natively D50, the Bradford-adapted, D50 matrices are:

RGB Working SpaceReference WhiteRGB to XYZ [M]XYZ to RGB [M]-1
Adobe RGB (1998)D50
0.6097559 0.2052401 0.1492240 0.3111242 0.6256560 0.0632197 0.0194811 0.0608902 0.7448387
1.9624274 -0.6105343 -0.3413404 -0.9787684 1.9161415 0.0334540 0.0286869 -0.1406752 1.3487655
AppleRGBD50
0.4755678 0.3396722 0.1489800 0.2551812 0.6725693 0.0722496 0.0184697 0.1133771 0.6933632
2.8510695 -1.3605261 -0.4708281 -1.0927680 2.0348871 0.0227598 0.1027403 -0.2964984 1.4510659
Bruce RGBD50
0.4941816 0.3204834 0.1495550 0.2521531 0.6844869 0.0633600 0.0157886 0.0629304 0.7464909
2.6502856 -1.2014485 -0.4289936 -0.9787684 1.9161415 0.0334540 0.0264570 -0.1361227 1.3458542
CIE RGBD50
0.4868870 0.3062984 0.1710347 0.1746583 0.8247541 0.0005877 -0.0012563 0.0169832 0.8094831
2.3638081 -0.8676030 -0.4988161 -0.5005940 1.3962369 0.1047562 0.0141712 -0.0306400 1.2323842
NTSC RGBD50
0.6343706 0.1852204 0.1446290 0.3109496 0.5915984 0.0974520 -0.0011817 0.0555518 0.7708399
1.8464881 -0.5521299 -0.2766458 -0.9826630 2.0044755 -0.0690396 0.0736477 -0.1453020 1.3018376
PAL/SECAM RGBD50
0.4552773 0.3675500 0.1413926 0.2323025 0.7077956 0.0599019 0.0145457 0.1049154 0.7057489
2.9603944 -1.4678519 -0.4685105 -0.9787684 1.9161415 0.0334540 0.0844874 -0.2545973 1.4216174
SMPTE-C RGBD50
0.4163290 0.3931464 0.1547446 0.2216999 0.7032549 0.0750452 0.0136576 0.0913604 0.7201920
3.3921940 -1.8264027 -0.5385522 -1.0770996 2.0213975 0.0207989 0.0723073 -0.2217902 1.3960932
sRGBD50
0.4360747 0.3850649 0.1430804 0.2225045 0.7168786 0.0606169 0.0139322 0.0971045 0.7141733
3.1338561 -1.6168667 -0.4906146 -0.9787684 1.9161415 0.0334540 0.0719453 -0.2289914 1.4052427
  1. //RGB转换为XYZ  
  2. void rtRGB2XYZ(RtScalar rgb, RtScalar& xyz)  
  3. {  
  4.     //Observer. = 2°,Illuminant = D65     
  5.     xyz.val[0] = 0.4124564 * rgb.val[0] + 0.3575761 * rgb.val[1] + 0.1804375 * rgb.val[2];  
  6.     xyz.val[1] = 0.2126729 * rgb.val[0] + 0.7151522 * rgb.val[1] + 0.0721750 * rgb.val[2];  
  7.     xyz.val[2] = 0.0193339 * rgb.val[0] + 0.1191920 * rgb.val[1] + 0.9503041 * rgb.val[2];  
  8. }  
  9.   
  10. //XYZ转换为RGB  
  11. void rtXYZ2RGB(RtScalar xyz, RtScalar& rgb)  
  12. {  
  13.      rgb.val[0] = 3.2404542 * xyz.val[0] + -1.5371385 * xyz.val[1] + -0.4985314 * xyz.val[2];  
  14.      rgb.val[1] = -0.9692660 * xyz.val[0] + 1.8760108 * xyz.val[1] + 0.0415560 * xyz.val[2];  
  15.      rgb.val[2] = 0.0556434 * xyz.val[0] + x-0.2040259 * xyz.val[1] + 1.0572252 * xyz.val[2];  
  16. }  

5,Lab 颜色空间
      CIE L*a*b* (CIELAB) 是惯常用来描述人眼可见的所有颜色的最完备的色彩模型。它是为这个特殊目的而由国际照明委员会(Commission Internationale d'Eclairage 的首字母是 CIE)提出的。L、a 和 b 后面的星号(*)是全名的一部分,因为它们表示 L*, a* 和 b*,不同于 L, a 和 b。因为红/绿和黄/蓝对立通道被计算为(假定的)锥状细胞响应的类似孟塞尔值的变换的差异,CIELAB 是 Adams 色彩值(Chromatic Value)空间。

      三个基本坐标表示颜色的亮度(L*, L* = 0 生成黑色而 L* = 100 指示白色),它在红色/品红色和绿色之间的位置(a* 负值指示绿色而正值指示品红)和它在黄色和蓝色之间的位置(b* 负值指示蓝色而正值指示黄色)。

      已经建立的 L*a*b* 色彩模型来充当用做参照的设备无关的模型。要认识到永远不能精确的在视觉上表示这个模型中颜色的完全色域是至关重要的。它们只是用来帮助理解概念而天生就不精确的,因为 L*a*b* 模型是三维模型,它只能在三维空间中完全表现出来。“L*a*b*”模型也被表达为“L*C*h(a*, b*)”,它把 a* 和 b* 变换为辐射表示。

      XYZ 与 CIE L*a*b* (CIELAB) 的转换:

颜色空间第3张

颜色空间第4张

  1. double _rtLabFun(double val)  
  2. {  
  3.     if (val > 0.008856)  
  4.         return val/3.0  
  5.     else  
  6.         return 7.787 * val + 16.0/116.0  
  7. }  
  8. //XYZ转换为LAB  
  9. void rtXYZ2LAB(RtScalar xyz, RtScalar& lab)  
  10. {  
  11.     RtScalar temp;  
  12.     temp = RtScalar(xyz.val[0]/255.0, xyz.val[1]/255.0, xyz.val[2]/255.0, 0);  
  13.     if (temp.val[1] > 0.008856)  
  14.     {  
  15.         lab.val[0] = 116.0 * temp.val[1] / 3;  
  16.     }  
  17.     else  
  18.     {  
  19.         lab.val[0] = 903.3 * temp.val[1];  
  20.     }  
  21.   
  22.     lab.val[1] = 500.0*(_rtLabFun(temp.val[0]) - _rtLabFun(temp.val[1]));  
  23.     lab.val[2] = 200.0*(_rtLabFun(temp.val[1]) - _rtLabFun(temp.val[2]));  
  24. }  
  25.   
  26. //LAB转换为XYZ  
  27. void rtLAB2XYZ(RtScalar lab, RtScalar& xyz)  
  28. {  
  29.     RtScalar temp;  
  30.     temp.val[0] = 3 * lab.val[0] / 116.0;  
  31.     temp.val[1] = lab.val[1]/500.0 + temp.val[0];  
  32.     temp.val[2] = temp.val[0] - lab.val[2] / 200.0;  
  33.       
  34.     if ( temp.val[0] > 0.008856 )   
  35.         temp.val[0] = temp.val[0] * 3;  
  36.     else                        
  37.         temp.val[0] = (temp.val[0] - 16.0/116.0) / 7.787;  
  38.   
  39.     if ( temp.val[1] > 0.008856 )   
  40.         temp.val[1] = temp.val[1] * 3;  
  41.     else           
  42.         temp.val[1] = (temp.val[1] - 16.0/116.0) / 7.787;  
  43.     if ( temp.val[2] > 0.008856 )   
  44.         temp.val[2] = temp.val[2] * 3;  
  45.     else                        
  46.         temp.val[2]= ( temp.val[2] - 16.0/116.0) / 7.787;  
  47.       
  48.     xyz = rtScalar(temp.val[0]*255.0, temp.val[1]*255.0, temp.val[2]*255.0, 0);  
  49. }  

6,HSL 或 HSV 的转换

       HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个 模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。

     形式定义设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:

颜色空间第5张

h 的值通常规范化到位于 0  360°之间。而 h = 0 用于 max = min 的(就是灰色)时候而不是留下 h 未定义。
HSL  HSV 有同样的色相定义,但是其他分量不同。HSV 颜色的 s 和 v 的值定义如下:

颜色空间第6张

从 HSL 到 RGB 的转换

      给定 HSL 空间中的 (h, s, l) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360)中,分别表示饱和度和亮度的 s 和 l 在值域 [0, 1] 中,相应在 RGB 空间中的 (r, g, b) 三原色,带有分别对应于红色、绿色和蓝色的 r, g 和 b 也在值域 [0, 1] 中,它们可计算为:

     首先,如果 s = 0,则结果的颜色是非彩色的、或灰色的。在这个特殊情况,r, g 和 b 都等于 l。注意 h 的值在这种情况下是未定义的。

当 s ≠ 0 的时候,可以使用下列过程:

颜色空间第7张

从 HSV 到 RGB 的转换
       类似的,给定在 HSV 中 (h, s, v) 值定义的一个颜色,带有如上的 h,和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:

颜色空间第8张

matlab: hsv2rgb函数
作用:从HSV转回RGB.
格式:rgb_image =hsv2rgb(hsv_image)
其中,hsv_image与rgb_image皆为double型的。

  1. // RGB转换为HSV  
  2. void rtRGB2HSV(RtScalar rgb, RtScalar& hsv)  
  3. {     
  4.     double minV = 0,maxV = 0, delMax = 0;  
  5.     minV = min(min(rgb.val[0], rgb.val[1]), rgb.val[2]);  
  6.     maxV = max(max(rgb.val[0], rgb.val[1]), rgb.val[2]);  
  7.     delMax = maxV - minV;//Delta RGB value   
  8.       
  9.   
  10.     if (minV == maxV)  
  11.     {  
  12.         hsv.val[0] = 0;  
  13.     }  
  14.     if (maxV == rgb.val[0] && rgb.val[1] >= rgb.val[2])  
  15.     {  
  16.         hsv.val[0] = (rgb.val[1] - rgb.val[2])/delMax * 60.0;  
  17.     }  
  18.     if (maxV == rgb.val[0] && rgb.val[1] < rgb.val[2])  
  19.     {  
  20.         hsv.val[0] = (rgb.val[1] - rgb.val[2])/delMax * 60.0 + 360;  
  21.     }  
  22.     if (maxV == rgb.val[1])  
  23.     {  
  24.         hsv.val[0] = (rgb.val[2] - rgb.val[0])/delMax * 60.0 + 120;  
  25.     }  
  26.     if (maxV == rgb.val[2])  
  27.     {  
  28.         hsv.val[0] = (rgb.val[0] - rgb.val[1])/delMax * 60.0 + 240;  
  29.     }  
  30.   
  31.     if (maxV == 0)  
  32.         hsv.val[1] = 0;  
  33.     else  
  34.         hsv.val[1] = 1.0 - minV/maxV;  
  35.   
  36.     hsv.val[2] = maxV;  
  37. }  
  38.   
  39. // HSV转换为RGB  
  40. void rtHSV2RGB(RtScalar hsv, RtScalar& rgb)  
  41. {  
  42.     if ( hsv.val[1] == 0 )   
  43.     {  
  44.         rgb = rtScalar(hsv.val[2], hsv.val[2], hsv.val[2], 0);  
  45.     }  
  46.     else  
  47.     {  
  48.         double varh,vari,var1,var2,var3;  
  49.         varh = hsv.val[0] /60.0;  
  50.         vari = int(varh);  
  51.         var1 = hsv.val[0] * (1.0 - hsv.val[1]);  
  52.         var2 = hsv.val[0] * (1.0 - hsv.val[1]* (hsv.val[0] - vari));  
  53.         var3 = hsv.val[0] * (1.0 - hsv.val[1]* (1.0 - (hsv.val[0] - vari)));  
  54.   
  55.         switch (vari)  
  56.         {  
  57.         case 0:  
  58.             rgb = rtScalar(hsv.val[0], var3, var1, 0);  
  59.             break;  
  60.         case 1:  
  61.             rgb = rtScalar(var2, hsv.val[0], var1, 0);  
  62.             break;  
  63.         case 2:  
  64.             rgb = rtScalar(var1, hsv.val[0], var3, 0);  
  65.             break;  
  66.         case 3:  
  67.             rgb = rtScalar(var1, var2, hsv.val[0], 0);  
  68.             break;  
  69.         case 4:  
  70.             rgb = rtScalar(var3, var1, hsv.val[0], 0);  
  71.             break;  
  72.         case 5:  
  73.             rgb = rtScalar(hsv.val[0], var1, var2, 0);  
  74.             break;  
  75.         }  
  76.     }  
  77. }  

7,Ycbcr 颜色空间(来源于维基百科)

模拟 R'G'B' 转换成模拟YPbPr

egin{align}Y' &= & 0.299 cdot R' &+& 0.587 cdot G' &+& 0.114 cdot B'\P_B &= -& 0.168736 cdot R' &-& 0.331264 cdot G' &+& 0.5 cdot B'\P_R &= & 0.5 cdot R' &-& 0.418688 cdot G' &-& 0.081312 cdot B'end{align}

 模拟R'G'B'转换成数字Y′CbCr (每通道8bit采样)如下:

egin{align}Y' &=& 16 &+& ( 65.481 cdot R' &+& 128.553 cdot G' &+& 24.966 cdot B')\C_B &=& 128 &+& (-37.797 cdot R' &-& 74.203 cdot G' &+& 112.0 cdot B')\C_R &=& 128 &+& (112.0 cdot R' &-& 93.786 cdot G' &-& 18.214 cdot B')end{align}

或者简化为

egin{align}Y'C_BC_R &=& ( 16, 128, 128 ) + ( 219, 224, 224 ) cdot Y'P_BP_R\end{align}
结果的信号范围是16~235;其中0~15是footroom,236~255是headroom.

或者, 数字 Y′CbCr从 数字 R'dG'dB'd (每通道采样8bit)的公式为:

egin{align}Y' &=& 16 &+& frac{ 65.738 cdot R'_D}{256} &+& frac{129.057 cdot G'_D}{256} &+& frac{ 25.064 cdot B'_D}{256}\C_B &=& 128 &+& frac{-37.945 cdot R'_D}{256} &-& frac{ 74.494 cdot G'_D}{256} &+& frac{112.439 cdot B'_D}{256}\C_R &=& 128 &+& frac{112.439 cdot R'_D}{256} &-& frac{ 94.154 cdot G'_D}{256} &-& frac{ 18.285 cdot B'_D}{256}end{align}


反向转换的公式是:

egin{align}R'_D &=& frac{298.082 cdot Y'}{256} &&&+& frac{408.583 cdot C_R}{256} &-& 222.921\G'_D &=& frac{298.082 cdot Y'}{256} &-& frac{100.291 cdot C_B}{256} &-& frac{208.120 cdot C_R}{256} &+& 135.576\B'_D &=& frac{298.082 cdot Y'}{256} &+& frac{516.412 cdot C_B}{256} &&&-& 276.836end{align}

或者:

egin{align}R'_D &=& frac{255}{219}cdot(Y'-16) &+&&& frac{255}{112}cdot0.701cdot(C_R-128)\G'_D &=& frac{255}{219}cdot(Y'-16) &-& frac{255}{112}cdot0.886cdotfrac{0.114}{0.587}cdot(C_B-128) &-& frac{255}{112}cdot0.701cdotfrac{0.299}{0.587}cdot(C_R-128)\B'_D &=& frac{255}{219}cdot(Y'-16) &+& frac{255}{112}cdot0.886cdot(C_B-128)end{align}

免责声明:文章转载自《颜色空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Gedit 有用插件介绍WPF中MVVM模式下的按钮事件实现和依赖项通知下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ie浏览器不支持cmyk模式下的JPEG图片

  今天分享一个小小的技巧,就是解决颜色模式为印刷格式CMYK四色模式的JPEG图片上传到服务器上不被支持的问题。  如果你用photo shop打开该图片,细心的人就会发现JPG图像标题栏的图片名称后面紧跟着该图像的颜色模式,如果是RGB的就显示RGB,如果是四色模式CMYK的就显示CMYK。而通常网络上使用的基本都是RGB格式。况且IE6.9-ie8...

Tga图片格式分析以及程序实现

Tga图片格式分析以及程序实现 本文转自本人Blog: Singlerblog.mblogger.cn 继位图之后,我们来看看Tga图片的格式,以及程序实现。   一、  文件格式 Tga常见的格式有非压缩RGB和压缩RGB两种格式,其他格式的我们在这里不做讲述。文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。它们的具体格...

Linux 监控CPU 温度

  安装测试系统: 硬件:普通PC机, 软件:redhat linux as 4  2.6 .9 , 安装系统自带的lm_sensors-2.8.7-2.i386 你也可以从[url]http://www.edgedesign.us/about/lm_sensors[/url]下载 这个软件可以在linux下收集到系统温度。然后我用cacti显示。 由于...

Ubuntu 18.04 程序设置开机自启动

引子 虽然现在docker、k8s大行其道,我们的世界似乎已经被容器主宰,但是有一些程序还是不适合放到docker里面跑,比如node-exporter、自己写的某些程序,但是这些程序又是必须的, 如果每次重启机器都需要自己去启动一次那真的是太累了,所以这些程序需要自启动。 操作步骤 检查系统目录/lib/systemd/system/rc-local.s...

element日期时间段选择器的使用心得

使用时间段 <el-date-picker // control the different select suitation v-if="selectOne == false" v-model="inputDate" unlink-panels type="datera...

SQL 字符串去除空格函数汇总

SQL 中使用ltrim()去除左边空格 ,rtrim()去除右边空格 ,没有同时去除左右空格的函数,要去除所有空格可以用replace(字符串,' ',''),将字符串里的空格替换为空 。 例:去除空格函数。declare @temp char(50)set @temp = ' hello sql 'print ltrim(@temp) --去除左边空...