Opencv

Opencv,第1张

文章目录
      • 一. 色彩空间介绍
        • ① RGB/BGR色彩空间
        • ② 为什么Opencv中采用的是BGR
        • ③ HSV色彩空间
      • 二.色彩空间转换
        • ① cvtColor()函数原型
        • ② 颜色空间转换案例

一. 色彩空间介绍 ① 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_BGR2HSVBGR通道彩色图像转换为HSV通道图像
COLOR_HSV2BGRHSV通道图像转换为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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/737449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存