色彩空间类型转换是指,将图像从一个色彩空间转换到另外一个色彩空间。
色彩空间基础
比较常见的色彩空间包括GRAY色彩空间、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer色彩空间等。
GRAY色彩空间
GRAY(灰度图像)通常指8位灰度图,其具有256个灰度等级,像素值的范围是[0,255].
当图像由RGB色彩空间转换位GRAY色彩空间时,其处理方式如下:
G
r
a
y
=
0.299
∗
R
+
0.587
∗
G
+
0.114
∗
B
Gray=0.299*R+0.587*G+0.114*B
Gray=0.299∗R+0.587∗G+0.114∗B
上述是标准的转换方式,也是OpenCV中使用的转换方式。
有时也会采样简化形式完成转换:
G
r
a
y
=
R
+
G
+
B
3
Gray=\frac{ R+G+B }{ 3 }
Gray=3R+G+B
当图像由GRAY色彩空间转换为RGB色彩空间时,最终所有通道的值都将相同。
R
=
G
r
a
y
G
=
G
r
a
y
B
=
G
r
a
y
R=Gray\\ G=Gray\\ B=Gray
R=GrayG=GrayB=Gray
XYZ色彩空间
XYZ色彩空间是由CIE定义的,是一种更加便于计算的色彩空间,他可以和RGB色彩空间相互转换。
将RGB色彩空间转换为XYZ色彩空间,其转换形式为:
[
X
Y
Z
]
=
[
0.412453
0.357580
0.180423
0.212671
0.715160
0.072169
0.019334
0.119193
0.950227
]
∗
[
R
G
B
]
\begin{bmatrix}X\\Y\\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\\0.212671&0.715160&0.072169\\0.019334&0.119193&0.950227 \end{bmatrix}*\begin{bmatrix}R\\G\\B \end{bmatrix}
XYZ
=
0.4124530.2126710.0193340.3575800.7151600.1191930.1804230.0721690.950227
∗
RGB
将XYZ色彩空间转换为RGB色彩空间,其转换形式为:
[
R
G
B
]
=
[
3.240479
−
1.53715
−
0.498535
−
0.969256
1.875991
0.041556
0.055648
−
0.204043
1.057311
]
∗
[
X
Y
Z
]
\begin{bmatrix}R\\G\\B\end{bmatrix}=\begin{bmatrix}3.240479&-1.53715&-0.498535\\-0.969256&1.875991&0.041556\\0.055648&-0.204043&1.057311\end{bmatrix}*\begin{bmatrix}X\\Y\\Z \end{bmatrix}
RGB
=
3.240479−0.9692560.055648−1.537151.875991−0.204043−0.4985350.0415561.057311
∗
XYZ
YCrCb色彩空间
人眼视觉系统(HVS)对颜色的敏感度要低于对亮度的敏感度。在传统是RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度信息。
在YCrCB色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
亮度给出了颜色亮或暗的程度信息,该消息通过照明中强度成分的加权和来计算。在RGB光源下,绿色成分的影响最大,蓝色成分的影响最小。
从RGB色彩空间到YCrCb色彩空间的转换公式为:
Y
=
0.299
∗
R
+
0.587
∗
G
+
0.114
∗
B
C
r
=
(
R
−
Y
)
∗
0.713
+
d
e
l
t
a
C
b
=
(
B
−
Y
)
∗
0.564
+
d
e
l
t
a
Y=0.299*R+0.587*G+0.114*B\\ Cr=(R-Y)*0.713+delta\\ Cb=(B-Y)*0.564+delta
Y=0.299∗R+0.587∗G+0.114∗BCr=(R−Y)∗0.713+deltaCb=(B−Y)∗0.564+delta
从YCrCb色彩空间到RGB色彩空间的转换公式为:
R
=
Y
+
1.403
∗
(
C
r
−
d
e
l
t
a
)
G
=
Y
−
0.714
∗
(
C
r
−
d
e
l
t
a
)
−
0.344
∗
(
C
b
−
d
e
l
t
a
)
B
=
Y
+
1.773
∗
(
C
b
−
d
e
l
t
a
)
R=Y+1.403*(Cr-delta)\\ G=Y-0.714*(Cr-delta)-0.344*(Cb-delta)\\ B=Y+1.773*(Cb-delta)
R=Y+1.403∗(Cr−delta)G=Y−0.714∗(Cr−delta)−0.344∗(Cb−delta)B=Y+1.773∗(Cb−delta)
式中,delta的值为
d
e
l
t
a
=
{
128
,
8位图像
32768
,
16位图像
0.5
,
单精度图像
delta=\begin{cases} 128, &\text{8位图像} \\ 32768, &\text{16位图像} \\ 0.5, &\text{单精度图像} \end{cases}
delta=⎩
⎨
⎧128,32768,0.5,8位图像16位图像单精度图像
HSV色彩空间
RGB是从硬件的角度提出颜色模型,在与人眼匹配的过程中可能存在一定的差异。但HSV色彩空间不同,是一种面向视觉感知的颜色模型。HSV色彩空间从心理学和视觉角度出发,指出了人眼的色彩知觉主要包含三要素:色调、饱和度、亮度,色调指光的颜色,饱和度指色彩深浅程度、亮度之人眼感受到的光的明暗程度。
色调:色调与混合光谱中主要光波长相关。如果从波长的角度考虑,不同的波长的光表现为不同的颜色,实际上它们体现的是色调的差异。8位图像内每个像素点所能代表的灰度级有256个,所以在8位图像内表示HSV图像时,要把色调的角度值映射到[0,255]范围内,在OpenCV中,可以直接把色调的角度值除以2,得到[0,180]之间的值,以适应8位二进制的存储和表示范围。
饱和度:指相对纯净度,或一种颜色混合白光的数量。纯普色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。进行色彩空间转换后,为了适应8位图的256个像素级,需要将新色彩空间映射到[0,255]范围内,所以,同样要将饱和度S的值从[0,1]范围映射到[0,255]范围内。
亮度:反映的是人眼感受到的光的明暗程度,该指标与物体的反射度相关。对于色彩来讲,如果期中参入的白色越多,则亮度越高;如果其中掺入的黑色越多,则其亮度越低。亮度范围与饱和度的范围一样,因此在OpenCV内也将值映射到[0,255]内。
在从RGB色彩空间转换到HSV色彩空间之前**,**_**需要先将RGB色彩空间的值转换到[0, 1]之间,**然后再进行处理。_具体处理方法为:
V
=
m
a
x
(
R
,
G
,
B
)
S
=
{
0
,
V=0
v
−
m
i
n
(
R
,
G
,
B
)
V
,
V其他情况
H
=
{
60
∗
(
G
−
B
)
V
−
m
i
n
(
R
,
G
,
B
)
,
V=R
120
+
60
∗
(
B
−
R
)
V
−
m
i
n
(
R
,
G
,
B
)
,
V=G
240
+
60
∗
(
R
−
G
)
V
−
m
i
n
(
R
,
G
,
B
)
,
V=B
V=max(R,G,B)\\ S=\begin{cases} 0,&\text{V=0}\\ \frac{v-min(R,G,B)}{V}, &\text{V其他情况} \end{cases}\\ H=\begin{cases} \frac{60*(G-B)}{V-min(R,G,B)},&\text{V=R}\\ 120+\frac{60*(B-R)}{V-min(R,G,B)}, &\text{V=G}\\ 240+\frac{60*(R-G)}{V-min(R,G,B)}, &\text{V=B}\\ \end{cases}
V=max(R,G,B)S={0,Vv−min(R,G,B),V=0V其他情况H=⎩
⎨
⎧V−min(R,G,B)60∗(G−B),120+V−min(R,G,B)60∗(B−R),240+V−min(R,G,B)60∗(R−G),V=RV=GV=B
计算结果可能存在H<0的情况,如果出现这种情况,则需要对H进行进一步计算,如下:
$H=\begin{cases}
H+360,&\text{H<0}\
H, &\text{其他情况}
\end{cases}\$
由上述公式可知:
$S\in[0, 1]\
V\in[0, 1]\
H\in[0, 360]\$
HLS色彩空间
HLS色彩空间包含三要素:色调H、光亮度\明度L、饱和度S与HSV色彩空间类似,只是HLS色彩空间用“光亮度/明度L”替换了“亮度”。
色调:表示人眼所能感知的颜色,在 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色彩空间,再将其转换到CIELa * b *色彩空间。_具体实现方法为:
$\begin{bmatrix}X\Y\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\0.212671&0.715160&0.072169\0.019334&0.119193&0.950227 \end{bmatrix}\begin{bmatrix}R\G\B \end{bmatrix}\
X=\frac{X}{X_n}, X_n=0.950456\
Z=\frac{Z}{Z_n}, Z_n=1.088754\
L=\begin{cases}
116Y^{\frac{1}{3}}-16,&\text{Y>0.008856}\
903.3Y, &\text{Y其他情况}
\end{cases}\
a=500*(f(X)-f(Y))+delta\
b=200*(f(Y)-f(Z))+delta\$
式中:
$f(t)=\begin{cases}
t^{\frac{1}{3}}-16,&\text{t>0.008856}\
7.787*t+\frac{16}{116}, &\text{其他情况}
\end{cases}\
delta=\begin{cases}
128,&\text{8位图像}\
0, &\text{单精度图像}
\end{cases}\$
由上述公式可知:
$L\in[0, 100]\
a\in[-127, 127]\
b\in[-127, 127]\$
CIELuv*色彩空间
CIEL * u * v * 色彩空间同 CIEL * a * b * 色彩空间一样,都是均匀的颜色模型。CIEL * u * v * 色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。
下面的公式给出了从RGB色彩空间到CIEL * u * v 色彩空间的转换公式。
从RGB色彩空间到XYZ色彩空间的转换:
$\begin{bmatrix}X\Y\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\0.212671&0.715160&0.072169\0.019334&0.119193&0.950227 \end{bmatrix}\begin{bmatrix}R\G\B \end{bmatrix}\$
从XYZ色彩空间到CIEL * u * v 色彩空间的转换:
$L=\begin{cases}
116Y^{\frac{1}{3}}-16,&\text{Y>0.008856}\
903.3*Y, &\text{其他情况}
\end{cases}\
u_1=\frac{4X}{X+15Y+3Z}\
v_1=\frac{9Y}{X+15Y+3Z}\
u=13L(u_1-u_n),u_n=0.19793943\
v=13L(v_1-v_n),v_n=0.46831096\$
所得结果中各个值的取值范围分别为:
$L\in[0, 100]\
u\in[-134, 220]\
v\in[-140, 122]\$
Bayer色彩空间
Bayer色彩空间(Bayer模型)被广泛地应用在CCD和CMOS相机中。它能够从如图所示的单平面R、G、B交错表内获取彩色图像。
输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。上述模式能够通过移动一个左边的像素或者上方的像素来完成修改。在函数cv2.cvtColor()的色彩空间转换参数中,通常使用两个特定的参数x和y来表示特定的模式。该模式组成通过图第二行中的第2列与第3列的值来指定。图就是典型的“BG”模式。
类型转换函数
在OpenCV中,我们使用cv2.cvtColor()函数进行色彩空间的转换。该函数可以实现多个色彩空间的转换。
dst = cv2.cvtColor(src,code[,dstCn])
dst:表示输出图像,与原始输入图像具有同样的数据类型和深度。
src:表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。
code:是色彩空间转换码。
dstCn:是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。
注意:BGR色彩空间与传统的RGB色彩空间不同。对于一个标准的24位位图,BGR色彩空中第1个字节存放的是蓝色组成的信息,第2个字节存放的是绿色组成的信息,第3个字节存放的是红色组成的的信息。
颜色空间的转换都用到了如下约定:
8位图像值的范围是[0,255]。
16位图像值的范围是[0,65 535]。
浮点数图像值的范围是[0.0~1.0]。
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rat=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("img=\n",img)
print("rat=\n",rat)
print("img[1,0,0]=",img[1,0,0])
print("img[1,0,1]=",img[1,0,1])
print("img[1,0,2]=",img[1,0,2])
print("像素点(1,0),直接计算得到的值=",
img[1,0,0]*0.114+img[1,0,1]*0.587+img[1,0,2]*0.299)
print("像素点(1,0)使用公式cv2.cvtColor()转换值=",rat[1,0])
img1=cv2.cvtColor(rat,cv2.COLOR_GRAY2BGR)
print("img1[1,0,0]=",img1[1,0,0])
print("img2[1,0,1]=",img1[1,0,1])
print("img3[1,0,2]=",img1[1,0,2])
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
bgr=cv2.cvtColor(rgb,cv2.COLOR_RGB2BGR)
print("rgb=\n",rgb)
print("bgr=\n",bgr)
标记指定颜色
通过inRange函数锁定特定值
OpenCV中通过函数cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:
dst=cv2.inRange(src,lowerb,upperb
式中:
dst表示输出结果,大小和src一样
src表示要检查的数组或者图像
lowerb表示范围下界
upperb表示范围上界
返回值dst和src等大小,其值取决于src中对应位置上 的值是否在处于区间[lowerb,upperb]内。
如果src值处于该区间内,则dst对应位置上的值为255
如果src值不处于该区间内,则dst对应位置上的值为0
img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
min=100
max=200
mask=cv2.inRange(img,min,max)
print("img=\n",img)
print("mask=\n",mask)
alpha通道
在RGB色彩空间三个通道的基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。这种4个通道的色彩空间被称为RGBA色彩空间,PNG图像是一种典型的4通道图像,alpha通道的赋值范围是[0,1],或者[0,255],表示从透明到不透明。