一. 色彩空间介绍
① RGB/BGR色彩空间
计算机色彩显示器和彩色电视机显示色彩的原理一样,都是采用R,G,B相加混色的原理,通过发射出三种不同强度的电子束,使得屏幕内侧覆盖的红,吕蓝磷光材料发光而产生色彩.这种色彩的表示方法称为RGB色彩空间表示.在RGB颜色空间中,任意色光F都可以用RGB三色不同分量的相加混合而成:
F = r[R] + r[G] +r[B]
RGB色彩空间还可以用一个三维的立方体来描述.当三基色分量都为0(最弱)时,混合为黑色光,当三基色都为k(最大,值由存储空间决定)时混合为白色光.
opencv中R,G,B三通道取值范围均为[0,255]
② 为什么Opencv中采用的是BGR
历史原因: 因为opencv诞生的时候,那个时候的相机开发和软件开发商使用的都是BGR通道.
③ HSV色彩空间
HSV使用一个倒锥体或者是圆柱体来表示
HSV表示彩色图像的方式由三部分组成:
Hue: 色调,色相Saturation: 饱和度,色彩纯净度Value: 明度
Hue: Hue 用角度度量,取值范围是0~360°,表示色彩信息,即所处的光谱的颜色的位置. 表示如下: 颜色圆环上所有的颜色都是光谱上的颜色,从红色开始按逆时针方向旋转,Hue=0表示红色,Hue=120表示绿色,Hue=240表示蓝色,在GRB中,颜色由三个值共同决定,比如黄色为(255,255,0),在HSV中,黄色只有一个值决定,Hue=60即可.
HSV 圆柱体的半边横截面 (Hue=60): 其中水平方向表示饱和度,饱和度表示颜色接近光谱色的程度.饱和度越高,说明颜色越深,越接近光谱色.饱和度越低,说明颜色越浅,越接近白色.饱和度为0表示纯白色.取值范围为0-100%,值越大,颜色越饱和.
竖直方向表示明度,决定颜色空间中颜色的明暗程序,明度越高,表示颜色越明亮,范围是0-100%.明度为0表示纯黑色(此时颜色最暗)
可以通俗的理解为: 在Hue一定的情况下,饱和度减小,就是往光谱中添加白色,光谱色所占的比例也在减小,饱和度减少到0,表示光谱所占的比例为零,导致整个颜色呈现白色.
明度减小,就是往光谱中添加黑色,光谱色所占用比例也在减小,明度减为0,表示光谱色所占的比例为0,导致整个颜色呈现黑色.
HSV对用户来说是一种比较直观的颜色模型.我们可以很轻松地得到单一的颜色,即指定颜色角H,并让V=S=1,然后通过向其中加入黑色和白色来得到我们需要的颜色.增加黑色可以减小V而S表示不变,同样增加白色尅减小S而V不变.
注意: 在Opencv中hsv的取值范围分别是: H(0~180) S:(0-255),V:(0-255);
HSV颜色基本对照表
二.色彩空间转换
① cvtColor()函数原型
void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0);
参数:
src: 输入图像,要进行颜色转换的原图像,可以是Mat实例对象.dst: 输出图像,转换后的图像,可以是Mat的实例对象.code: 转换的代码和标识,就是将什么类型的图片转换为什么类型的图片dstCn: 目标图像通道数,如果取值为0,则由src和code决定
code第三个参数常用的值:
取值 | 说明 |
---|
COLOR_BGR2GRAY | 彩色的BGR通道图像转换为灰度图像 | COLOR_GRAY2BGR | 灰度图像转换为彩色的BGR通道图像 | COLOR_BGR2HSV | BGR通道彩色图像转换为HSV通道图像 | COLOR_HSV2BGR | HSV通道图像转换为BGR通道图像 |
② 颜色空间转换案例
#include"MyOpencv.h"
string imagePath = IMAGE_PATH + "\\green.jpg";
int main()
{
Mat src = imread(imagePath, IMREAD_COLOR);
if (src.empty())
{
cout << "文件读取失败,请确认路径是否正确: " << imagePath << endl;
}
else
{
Mat imageRGB, imageGray, imageHSV;
cvtColor(src, imageRGB, COLOR_BGR2RGB);
cvtColor(src, imageGray, COLOR_BGR2GRAY);
cvtColor(src, imageHSV, COLOR_BGR2HSV);
imshow("Original", src);
waitKey(0);
imshow("RGB", imageRGB);
waitKey(0);
imshow("Gray", imageGray);
waitKey(0);
imshow("HSV", imageHSV);
waitKey(0);
}
return 0;
}
|