OpenCV之cvtColor颜色空间转换

2023-09-19 10:57:35

        大多数彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:

 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
  • 参数解释: 

. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类 ;
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类 ;
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细说明
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定;

        函数的作用是将一个图像从一个颜色空间转换到另一个颜色空间,但是从RGB向其他类型转换时,必须明确指出图像的颜色通道,前面我们也提到过,在opencv中,其默认的颜色制式排列是BGR而非RGB。所以对于24位颜色图像来说,前8-bit是蓝色,中间8-bit是绿色,最后8-bit是红色。常见的R,G,B通道的取值范围为: 
. 0-255 :CV_8U类型图片 
. 0-65535: CV_16U类型图片 
. 0-1: CV_32F类型图片 

        对于线性变换来说,这些取值范围是无关紧要的。但是对于非线性转换,输入的RGB图像必须归一化到其对应的取值范围来或得最终正确的转换结果,例如从RGB->L*u*v转换。如果从一个8-bit类型图像不经过任何缩放(scaling)直接转换为32-bit浮点型图像,函数将会以0-255的取值范围来取代0-1的取值范围,所以在使用cvtColor函数之前需要对图像进行缩放如下:

img *= 1./255;
cvtColor(img, img, CV_BGR2Luv);

        如果对8-bit图像使用cvtColor()函数进行转换将会由一些信息丢失。函数可以做下面类型的转换,需要说明的是在opencv2.x时颜色空间转换code用的宏定义是CV_前缀开头,而在opencv3.x版本其颜色空间转换code宏定义更改为COLOR_开头,而经验证,2.4.13版本中opencv同事支持这两种形式的写法。故下面表格会将两种code类型同时列出,以供参考:

        需要注意的是cvtColor()函数不能直接将RGB图像转换为二值图像(Binary Image),需要借助threshold()函数,其具体用法请查阅threshold().

实例:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
    Mat srcImage = imread("星空.png");
    //判断图像是否加载成功
    if(!srcImage.data)
    {
        cout << "图像加载失败!" << endl;
        return false;
    }
    else
    cout << "图像加载成功!" << endl << endl;
    //显示原图像
    namedWindow("原图像",WINDOW_AUTOSIZE);
    imshow("原图像",srcImage);

    //将图像转换为灰度图,采用CV_前缀
    Mat grayImage;
    cvtColor(srcImage, grayImage, CV_BGR2GRAY);     
    //将图像转换为灰度图
    namedWindow("灰度图",WINDOW_AUTOSIZE);
    imshow("灰度图",grayImage);
    //将图像转换为HSV,采用COLOR_前缀
    Mat HSVImage;
    cvtColor(srcImage, HSVImage, COLOR_BGR2HSV);    //将图像转换为HSV图        
    namedWindow("HSV",WINDOW_AUTOSIZE);
    imshow("HSV",HSVImage);waitKey(0);
    return 0;
}

原图:

灰度图:

 

HSV:

 

更多推荐

小米华为,化干戈为玉帛!

近日来,手机圈又掀起了各大厂家推出新品的高潮。首先是华为Mate60的推出,其自研的麒麟9000S芯片瞬间点燃了国内手机市场,得到了国内甚至国外业界人士的认可和好评。而近日网上盛传的小米创始人雷军的“愿意加入华为技术生态圈”的邀请,引起了网友们的高度关注。截图自今日头条@刘哥抖料大家都知道,小米采用的是高通芯片和谷歌操

代码签名证书品牌哪家好?选微软推荐机构

代码签名证书是保护软件代码完整性及来源可信的重要方式,软件程序要在操作系统中运行,就需要使用权威合规的代码签名证书,对软件代码进行数字签名,确保软件来源可信、未被非法篡改,消除操作系统“未知发布者”警告,让软件能够顺畅运行。众多代码签名证书厂商中,哪些厂商提供的代码签名证书才是获得操作系统信任的呢?本文将为大家介绍,如

【JVM】类加载器

类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加

springboot实战(七)之jackson配置前后端交互下划线转驼峰&对象序列化与反序列化

目录环境:1.驼峰转下划线配置1.1单个字段命名转化使用@JsonProperty注解1.2单个类进行命名转化使用@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)注解3.全局命名策略配置2.序列化以及反序列化2.1序列化2.2反序列化3.自定义序

ref和reactive区别

使用区别reactive定义引用数据类型,ref定义基本类型reactive定义的变量直接使用,ref定义的变量使用时需要.value模板中均可直接使用,vue帮我们判断了是reactive还是ref定义的(通过__v_isRef属性),从而自动添加了.value。//定义letcount=ref(0);letobj=

好用的记笔记app选哪个?

当你在日常生活中突然获得了一个灵感,或者需要记录会议的重要内容,或者是学校课堂上的笔记,你通常会拿出手机,因为它总是在你身边,随时可用。这时候,一款好的记笔记App可以让你事半功倍。敬业签是一款全面的云端备忘记事软件,支持在Windows/Web/Android/iOS/Mac/HarmonyOS等端口同步和编辑记事内

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术(十)——决策树算法实操文章目录机器学习技术(十)——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据五、数据预处理1、选择数据2、数据转码六、建模与参数优化1、训练模型2、评估模型3、调参优化七、模型可视化八、决策树实操总结一、引言决策树部分主要包含基于py

django_model_一对一映射

settings相关配置#settings.py...DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'djangos','USER':'root','PASSWORD':'990212','HOST':'localhost','PORT

【TCP】滑动窗口、流量控制 以及拥塞控制

滑动窗口、流量控制以及拥塞控制1.滑动窗口(效率机制)2.流量控制(安全机制)3.拥塞控制(安全机制)1.滑动窗口(效率机制)TCP使用确认应答策略,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候。既然这样一发一收的

大厂超全安全测试--关于安全测试的分类及如何测试

安全测试(总结)1.jsonNP劫持(其实json劫持和jsonNP劫持属于CSRF跨站请求伪造)的攻击范畴,解决方法和CSRF一样定义:构造带有jsonp接口的恶意页面发给用户点击,从而将用户的敏感信息通过jsonp接口传输到攻击者服务器json语法规则:数据在名称/值对中、数据由逗号分隔、花括号保存对象、方括号保存

循环神经网络——中篇【深度学习】【PyTorch】【d2l】

文章目录6、循环神经网络6.4、循环神经网络(`RNN`)6.4.1、理论部分6.4.2、代码实现6.5、长短期记忆网络(`LSTM`)6.5.1、理论部分6.5.2、代码实现6.6、门控循环单元(`GRU`)6.6.1、理论部分6.6.2、代码实现6、循环神经网络6.4、循环神经网络(RNN)6.4.1、理论部分原理

热文推荐