注:本文为博主参考书籍和他人文章并加上自己的理解所编,作为学习笔记使用并将其分享出去供大家学习。若涉及到引用您的文章内容请评论区告知!如有错误欢迎指正!
这里先推荐一个有趣的网站:各色彩空间
当入射光照射到成像传感器时,来自光谱不同部分的光以某种方式整合为我们在数字图像中看到的离散的红、绿和蓝(RGB)色数值。那么对于不同的两种颜色,是通过什么过程相互作用产生第三种颜色的呢?是波长以某种形式混合起来产生了一个新的波长?正确答案答案与物理上的波长没有任何关系,而是由于实际上三基色(三原色)的存在本身就是由于人类视觉系统的三激励(或三原色)属性的结果,由于有三种不同锥体细胞,各自选择性的对彩色光谱的不同部分有相应。对于机器视觉应用,比如遥感和地形分类,优先选择使用更多的波长。类似的,视觉监控应用也常常可以从近红外(近红外光谱技术(NIR)是一种高效快速的现代分析技术,它综合运用了计算机技术、光谱技术和化学计量学等多个学科的最新研究成果,以其独特的优势在多个领域得到了日益广泛的应用。并已逐渐得到大众的普遍接受和官方的认可。)范围的传感中受益。
色彩的基本知识
颜色的混合
将不同的颜色混合在一起形成另外一种颜色的过程称为颜色混合。颜色可以分为发光色和非发光色,发光色是光源发出的光的颜色,非发光色是由物体表面反射或者透射的光的颜色。由此颜色的混合可以分为发光色混合和非发光色混合。
加法混合
加法混合是指色光的混合。两种以上的光混合在一起,光的亮度会提高,混合色的总量度等于相混合色光亮度之和,故称为加法混合。RGB称为光色三原色,是加法混合的基本色,称为加色基。常见的显示设备如电视机就是利用三基色相加来实现各种颜色的。
减法混合
减法混合主要是指色料的混合。色料是指对不同波长的可见光进行选择性吸收后,呈现各种不同色彩的颜料。色彩混合时白光照射在色料上,光谱的某些部分被吸收,而其他部分被反射或透射,从而表现出某种颜色。每增加一种色料,都要从白光中减去更多的光谱成分,所以色料混合后颜色变暗。纺织、绘画以及彩色印刷等都是利用的减色混合。减色混合的三原色是加法混合三原色的补色即C(青色)、M(品红)、Y(黄色),称为减色基。
色彩拓展
原色
色彩的来源被称为三原色,三原色分别是红色、黄色、蓝色。所有的颜色都是通过三原色的交叉和均匀混合调配出来的。但在屏幕上显示的三原色通常为红色、绿色和蓝色,就是我们通常所说的RGB。
间色
间色又称“二次色”指的是原色基础上任意两种颜色的结合,即红+黄=橙、黄+蓝=绿以及蓝+红=紫,很容易可以得出橙、绿、紫就是间色。
复色
复色又称“三次色”,顾名思义就是色彩的第三次调配,在色彩中通常是原色与间色的结果。复色有橙黄、橙红、黄绿、绿蓝、蓝紫、紫红,复色的色彩变化是非常丰富的,除此之外,复色包括了原色和间色之外的所有颜色。
CIE标准
链接如下:
总结
CIE标准色度学系统是对色彩进行定量描述的基础。CIE RGB系统具有真实的三原色,但系统具有负值;
CIE XYZ消除了负刺激值,其中xy色度图在对色域的描述上有重要的地位,然而系统具有较大的不均匀性;
CIE LAB(CIE L*a*b*)是CIE 推荐的均匀颜色空间,气均匀性已有很大的改善,该系统与设备无关,色度值和明度
值(阶调)可以独立调节,而且当颜色的色差大于视觉的识别阈值(恰可感觉)而又小于孟塞尔系统中相邻两级
的色差时,能较好的反映物体色的心理感受效果。
颜色空间
颜色的匹配涉及到颜色空间(颜色模型)的概念,不同行业的配色需要采用不同的颜色空间。颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光。常见的颜色模型有RGB,CIE,CMY/CMYK,HSI,NTSC,YcbCr,HSV等。
从颜色感知度的角度来分析:
1.混合型颜色空间:按三种基色的比例合成颜色,如RGB、CMY(K)、XYZ等。
2.非线性亮度/色度型颜色空间:用一个分量表示非色彩的感知,用两个独立的分量表示色彩的感知。当需要黑白图像时,这样的系统非常方便,如L*a*b*、L*u*v*、YUV、YIQ等。
3.强度/饱和度/色调型颜色空间:用饱和度和色度(颜色是由亮度和色度共同表示的,色度是不包括亮度在内的颜色的性质,它反映的是颜色的色调和饱和度。)描述色彩的感知,可使颜色的感知更直观,而且对消除光亮度的影响很有用,如HSI、HSL、HSV等。
从技术角度来分析:
1.计算机图形颜色空间:这类模型主要用于电视机和计算机的颜色显示系统。如RGB、HSI、HSL、HSV等。在显示技术和印刷技术中,颜色空间经常被称为颜色模型。“颜色空间”侧重于颜色的表示,而“颜色模型”侧重于颜色的生成。
2.CIE颜色空间:这类颜色空间是由CIE定义的颜色空间,通常作为国际性的颜色空间标准,用作颜色的基本度量方法。CIE定义的颜色空间是与设备无关的颜色表示法,在科学计算中得到广泛应用。对不能直接相互转换的两个颜色空间,可利用这类颜色空间作为过渡性的颜色空间。如XYZ、L*a*b*、L*u*v*等。
3.电视系统颜色空间:由广播电视的需求推动而开发的颜色空间,主要目的是通过压缩色度信息以有效的播送彩色电视图像。如YUV、YIQ、YCbCr等。
注:CIE RGB、CIE XYZ、CIE L*a*b*的更详细解释请阅读上面的CIE标准。
1、RGB&RGBA
RGB:红,绿,蓝
RGBA:红,绿,蓝,透明度
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。
RGB模型是目前常用的一种彩色信息表达方式,它使用红,绿,蓝三原色的亮度来定量表示颜色,通常用于显示器等发光体的显示。在RGB颜色空间上,当三种基色的亮度值都为零时,就显示黑色(就是啥也不显示,即显示器黑屏);当三种基色都达到最高亮度时,就表现为白色。综上所述,该颜色模型是在黑色(显示器黑屏)上面以RGB三色光互相叠加来实现混色,故模型也称为加色混合模型。
红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。 而与我们电脑相关的地方,目前的显示器大都是采用了RGB颜色标准。
混色设定(加法混合):RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好象有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。
而通道A用来描述每个像素的不透明度或者覆盖的程度,若α=1,则像素是完全不透明的;若α=0,则像素是完全透明的;当α取中间值时可以调节图像的透明度。这在图像合成和抠图时是有必要使用的(关于合成与抠图将会在后期的图像处理之点算子中介绍)。
2、XYZ颜色空间
所谓1931CIE-XYZ系统,就是在RGB系统的基础上,用数学方法,选用三个理想的原色来代替实际的三原色,从而将CIE-RGB系统中的光谱三刺激值 和色度坐标r、g、b均变为正值。
选择三个理想的原色(三刺激值)X、Y、Z,X代表红原色,Y代表绿原色,Z代表蓝原色,这三个原色不是物理上的真实色,而是虚构的假想色。
国际照明委员会(CIE)在进行了大量正常人视觉测量和统计,1931年建立了"标准色度观察者", 从而奠定了现代CIE标准色度学的定量基础。由于"标准色度观察者"用来标定光谱色时出现负刺激值(即对于蓝-绿值域中的某些纯谱,需要加上红光的负的量,就是说一定量的红光必须加到正在匹配的彩色中以便获得一个彩色匹配。这些结果也为具有不同光谱(复色光经过色散系统(如棱镜、光栅)分光后,被色散开的单色光按波长或频率大小而依次排列的图案,全称为光学频谱。)能量分布的同色光的存在性提供了简单的解释,这样的光在感觉上是无法区分的。注意,两个纺织品或涂料颜色在一种照明下表现为具有不同光谱能量分布的同色光,并不意味着在另一种光照下也如此。),计算不便,也不易理解,因此1931年CIE在RGB 系统基础上,改用三个假想的原色X、Y、 Z建立了一个新的色度系统(它含有在其正象限中的所有纯谱色,并将Y轴映射到亮度上,即感觉到的相对亮度,且将纯白映射到对角(等值的)矢量上)。将它匹配等能光谱的三刺激值,定名为"CIE1931 标准色度观察者光谱三刺激值",简称为"CIE1931标准色度观察者"。这一系统叫做"CIE1931标准色度系统"或称为" 2° 视场XYZ色度系统"。CIEXYZ颜色空间稍加变换就可得到Yxy色彩空间,其中Y取三刺激值中Y的值, 表示亮度,x、y反映颜色的色度特性。定义如下:在色彩管理中,选择与设备无关的颜色空间是 十分重要的,与设备无关的颜色空间由国际照明委员会(CIE)制定,包括CIEXYZ和CIELAB两个标准。 它们包含了人眼所能辨别的全部颜色。而且,CIEYxy测色制的建立给定量的确定颜色创造了条件。 但是,在这一空间中,两种不同颜色之间的距离值并不能正确地反映人们色彩感觉差别的大小, 也就是说在CIEYxy色厦图中,在 不同的位置不同方向上颜色的宽容量是不同的,这就是Yxy颜色空间 的不均匀性。这一缺陷的存在,使得在Yxy及XYZ空间不能直观地评价颜色。
而CIE XYZ标准的官方定义将这个矩阵规范化了,使对应于纯红的Y值为1,一个更常用的形式是省略前面的分数,使第二行合起来为1,即RGB三元组(1,1,1)映射到Y值1。根据上面公式线性的混合图中的曲线,我们得到图中的结果曲线。注意现在所有三个谱(彩色匹配函数)是如何只有正值且曲线是如何匹配人所感知的亮度的。
我们让X、Y、Z分别除以X+Y+Z,便可以得到色度坐标x、y、z。
它们的和为1.色度坐标舍弃了给定色彩样本的绝对亮度而只表示其纯色。如果我们扫描图中的单色λ,参数从380nm到800nm,我们就得到下面的色度图。改图显示了多数人可以感知到的每个彩色值的(x,y)值。外部的边缘表示所有纯单色数值在(x,y)空间上映射的位置,而下端的直线,它将两个端点相连,称作“紫线”。
CIE色度图,显示了彩色和其对应的(x,y)值。纯谱色绕着曲线的外端布置
当我们想将亮度和色度分开来时,Yxy(亮度加上两个最具区分性的色度分量)是彩色数值的一种方便的表达形式。
- //RGB转换为XYZ
- void rtRGB2XYZ(RtScalar rgb, RtScalar& xyz)
- {
- //Observer. = 2°,Illuminant = D65
- xyz.val[0] = 0.4124564 * rgb.val[0] + 0.3575761 * rgb.val[1] + 0.1804375 * rgb.val[2];
- xyz.val[1] = 0.2126729 * rgb.val[0] + 0.7151522 * rgb.val[1] + 0.0721750 * rgb.val[2];
- xyz.val[2] = 0.0193339 * rgb.val[0] + 0.1191920 * rgb.val[1] + 0.9503041 * rgb.val[2];
- }
- //XYZ转换为RGB
- void rtXYZ2RGB(RtScalar xyz, RtScalar& rgb)
- {
- rgb.val[0] = 3.2404542 * xyz.val[0] + -1.5371385 * xyz.val[1] + -0.4985314 * xyz.val[2];
- rgb.val[1] = -0.9692660 * xyz.val[0] + 1.8760108 * xyz.val[1] + 0.0415560 * xyz.val[2];
- rgb.val[2] = 0.0556434 * xyz.val[0] + x-0.2040259 * xyz.val[1] + 1.0572252 * xyz.val[2];
- }
3、L*a*b* 颜色空间
尽管XYZ色彩空间有很多方便的性质,包括分离亮度和色度的能力,但是它实际上并不预测人对色彩或亮度差别的感知程度。
由于人类视觉系统的响应是粗略的对数关系(我们可以感知约1%的相对亮度变化),CIE定义了XYZ空间的一个非线性重映射称作L*a*b*(有时也称作CIELAB),其中亮度或色度上的差别在感觉上更一致。
CIE L*a*b* (CIELAB) 是惯常用来描述人眼可见的所有颜色的最完备的色彩模型。它是为这个特殊目的而由国际照明委员会提出的。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) 的转换:
- double _rtLabFun(double val)
- {
- if (val > 0.008856)
- return val/3.0
- else
- return 7.787 * val + 16.0/116.0
- }
- //XYZ转换为LAB
- void rtXYZ2LAB(RtScalar xyz, RtScalar& lab)
- {
- RtScalar temp;
- temp = RtScalar(xyz.val[0]/255.0, xyz.val[1]/255.0, xyz.val[2]/255.0, 0);
- if (temp.val[1] > 0.008856)
- {
- lab.val[0] = 116.0 * temp.val[1] / 3;
- }
- else
- {
- lab.val[0] = 903.3 * temp.val[1];
- }
- lab.val[1] = 500.0*(_rtLabFun(temp.val[0]) - _rtLabFun(temp.val[1]));
- lab.val[2] = 200.0*(_rtLabFun(temp.val[1]) - _rtLabFun(temp.val[2]));
- }
- //LAB转换为XYZ
- void rtLAB2XYZ(RtScalar lab, RtScalar& xyz)
- {
- RtScalar temp;
- temp.val[0] = 3 * lab.val[0] / 116.0;
- temp.val[1] = lab.val[1]/500.0 + temp.val[0];
- temp.val[2] = temp.val[0] - lab.val[2] / 200.0;
- if ( temp.val[0] > 0.008856 )
- temp.val[0] = temp.val[0] * 3;
- else
- temp.val[0] = (temp.val[0] - 16.0/116.0) / 7.787;
- if ( temp.val[1] > 0.008856 )
- temp.val[1] = temp.val[1] * 3;
- else
- temp.val[1] = (temp.val[1] - 16.0/116.0) / 7.787;
- if ( temp.val[2] > 0.008856 )
- temp.val[2] = temp.val[2] * 3;
- else
- temp.val[2]= ( temp.val[2] - 16.0/116.0) / 7.787;
- xyz = rtScalar(temp.val[0]*255.0, temp.val[1]*255.0, temp.val[2]*255.0, 0);
- }
4、HSL
HSL的模型图与HSI类似。
HSL与HSB相似。主要的区别在于,HSL与明度和暗度是对称的。这意味着:在HSL中,饱和分量总是从完全饱和的颜色变为等效的灰色(在HSB中,B最大,它从饱和色变为白色)。在HSL中,亮度始终贯穿从黑色到所选色调到白色的整个范围(在HSB中,B组件只从黑色到选择的颜色)。
就我而言,HSL提供了比HSB更精确的(即使不是绝对的)颜色近似。
形式定义设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:
h 的值通常规范化到位于 0 到 360°之间。而 h = 0 用于 max = min 的(就是灰色)时候而不是留下 h 未定义。
从 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 的时候,可以使用下列过程:
4、HSI
HSI色彩空间是从人的视觉系统出发,用色相(色调)、色饱和度和亮度来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色相、亮度和色饱和度的变化情形表现得很清楚。 通常把色相和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中 方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析 和处理的工作量。HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着 转换关系。
HSI 色彩模型是从人的视觉系统出发,用 H 代表色相 (Hue)、S 代表饱和度 (Saturation) 和 I 代表亮度 (Intensity) 来描述色彩。饱和度与颜色的白光光量刚好成反比,它可以说是一个颜色鲜明与否的指标。因此如果我们在显示器上使用 HIS 模型来处理图像,将能得到较为逼真的效果。
色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。
饱和度 (Saturation):又称纯度,是指色彩的鲜艳程度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的颜色都是高度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如绛紫,粉红,黄褐等。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色。
亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。
YUV与RGB相互转换的公式如下
- //RGB转换为HSI
- void rtRGB2HSI(RtScalar rgb, RtScalar& hsi)
- {
- double maxv = 0, minv = 0, angle = 0;
- RtScalar temp;
- temp.val[0] = rgb.val[0] / 255.0;
- temp.val[1] = rgb.val[1] / 255.0;
- temp.val[2] = rgb.val[2] / 255.0;
- maxv = max(max(temp.val[0], temp.val[1]), temp.val[2]);
- minv = min(min(temp.val[0], temp.val[1]), temp.val[2]);
- hsi.val[2] = (temp.val[0] + temp.val[1] + temp.val[2]) / 3.0;
- hsi.val[1] = 1.0 - minv/hsi.val[2];
- 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]));
- if (temp.val[2] <= temp.val[1])
- hsi.val[0] = angle / PI * 180.0;
- else
- hsi.val[0] = (2 * PI - angle)/PI * 180.0;
- }
- //HSI转换为RGB
- void rtHSI2RGB(RtScalar hsi, RtScalar& rgb)
- {
- int flag = 0;
- double t1 = 0, t2 = 0, tv1 = 0, tv2 = 0, tv3 = 0;
- RtScalar temp;
- temp = hsi;
- temp.val[0] = hsi.val[0] * PI / 180.0;
- t1 = 2.0 * PI / 3.0;
- t2 = 2.0 * t1;
- if (temp.val[0] >= t1 && temp.val[0] < t2)
- {
- flag = 1;
- temp.val[0] -= t1;
- }
- if (temp.val[0] >= t2)
- {
- flag = 2;
- temp.val[0] -= t2;
- }
- tv1 = (temp.val[2] * (1 - temp.val[1])) * 255.0;
- tv2 = (temp.val[2] * (1 + temp.val[1] * cos(temp.val[0]) / cos(PI / 3 - temp.val[0]))) * 255.0;
- tv3 = (3.0 * temp.val[2] - tv1 - tv2) * 255.0;
- switch (flag)
- {
- case 0:
- rgb = rtScalar(tv2, tv3, tv1, 0);
- break;
- case 1:
- rgb = rtScalar(tv1, tv2, tv3, 0);
- break;
- case 2:
- rgb = rtScalar(tv3, tv1, tv2, 0);
- break;
- }
- }
5、HSV (HSB)
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模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。
HSL 和 HSV 有同样的色相定义,但是其他分量不同。HSV 颜色的 s 和 v 的值定义如下:
从 HSV 到 RGB 的转换
类似的,给定在 HSV 中 (h, s, v) 值定义的一个颜色,带有如上的 h,和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:
- // RGB转换为HSV
- void rtRGB2HSV(RtScalar rgb, RtScalar& hsv)
- {
- double minV = 0,maxV = 0, delMax = 0;
- minV = min(min(rgb.val[0], rgb.val[1]), rgb.val[2]);
- maxV = max(max(rgb.val[0], rgb.val[1]), rgb.val[2]);
- delMax = maxV - minV;//Delta RGB value
- if (minV == maxV)
- {
- hsv.val[0] = 0;
- }
- if (maxV == rgb.val[0] && rgb.val[1] >= rgb.val[2])
- {
- hsv.val[0] = (rgb.val[1] - rgb.val[2])/delMax * 60.0;
- }
- if (maxV == rgb.val[0] && rgb.val[1] < rgb.val[2])
- {
- hsv.val[0] = (rgb.val[1] - rgb.val[2])/delMax * 60.0 + 360;
- }
- if (maxV == rgb.val[1])
- {
- hsv.val[0] = (rgb.val[2] - rgb.val[0])/delMax * 60.0 + 120;
- }
- if (maxV == rgb.val[2])
- {
- hsv.val[0] = (rgb.val[0] - rgb.val[1])/delMax * 60.0 + 240;
- }
- if (maxV == 0)
- hsv.val[1] = 0;
- else
- hsv.val[1] = 1.0 - minV/maxV;
- hsv.val[2] = maxV;
- }
- // HSV转换为RGB
- void rtHSV2RGB(RtScalar hsv, RtScalar& rgb)
- {
- if ( hsv.val[1] == 0 )
- {
- rgb = rtScalar(hsv.val[2], hsv.val[2], hsv.val[2], 0);
- }
- else
- {
- double varh,vari,var1,var2,var3;
- varh = hsv.val[0] /60.0;
- vari = int(varh);
- var1 = hsv.val[0] * (1.0 - hsv.val[1]);
- var2 = hsv.val[0] * (1.0 - hsv.val[1]* (hsv.val[0] - vari));
- var3 = hsv.val[0] * (1.0 - hsv.val[1]* (1.0 - (hsv.val[0] - vari)));
- switch (vari)
- {
- case 0:
- rgb = rtScalar(hsv.val[0], var3, var1, 0);
- break;
- case 1:
- rgb = rtScalar(var2, hsv.val[0], var1, 0);
- break;
- case 2:
- rgb = rtScalar(var1, hsv.val[0], var3, 0);
- break;
- case 3:
- rgb = rtScalar(var1, var2, hsv.val[0], 0);
- break;
- case 4:
- rgb = rtScalar(var3, var1, hsv.val[0], 0);
- break;
- case 5:
- rgb = rtScalar(hsv.val[0], var1, var2, 0);
- break;
- }
- }
- }
HSL、HSI、HSV(HSB)总结:
说实话对于这三种颜色模型,网上是众说纷纭,找了一些书上面也没有详细的介绍。最后在WIKI中找到了一些较为详细的解释:HSL代表色相、饱和度和亮度,也常被称为HLS。HSV代表色相、饱和度和值,也常被称为HSB(亮度)。第三种模型,常见的计算机视觉应用,是HSI,用于色调,饱和度和强度。这几个模型都是从笛卡尔的RGB多维数据集派生出来的。这几种模型都把灰色放在中央垂直轴上,底部是黑色,顶部是白色,然后把最鲜艳的颜色推向圆筒的边缘。绕轴的角度与色相对应,与轴的距离对应于饱和度,沿轴的距离对应于亮度、值或亮度。注意,虽然这几种模型中的色相是相同的属性,但它们的饱和度定义却有很大的不同。因为HSL和HSV是依赖于设备的RGB模型的简单转换,它们定义的物理颜色依赖于设备或特定RGB空间的红色、绿色和蓝色基色的颜色,以及用于表示这些初始值的伽玛校正。因此,每个独特的RGB设备都有独特的HSL和HSV空间,而数字HSL或HSV值则为每个RGB空间描述不同的颜色。这几种表述在计算机图形学中都得到了广泛的应用,其中一个或另一个通常比RGB更方便,但它们也经常被批评为没有充分区分颜色的属性,或者它们缺乏感知的一致性。其他更多的计算密集型模型,如CIELAB或CIECAM02可以更好地实现这些目标。
6、YUV
YUV是由欧洲为PAL提出的一种标准。在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y(经过伽马压缩的)和两个色差信号(R-Y)、(B-Y), 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。当白光的亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用的亮度公式。色差U、V是由(R-Y)、(B-Y)按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。
应用:模拟领域
YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):
ITU-R BT.601标准 SDTV(标清视频)
Y'601= 0.299*R' + 0.587*G' + 0.114*B'
U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')
V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')
R' = Y' + 1.140*V'
G' = Y' - 0.394*U' - 0.581*V'
B' = Y' + 2.032*U'
ITU-R BT.709标准 HDTV(高清视频)
Y'709= 0.2125*R' + 0.7154*G' + 0.0721*B'
U'= 0.492*(B'- Y')
V'= 0.877*(R'- Y')
PS: 上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加丰富。在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。
提到灰度(亮度),就不得不说一下图像的灰度化。将彩色图像转化为灰度图像的过程称为图像的灰度化。灰度图像是红、绿、蓝三个分量相同的一种特殊的彩色图像,一般其一个像素的变化范围为255种,所以在数字图像处理中一般先将各种格式的图像转变为灰度图像,以使后续的图像处理计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度与亮度等级的分布和特征(为什么灰度图像会含有色度(饱和度和色调)等级呢?我是这样认为的,灰度图像本质上也是彩色图像,只不过是一种比较特殊的彩色图像。那么彩色图像该有的灰度图像也应该要有)。
这里我们点到为止,关于图像灰度化的详细过程会在后期数字图像预处理中进行介绍。
- // RGB转换为YUV
- void rtRGB2YUV(RtScalar rgb, RtScalar& yuv)
- {
- yuv.val[0] = 0.299*rgb.val[0] + 0.587*rgb.val[1] + 0.114*rgb.val[2]; // y
- yuv.val[1] = -0.147*rgb.val[0] - 0.289*rgb.val[1]+ 0.436*rgb.val[2]; // u
- yuv.val[2] = 0.615*rgb.val[0] - 0.515*rgb.val[1] - 0.1*rgb.val[2]; // v
- }
- // YUV转换为RGB
- void rtYUV2RGB(RtScalar yuv, RtScalar& rgb)
- {
- rgb.val[0] = yuv.val[0] + 1.14*yuv.val[2]; // r
- rgb.val[1] = yuv.val[0] - 0.39*yuv.val[1] - 0.58*yuv.val[2];
- rgb.val[2] = yuv.val[0] + 2.03*yuv.val[1];
- }
7、YIQ
YIQ,是北美为NTSC(National Television Standards Committee)提出的电视系统标准。Y是提供黑白电视及彩色电视的亮度信号(Luminance),即亮度(Brightness),I代表In-phase,色彩从橙色到青色,Q代表Quadrature-phase,色彩从紫色到黄绿色。IQ分量是UV分量经过33度旋转得到的。
NTSC制为了进一步压缩色度带宽,用色差信号I,Q来代替U,V。若采用U,V色差信号,则色度、亮度信号的共频带部分极大,低端不共频带的亮度信号带宽很小,亮、色干扰大。将彩色图像从RGB转换到YIQ色彩空间,可以把彩色图像中的亮度信息与色度信息分开,分别独立进行处理。在复合(NTSC和PAL)视频中,色彩信号在调制并叠加在Y'(Gamma校正后的Y值)亮度信号的顶端之前经过横向的低通滤波。向后兼容是通过使老式黑白TV有效的忽略高频色彩信号(由于慢速的电子效应)或在最坏的情况下将其作为高频模式叠加在主信号的顶端来获得的。
RGB和YIQ的对应关系用下面的方程式表示:
Y=0.299R+0.587G+0.114B
I=0.596R-0.274G-0.322B
Q=0.211R-0.523G+0.312B
较其他颜色空间,YIQ颜色空间具有能将图像中的亮度分量分离提取出来的优点,并且YIQ颜色空间与RGB颜色空间之间是线性变换的关系,计算量小,聚类特性也比较好,可以适应光照强度不断变化的场合,因此能够有效地用于彩色图像处理。可用于在自然条件下采集到的复杂背景下的运动目标的识别。
8、YCbCr
今天所有的数字视频和静态图像压缩标准都基于更新的 YCbCr转换。YCbCr是与YUV紧密相关的(Cb和Cr信号携带蓝和红的色差信号,具有比UV更有用的助记信息),但使用不同的放缩因子来配合数字信号的8位范围。
YCbCr是色彩空间的一种,通常会用于影片中的影像连续处理,或是数字摄影系统中。Y'为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y'和Y是不同的,而Y就是所谓的流明(luminance),表示光的亮度且为非线性,使用伽马校正处理得到Y’。
YCbCr 则是在世界数字组织视频标准研制过程中作为ITU - R BT.601 建议的一部分,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致,Cb,Cr 同样都指色彩,只是在表示方法上不同而已。在YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。YCbCr 有许多取样格式,如4∶4∶4,4∶2∶2,4∶1∶1 和4∶2∶0。
关于采样格式的说明会在后期的文章各色彩空间的采样里做陈述。
对于视频,Y'信号被重新缩放来配合数值的(16~235)范围,而Cb和Cr信号被缩放来配合(16~240)的范围。对于静态图像,JPEG标准使用整个8位无保留数值的范围。
应用:数字视频,ITU-R BT.601建议
SDTV
JPEG
HDTV
9、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
- //RGB转换为CMY
- void rtRGB2CMY(RtScalar rgb, RtScalar& cmy)
- {
- cmy.val[0] = 255 - rgb.val[0];
- cmy.val[1] = 255 - rgb.val[1];
- cmy.val[2] = 255 - rgb.val[2];
- }
- //CMY转换为RGB
- void rtCMY2RGB(RtScalar cmy, RtScalar& rgb)
- {
- rgb.val[0] = 255 - cmy.val[0];
- rgb.val[1] = 255 - cmy.val[1];
- rgb.val[2] = 255 - cmy.val[2];
- }
- //CMY转换为CMYK
- void rtCMY2CMYK(RtScalar cmy, RtScalar& cmyk)
- {
- unsigned char temp = 0;
- temp = min(min(cmy.val[0], cmy.val[1]), cmy.val[2]);
- if (temp == 255 )
- {
- cmyk = rtScalar(0, 0, 0, 0);
- }
- else
- {
- cmyk.val[0] = cmy.val[0] - temp;
- cmyk.val[1] = cmy.val[1] - temp;
- cmyk.val[2] = cmy.val[2] - temp;
- }
- cmyk.val[3] = temp;
- }
- //CMYK转换为CMY
- void rtCMYK2CMY(RtScalar cmyk, RtScalar& cmy)
- {
- cmy.val[0] = cmyk.val[0] + cmyk.val[3];
- cmy.val[1] = cmyk.val[1] + cmyk.val[3];
- cmy.val[2] = cmyk.val[2] + cmyk.val[3];
- }
说明:以上内容的确是比较令人感到困惑的,在编写的时候我也在好多地方纠结了好久。一方面网上各种解释五花八门;另一方面好多东西我也是在边学边写,一些地方我也不是很明白,而且这方面的知识牵扯到好多方面的新东西。所以这篇文章虽然已经发布,但我在后期还是会根据自己的深入了解做必要的修正,也希望碰巧看到这篇文章的朋友能给出一些意见和建议,谢谢!