- 一. 色彩空间介绍
- ① RGB/BGR色彩空间
- ② 为什么Opencv中采用的是BGR
- ③ HSV色彩空间
- 二.色彩空间转换
- ① cvtColor()函数原型
- ② 颜色空间转换案例
计算机色彩显示器和彩色电视机显示色彩的原理一样,都是采用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③ HSV色彩空间历史原因: 因为opencv诞生的时候,那个时候的相机开发和软件开发商使用的都是BGR通道.
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颜色基本对照表
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通道图像 |
/*----------------------------------------------------------------
* 项目: Classical Question
* 作者: Fioman
* 邮箱: geym@hengdingzhineng.com
* 时间: 2022/3/22
* 格言: Talk is cheap,show me the code ^_^
//----------------------------------------------------------------*/
#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;
// 转换成RGB格式图片
cvtColor(src, imageRGB, COLOR_BGR2RGB);
// 转换成灰度图像
cvtColor(src, imageGray, COLOR_BGR2GRAY);
// 转换成HSV图像
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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)