快速入门基于python的OpenCV——色彩空间类型转换

快速入门基于python的OpenCV——色彩空间类型转换

太原理工大学机器人团队20日打卡day16

​ 比较常见的色彩空间包括GRAY色彩空间、XYZ色彩空间、YCrCB空间、HSV色彩空间、HLS色彩空间、CIEL* a * b *色彩空间(没有空格,因为编辑器问题)、Bayer色彩空间等。每个色彩空间都有自己擅长处理问题的领域,因此,为了更方便地处理某个具体问题,就要用到色彩空间的转换。

1、色彩空间基础

GRAY色彩空间

​ GRAY通常指8位灰度图,其具有256个灰度级,像素值的范围是[0,255].

  • 当其图像由RGB色彩空间转换为GRAY色彩空间时,其处理方式如下
    • Gray=0.299·R+0.587·G+0.114·B
  • 有时,也可以采用简化形式:

快速入门基于python的OpenCV——色彩空间类型转换_第1张图片

  • 当图像由GRAY色彩空间转化为RGB色彩空间时,最终所有通道的值都相等。

XYZ色彩空间

​ XYZ色彩空间是由CIE(International Commission on Illumination)定义的,是一种更便于计算的色彩空间,它可以与RGB色彩空间相互转换。

  • 将RGB色彩空间转换为XYZ色彩空间,其转换形式为:

快速入门基于python的OpenCV——色彩空间类型转换_第2张图片

  • 将XYZ色彩空间转换为RGB色彩空间,其转换形式为:
    快速入门基于python的OpenCV——色彩空间类型转换_第3张图片

YCrCb色彩空间

​ 人眼视觉系统(HVS, Human Visual System)对颜色的敏感度要低于对亮度的敏感度。在传统的RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度信息。

  • 在YCrCb色彩空间中

  • Y代表光源的亮度

  • 色度信息保存在Cr和Cb中

    • 其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
  • 亮度给出了颜色亮或暗的程度信息

  • 该信息可以通过照明中强度成分的加权和来计算

  • 在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。

  • 从RGB色彩空间到YCrCb色彩空间的转换公式为:
    Y=0.299·R+0.587·G+0.114·B
    Cr=(R-Y)×0.713+delta
    Cb=(B-Y)×0.564+delta

  • 式中delta的值为

快速入门基于python的OpenCV——色彩空间类型转换_第4张图片

  • 从YCrCb色彩空间到RGB色彩空间的转换公式为:
    • R=Y+1.403·(Cr-delta)
    • G=Y-0.714·(Cr-delta)-0.344·(Cb-delta)
    • B=Y+1.773·(Cb-delta)
  • 式中,delta的值与上面公式中的delta值相同。

HSV色彩空间

​ RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异,HSV色彩空间是一种面向视觉感知的颜色模型。HSV色彩空间从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value),色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。

  • 色调:色调与混合光谱中的主要光波长相关,例如“赤橙黄绿青蓝紫”分别表示不同的色调。如果从波长的角度考虑,不同波长的光表现为不同的颜色,实际上它们体现的是色调的差异。

  • 饱和度:指相对纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。

  • 亮度:反映的是人眼感受到的光的明暗程度,该指标与物体的反射度有关。对于色彩来讲,如果在其中掺入的白色越多,则其亮度越高;如果在其中掺入的黑色越多,则其亮度越低。

    ​ 在具体实现上,我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,通过调整色调值就能选取不同的颜色,色调的取值区间为[0, 360]。色调取不同值时,所代表的颜色如表4-1所示,两个角度之间的角度对应两个颜色之间的过渡色。

快速入门基于python的OpenCV——色彩空间类型转换_第5张图片

