opencv色彩空间类型转换(python)

色彩空间转换与图像处理:从RGB到HSV的探索
本文详细介绍了色彩空间在图像处理中的重要性,特别是RGB到HSV的转换。HSV色彩空间以其面向视觉感知的特性,使得处理颜色变得更加直观。通过OpenCV的cv2.cvtColor()函数,可以方便地在不同色彩空间之间转换,如GRAY、XYZ、YCrCb、HSV、HLS、CIEL*a*b*、CIEL*u*v*和Bayer色彩空间。在HSV空间中,色调、饱和度和亮度的调整能够实现艺术效果,如色彩提取和肤色标记。此外,还涉及了alpha通道在RGBA图像中的作用。

色彩空间类型转换

色彩模型是描述使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。

比较常见的色彩空间包括:

  • GRAY色彩空间(灰度图像)
  • XYZ色彩空间
  • YCrCb色彩空间
  • HSV色彩空间
  • HLS色彩空间
  • CIELab色彩空间
  • CIELuv色彩空间
  • Bayer色彩空间等

色彩空间类型转换是指,将图像从一个色彩空间转换到另外一个色彩空间。

在使用OpenCV处理图像时,可能会在RGB色彩空间和HSV色彩空间之间进行转换。

在进行图像的特征提取、距离计算时,往往先将图像从RGB色彩空间处理为灰度色彩空间。

在一些应用中,可能需要将色彩空间的图像转换为二值图像。

色彩空间也称为颜色空间、彩色空间、颜色模型、彩色系统、彩色模型、色彩模型等。

色彩空间基础
GRAY色彩空间

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

当图像由RGB色彩空间转换为GRAY色彩空间时,其处理方式如下:

Gray=0.299*R+0.587*G+0.114*B

当图像由GRAY色彩空间转换为RGB色彩空间时,最终所有通道的值都将是相同的,其处理方式如下:

R=Gray
G=Gray
B=Gray
XYZ色彩空间

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

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

image-20220117164537864

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

image-20220117164603641

YCrCb色彩空间

人眼视觉系统(HVS, Human Visual System)对颜色的敏感度要低于对亮度的敏感度

在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的值为:

image-20220117164653063

从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色彩空间是一种面向视觉感知的颜色模型

指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)饱和度(Saturation)亮度(Value)。

色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。

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

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

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

  1. 将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,通过调整色调值就能选取不同的颜色,色调的取值区间为[0, 360]

image-20220117164730850

  1. 饱和度为一比例值,范围是[0, 1],具体为所选颜色的纯度值和该颜色最大纯度值之间的比值。饱和度的值为0时,只有灰度。

  2. 亮度表示色彩的明亮程度,取值范围也是[0, 1]。

在从RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0, 1]之间,然后再进行处理。具体处理方法为:

image-20220117164743671

image-20220117164751193

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

image-20220117164807322

由上述公式计算可知:

S∈[0,1]
V∈[0,1]
H∈[0,360]

所有这些转换都被封装在OpenCV的cv2.cvtColor()函数内。通常情况下,我们都是直接调用该函数来完成色彩空间转换的,而不用考虑函数的内部实现细节。

HLS色彩空间

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

与HSV色彩空间类似,只是HLS色彩空间用“光亮度/明度L(lightness)”替换了“亮度(Value)”。

● 色调:表示人眼所能感知的颜色,在HLS模型中,所有的颜色分布在一个平面的色调环上,整个色调环为360度的圆心角,不同的角度代表不同的颜色

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

● 饱和度:使用[0, 1]的值描述相同色调、相同光亮度/明度下的色彩纯度变化。饱和度的值越大,表示颜色的纯度越高,颜色越鲜艳;反之,饱和度的值越小,色彩的纯度越低,颜色越暗沉。通常用该属性表示颜色的深浅,比如深绿色、浅绿色。

CIELab*色彩空间

CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。

从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。

CIEL*a*b*色彩空间中的L*分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a*分量表示从红色到绿色的范围,取值范围是[-127,127]; b*分量表示从黄色到蓝色的范围,取值范围是[-127,127]。

在从RGB色彩空间转换到CIEL*a*b*色彩空间之前,需要先将RGB色彩空间的值转换到[0, 1]之间,然后再进行处理。

由于CIEL*a*b*色彩空间是在CIE的XYZ色彩空间的基础上发展起来的,在具体处理时,需要先将RGB转换为XYZ色彩空间,再将其转换到CIEL*a*b*色彩空间。具体实现方法为:

image-20220117164828596

image-20220117164838892

所得结果中各个值的取值范围为:

L∈[0,100]
a∈[-127,127]
b∈[-127,127
CIELuv*色彩空间

CIEL*u*v*色彩空间同CIEL*a*b*色彩空间一样,都是均匀的颜色模型。CIEL*u*v*色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。

从RGB色彩空间到CIEL*u*v*色彩空间的转换过程,要先转换到XYZ色彩空间。

从RGB色彩空间到XYZ色彩空间的转换:

image-20220117164856218

从XYZ色彩空间到CIEL*u*v*色彩空间的转换:

image-20220117164907911

所得结果中各个值的取值范围分别为:

L∈[0,100]
u∈[-134,220]
v∈[-140,122]
Bayer色彩空间

Bayer色彩空间(Bayer模型)被广泛地应用在CCD和CMOS相机中。它能够从如图4-1所示的单平面R、G、B交错表内获取彩色图像。

image-20220117164925153

输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。

上述模式能够通过移动一个左边的像素或者上方的像素来完成修改。

在函数cv2.cvtColor()的色彩空间转换参数中,通常使用两个特定的参数x和y来表示特定的模式。

该模式组成通过上图第二行中的第2列与第3列的值来指定。上图就是典型的“BG”模式。

常见的模式还有很多,cv2.COLOR_BayerBG2BGR、cv2.COLOR_BayerGB2BGR、cv2.COLOR_BayerRG2BGR、cv2.COLOR_BayerGR2BGR、cv2.COLOR_BayerBG2RGB、cv2.COLOR_BayerGB2RGB、cv2.COLOR_BayerRG2RGB、cv2.COLOR_BayerGR2RGB等。

类型转换函数

在OpenCV内,使用cv2.cvtColor()函数实现色彩空间的变换。

该函数能够实现多个色彩空间之间的转换。

dst = cv2.cvtColor( src, code [, dstCn] )
  • dst表示输出图像,与原始输入图像具有同样的数据类型和深度。

  • src表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。

  • code是色彩空间转换码

    image-20220208010707448

    image-20220208010732570

    image-20220208010744528

    image-20220208010909199

    image-20220208010919343

    image-20220208010927286

  • dstCn是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。

对于一个标准的24位位图, BGR色彩空间中第1个8位(第1个字节)存储的是蓝色组成信息(Blue component),第2个8位(第2个字节)存储的是绿色组成信息(Green component),第3个8位(第3个字节)存储的是红色组成信息(Red component)。同样,其第4个、第5个、第6个字节分别存储蓝色、绿色、红色组成信息,以此类推。

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

  • 8位图像值的范围是[0,255

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值