图像颜色空间
+++
1. 颜色模型与转换
在opencv中,32F
和64F
表示的范围都是0.0~1.0
,8U
的范围是0~255
。
其实是将0~1
映射到0~255
,小于0
的部分全部变为纯黑,大于1
的部分全部变为纯白
RGB
颜色模型
由红色(red)、绿色(green)、蓝色(blue)组成**(opencv中的顺序时BGR)**。每个通道的范围是0~255
,0表示纯黑、255表示纯白。在此基础上增加第4个通道就构成了RGBA
模型,A即透明度。
HSV
颜色模型
由色度(Hue)、饱和度(Saturation)、亮度(Value)组成。
色度指颜色,用角度表示,取值范围为[0°,360°]
,0°和360°
表示红色、60°
表示黄色、120°
表示绿色…以此类推
饱和度表示颜色的纯度或浓度,取值范围为0~100%
,0表示灰色阴影,100%
表示纯色,没有混合的灰度,中间值表示颜色的饱和度介于完全灰色和纯色之间。
明度表示颜色的亮度或明暗程度,其范围为0~100%
,0表示黑色,100%
表示白色,中间值表示颜色的不同明度级别。
GRAY
颜色模型
GRAY
模型不是一个彩色模型,而是一个灰度图像模型,只有单通道。其取值范围为0~MAX
,依次表示由黑到白,如8UC1
中取值范围是0~255
。
灰度图只包含亮度信息,更容易处理和分析,不需要考虑颜色的变化。并且灰度图具有相同尺寸相同压缩格式所占容量小、易采集、便于传输等优点。在许多情况下,将彩色图像转化为灰度图是常用的操作,减少原图像数据的复杂性并保留其亮度信息
RGB
模型转化为GRAY
模型的关系:
G
R
A
Y
=
0.3
R
+
0.59
G
+
0.11
B
GRAY = 0.3R + 0.59G + 0.11B
GRAY=0.3R+0.59G+0.11B
+++
opencv
API
void cv::Mat::convertTo(OutputArray m,int rtype,double alpha = 1.0,double beta = 0.0) const
m
:表示转换后的图像rtype
:转换图像的数据类型,如CV_8U
、CV_32F
等alpha
:可选参数,表示缩放因子beta
:可选参数,表示偏置因子
这是一个成员函数,用于将图像的数据类型进行转换
转换公式:
m
(
i
,
j
)
=
s
a
t
u
r
a
t
e
_
c
a
s
t
<
r
t
y
p
e
>
(
α
(
∗
t
h
i
s
)
(
i
,
j
)
+
β
)
m
(
i
,
j
)
表示转换图像在
(
i
,
j
)
处的像素值
s
a
t
u
r
a
t
e
_
c
a
s
t
<
r
t
y
p
e
>
是一个饱和度转换函数,它将结果限制在指定数据类型的范围内
α
是缩放因子
,
用于对像素值进行缩放
β
是偏置因子
,
用于对像素值进行偏移
(
∗
t
h
i
s
)
(
i
,
j
)
表示原始图像在该位置处的像素值
m(i,j) = saturate\_cast<rtype>(\alpha (*this)(i,j)+\beta) \\ m(i,j)表示转换图像在(i,j)处的像素值 \\ saturate\_cast<rtype>是一个饱和度转换函数,它将结果限制在指定数据类型的范围内\\ \alpha 是缩放因子,用于对像素值进行缩放\\ \beta 是偏置因子,用于对像素值进行偏移 \\ (*this)(i,j)表示原始图像在该位置处的像素值
m(i,j)=saturate_cast<rtype>(α(∗this)(i,j)+β)m(i,j)表示转换图像在(i,j)处的像素值saturate_cast<rtype>是一个饱和度转换函数,它将结果限制在指定数据类型的范围内α是缩放因子,用于对像素值进行缩放β是偏置因子,用于对像素值进行偏移(∗this)(i,j)表示原始图像在该位置处的像素值
这个公式的本质就是将原始图像的像素值进行线性变换然后将结果存储到新的图像中完成对图像的数据类型转换。
void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn = 0)
src
:待转换的原始图像dst
:输出图像,转换后的图像code
:转换代码,指定要执行的颜色空间模型转换cv::COLOR_BGR2GRAY
:BGR到灰度
cv::COLOR_BGR2HSV
:BGR到HSV
- …
dstCn
:可选参数,指定输出图像的通道数。默认值为0表示自动确定通道数
用于将图像从一种颜色模型转换为另一种颜色模型的图像,例如将RGB
转换为灰度图等。
+++
2.多通道分离与合并
在图像颜色模型中,不同分量存放在不同的通道中,如果我们只需要一个通道的数据,我们就可以将该通道分离出来,这种方式可以减少数据所占据的内存,加快程序运行速度;同时,我们也可以将分离出的通道进行合并生成多通道图像。
opencv
API
void cv::split(InputArray src,OutputArrayOfArray dst)
src
:待分离的多通道图像dst
:分离后的所有单个通道组成的数组(vector存的),也就是vector<Mat> dst
用于将多通道图像分割成单通道图像
它的一个重载版本
void cv::split(InputArray src,Mat* mv)
它的第二个参数是一个普通数组来存每个通道,这个数组的大小要与通道数相同。
void cv::merge(InputArrayOfArrays mv,OutputArray dst)
mv
:待合并的单通道图像数组(vector形式)dst
:合并后的图像
用于将多个单通道图像合并为一个多通道图像
它的一个重载版本
void cv::merge(const Mat* mv,size_t count,OutputArray dst)
它的第一个参数是数组形式,第二个参数是指定要合并的通道数(如果数组大小>count,按照count指定的通道个数合并)
用于合并的多个通道必须具有相同的尺寸和数据类型