​ 饱和度为一比例值,范围是[0, 1],具体为所选颜色的纯度值和该颜色最大纯度值之间的比值。饱和度的值为0时,只有灰度。亮度表示色彩的明亮程度,取值范围也是[0, 1]。
在HSV色彩模型中,取色变得更加直观。例如,取值“色调=0,饱和度=1,亮度=1”,则当前色彩为深红色,而且颜色较亮;取值“色调=120,饱和度=0.3,亮度=0.4”,则当前色彩为浅绿色,而且颜色较暗。
​ 在从RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0, 1]之间,然后再进行处理。具体处理方法为:
快速入门基于python的OpenCV——色彩空间类型转换_第6张图片
快速入门基于python的OpenCV——色彩空间类型转换_第7张图片

计算结果可能存在H<0的情况,如果出现这种情况,则需要对H进一步计算

快速入门基于python的OpenCV——色彩空间类型转换_第8张图片

HLS色彩空间

​ HLS色彩空间包含的三要素是色调H(Hue)、光明度/亮度L(Lightness)、饱和度S(Saturation)。

  • 光亮度/明度:用来控制色彩的明暗变化,它的取值范围也是[0, 1]。我们通过光亮度/明度的大小来衡量有多少光线从物体表面反射出来。光亮度/明度对于眼睛感知颜色很重要,因为当一个具有色彩的物体处于光线太强或者光线太暗的地方时,眼睛是无法准确感知物体颜色的。

CIEL* a * b*

​ CIEL* a * b 色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。
​ CIEL a * b * 色彩空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a
分量表示从红色到绿色的范围,取值范围是[-127,127]; b分量表示从黄色到蓝色的范围,取值范围是[-127,127]。
在从RGB色彩空间转换到CIEL
ab色彩空间之前,需要先将RGB色彩空间的值转换到[0, 1]之间,然后再进行处理。
​ 由于CIELab色彩空间是在CIE的XYZ色彩空间的基础上发展起来的,在具体处理时,需要先将RGB转换为XYZ色彩空间,再将其转换到CIELab色彩空间。具体实现方法为:

快速入门基于python的OpenCV——色彩空间类型转换_第9张图片
快速入门基于python的OpenCV——色彩空间类型转换_第10张图片
​ 所得结果中各个值的取值范围为:
​ L∈[0,100]
​ a∈[-127,127]
​ b∈[-127,127]

2、类型转换函数

  • 在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间转换
  • 其语法格式为:
dst = cv2.cvtColor( scr ,code [,dstCn])
  • dst表示输出图像,与原始输入图像具有同样的数据类型和深度。
  • src表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。
  • code是色彩空间转换码,下表展示了其枚举值。
  • dstCn是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。

快速入门基于python的OpenCV——色彩空间类型转换_第11张图片

快速入门基于python的OpenCV——色彩空间类型转换_第12张图片
快速入门基于python的OpenCV——色彩空间类型转换_第13张图片
快速入门基于python的OpenCV——色彩空间类型转换_第14张图片
快速入门基于python的OpenCV——色彩空间类型转换_第15张图片
快速入门基于python的OpenCV——色彩空间类型转换_第16张图片

颜色空间的转换都用到了以下约定:

  • 8位图像值的范围是[0,255]
  • 16位图像值的范围是[0,65535]
  • 浮点数图像值的范围是[0.0~1.0]

3、alpha通道

​ 在RGB色彩空间三个通道的基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。这种4个通道的色彩空间被称为RGBA色彩空间,PNG图像是一种典型的4通道图像。alpha通道的赋值范围是[0, 1],或者[0, 255],表示从透明到不透明。

import cv2
img = cv2.imread("Second.jpg")
bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
b , g , r , a = cv2.split(bgra)
a[:,:] = 125
bgra125 = cv2.merge([b,g,r,a])
a[:,:]=0
bgra0 = cv2.merge([b,g,r,a])
cv2.imshow("img",img)
cv2.imshow("bgra",bgra)
cv2.imshow("125",bgra125)
cv2.imshow("0",bgra0)
cv2.imwrite("bgra.jpg",bgra)
cv2.imwrite("125.jpg",bgra125)
cv2.imwrite("0.jpg",bgra0)
cv2.waitKey()
cv2.destroyAllWindows()

请自行实验

你可能感兴趣的:(笔记)