色彩模型(Color Model)
色彩模型是一种抽象的数学模型,通过一组数字来描述颜色。当站在不同的角度对颜色建模时就得到不同的数学模型。
- 机器视角
- RGB(Red、Green、Blue),used with color CRT monitors
- YIQ,broadcast TV color system
- CMY(Cyan(青色), Magenta(品红), Yellow),color printing
- CMYK(Cyan, Magenta, Yellow,Black),color printing
- IRODORI,six-primary-color projection system
- 用户视角:
- HSV(Hue, Saturation, Value)
- HSB(Hue, Saturation, Brightness),和HSV是一样的,只是叫法不同
- HSL (Hue, Saturation,Lightness)
- The Munsell system
- CIE Lab
颜色分类
自然界物体的颜色有两种:光源色(light source color)和表面色(surface color)。
-
光源色(可以自己发光的物体)——红色R、绿色G、蓝色B——加法混色原理;
-
表面色(自己不能发光,只能反射光)——品红M、黄色Y、青色C——减法混色原理。
RGB模型
RGB是一种加法混色模型,它描述那些由不同颜色的光混合形成新颜色的情形,颜色越加越亮。生活中也有直观的感受,例如室内灯开得越多,室内就越亮。因为亮度是累加的,所以是加法混色。
RGB是通过空间笛卡尔坐标系来建模的,如下图所示:每种颜色由空间中的一个坐标来表示。每个坐标有三个分量,每个分量共有256种取值,所以RGB一共有
256
∗
256
∗
256
=
16777216
256*256*256=16777216
256∗256∗256=16777216 种颜色。注意:OpenCV中分量的顺序为BGR,即 (B,G,R)
计算机中的显示模式:
- 24比特模式:图片中的每个像素使用三个8位无符号整数(0到255)表示红色、绿色和蓝色的强度。
- 16比特模式:16比特模式分配给每种原色各为5比特,其中绿色为6比特,因为人眼对绿色分辨的色调更精确。但某些情况下每种原色各占5比特,余下的1比特不使用。
- 32比特模式:实际就是24比特模式,余下的8比特不分配到像素中,这种模式是为了提高数据输送的速度。同样在一些特殊情况下,如DirectX、OpenGL等环境,余下的8比特用来表示象素的透明度(Alpha)。
CMY模型
CMY模型是一种减法混色模型,该模型解释了涂料,染料,墨水和天然色素的混合物产生的颜色,每个颜色会减去(即吸收)某些波长的光并反射其它光。例如颜料不发光,看到的颜色其实是没被吸收而被反射出来的光的颜色。所以颜料吸收的颜色就是我们看到颜料颜色的补色。因为看到的颜色是白光减去看到颜色的补色,所以是减法模型。CMY模型主要应用在印刷行业,理论上只要CMY等比例混合就能得到黑色,但是因为目前制造工艺水平的限制,制造出来的油墨纯度都不够高,CMY相加的结果实际只是一种暗红色。又因为在印刷业中黑色的使用频率非常高,所以往往还会加入黑色(black)油墨,这就是CMYK色彩混合模式的由来。
青色C(红色R的补色) 是因为吸收光中的红光R,剩下的绿光G和蓝光B被反射出来,形成青色C
青色C= 白色- 红色R = 绿色G+ 蓝色B
品红M(绿色G的补色) 是因为吸收光中的绿光G,剩下的红光R和蓝光B被反射出来,形成品红M
品红M= 白色 - 绿色G =红色R+ 蓝色B
黄色Y(蓝色B的补色) 是因为吸收光中的蓝光B,剩下的红光R和绿光G被反射出来,形成黄色Y
黄色Y= 白色 - 蓝色B = 红色R + 绿色G
HSB(HSV)模型
HSB(HSV)模型是站在人的角度对颜色建模,我们对色彩的认识往往是:
-
是什么颜色?
由色相(色彩相貌)H决定,决定了是什么颜色?是红色?绿色?还是什么颜色?
-
颜色鲜艳不鲜艳?
由饱和度S,即颜色的浓度决定。
-
颜色是亮还是暗?
由明度 B 决定,可以理解为照在颜色上光线的强度,光线越强,颜色越亮,反之,越暗。
Photoshop中拾色器的HSB如下图所示:
灰度图
灰度图是指图片中每个像素 R、G、B 三个分量的取值相同。因为三个分量的取值相同,所以一共有256种灰度。当采用不同的算法时,得到的灰度图不同。例如,可以取三个分量的最大值、最小值、平均值等作为灰度:
Example:假设某个像素的取值为:(60,120,180)
取最小值作为分量:(60,60,60)
取最大值作为分量:(180,180,180)
取平均值作为分量:(60+120+180)/3=120-->(120,120,120)
OpenCV中RGB转灰度图(cvtColor(src, bwsrc, cv::COLOR_RGB2GRAY)
的算法为:
Gray=0.299*R+0.587*G+0.114*B
通道
下面通过例子来理解通道的含义。注意:不同显示器显示效果有差异,所以当你使用拾色器拾取颜色时,可能和下面不一样。
原图片:
小圆圈的RGB颜色分别为:
(60,0,0)、(120,0,0)、(180,0,0)、(240,0,0)
(0,60,0)、(0,120,0)、(0,180,0)、(0,240,0)
(0,0,60)、(0,0,120)、(0,0,180)、(0,0,240)
(60,60,0)、(120,120,0)、(180,180,0)、(240,240,0)
(60,0,60)、(120,0,120)、(180,0,120)、(240,0,120)
(0,60,60)、(0,120,120)、(0,180,180)、(0,180,180)
字体的RGB颜色为:(80,160,240)
红色通道:
小圆圈的RGB颜色分别为:
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
字体的RGB颜色为:(80,80,80)
绿色通道:
小圆圈的RGB颜色分别为:
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
字体的RGB颜色为:(160,160,160)
蓝色通道:
小圆圈的RGB颜色分别为:
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(0,0,0)、(0,0,0)、(0,0,0)、(0,0,0)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
(60,60,60)、(120,120,120)、(180,180,180)、(240,240,240)
字体的RGB颜色为:(240,240,240)
结论: RGB颜色模型是由空间笛卡尔直角坐标系建模的,有三个轴 R、G、B,每个轴代表一个通道。由上面实验结果可以看出,红色通道、绿色通道、蓝色通道都是一张灰度图。RGB通道灰度图生成策略为:
红色通道:(R,G,B)-->(R,R,R)以红色分量去填充其他分量
绿色通道:(R,G,B)-->(G,G,G)以绿色分量去填充其他分量
蓝色通道:(R,G,B)-->(B,B,B)以蓝色分量去填充其他分量