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

 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
  • 1

参数解释: 
. 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);
  • 1
  • 2

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

 
这里列出的类型并不齐全,但是对于一般的图像处理已经够用。需要特别说明的是RGB–>GRAY的转换是我们常用的转换格式,其转换公式如下: 
 
上图中出现的RGBA格式图片,RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间。虽然它有时候被描述为一个颜色空间,但是它其实是RGB模型附加了额外的信息,可以属于任何一种RGB颜色空间。Alpha参数一般用作不透明度参数,如果一个像素的alpha通道数值为0%,那它就是完全透明的也就是肉眼不可见,而数值为100%则意味着一个完全不透明的像素,传统的数字图像就是alpha值为100%,这种性质可以参考前面的文章《opencv(九)之Trackbar滑动条创建和使用》,通过TrackBar对alpha值的调节能有更直观的认识。 
需要注意的是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;}elsecout << "图像加载成功!" << 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

运行结果如下: 
原图像 
 
灰度图 
 
HSV 

opencv学习(十六)之颜色空间转换cvtColor()相关推荐

  1. opencv学习十六:圆检测

    圆检测 原理 圆周上任意三点所确定的圆,经Hough变换后在三维参数空间应对应一点.遍历圆周上所有点,任意三个点所确定的候选圆进行投票.遍历结束后,得票数最高点(理论上圆周上任意三点确定的圆在Houg ...

  2. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  3. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  4. PyTorch框架学习十六——正则化与Dropout

    PyTorch框架学习十六--正则化与Dropout 一.泛化误差 二.L2正则化与权值衰减 三.正则化之Dropout 补充: 这次笔记主要关注防止模型过拟合的两种方法:正则化与Dropout. 一 ...

  5. Python的学习(十六):对文件的操作

    Python的学习(十六):对文件的操作 编码格式的介绍 Python中的解释器使用的是Unicode(内存) .py文件在磁盘上使用UTF-8存储(外存) 如何修改文件格式?不写的话默认为UTF-8 ...

  6. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  7. 强化学习(十六) 深度确定性策略梯度(DDPG)

    在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...

  8. opencv学习(六)之掩膜版

    可以通过掩模矩阵(通常来讲叫核)对图像的每个图像像素值重新计算.这个掩模板能够调整临近像素包括当前像素对新像素的影响程度.从数学的角度来讲,我们用特殊的值对当前的值做了一个加权平均的操作.举个例子,设 ...

  9. 二、八、十、十六 进制转换(B、O\Q、D、H)

    二进制 (B​​​​​​​  Binary ​​​​​​​)  --> 八进制(Octal O/Q) 整数部分:从小数点右到左 三 位对一位,位数不够时,左添0 小数部分:从小数点左到右  三 ...

最新文章

  1. 五、cookie和web缓存
  2. AndroidStudio中打开新项目提示:This version of the Android Support plugin for IntelliJ IDEA (or Android Studi
  3. k8s Service的类型和实现流程图解
  4. android黑科技系列——爆破一款应用的签名验证问题
  5. MySQl求奇数和函数_收集的48个Shell脚本小技巧
  6. Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件
  7. hibernate自带的注解和jpa注解的冠希
  8. MEMCACHED在集群环境下对并发更新是否保持数据一致
  9. 如何合理地建立 Mysql 索引
  10. 最新手机号段归属地数据库 高性能dat解析
  11. php strict warning,PHP Warning: Unsupported declare 'strict_types' in ...
  12. http://zaojiasys.jianshe99.com 建造师数据泄漏,可以查看全部所有人的信息!
  13. _Generic示例
  14. layer.open属性详解 layui弹出层
  15. 把sql转换为pdm
  16. 网易163邮箱无法使用第三方客户端登录问题解决
  17. 【ES6】es6新特性
  18. 【2020 春招实习小米面试题】最大映射
  19. 学习Direct3D的好地方
  20. 基于sklearn随机森林算法对鸢尾花数据进行分类

热门文章

  1. 用专业的说一句情话 计算机,用电脑专业说一句情话
  2. java 中向文本写入和读取hashmap_就靠这一篇HashMap的讲解,我与头条面试官聊了一个小时。...
  3. 详解 RestTemplate 操作
  4. 天猫国际618一骑绝尘,占中国跨境进口电商总订单超七成
  5. 基于Atmega8单片机的串口收发程序
  6. CentOS7定制封装发行版-基于CentOS minimal
  7. Alchemy环境的搭建
  8. python 学习 之 第二章(条件、循环和其他语句)
  9. 第五节13读取配置中的连接字符串
  10. 博客园的“随笔、文章、新闻、日记有啥区别”