OpenCV-Python-1--图片的基本知识

色彩模型(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一共有 256256256=16777216256*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)模型是站在人的角度对颜色建模,我们对色彩的认识往往是:

  1. 是什么颜色?

    由色相(色彩相貌)H决定,决定了是什么颜色?是红色?绿色?还是什么颜色?

  2. 颜色鲜艳不鲜艳?

    由饱和度S,即颜色的浓度决定。

  3. 颜色是亮还是暗?

    由明度 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)以蓝色分量去填充其他分量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章