opencv学习之颜色空间转换cvtColor()
我们生活中大多数看到的彩色图片都是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;
}
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
opencv学习之颜色空间转换cvtColor()的更多相关文章
- opencv学习笔记——颜色空间转换函数cv::cvtColor详解
cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致. 具体 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓
本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...
- opencv学习之基础
前段时间一直在钻研深度学习中的卷积神经网络,其中的预处理环节可以说非常关键,主要就是对图片和视频进行处理.而图像处理就涉及到图形学和底层技术细节,这是一个比较精深和专业的领域,假设我们要从头开始做起, ...
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
随机推荐
- 在系统下使用命令安装gnome图形界面程序
yum groupinstall "GNOME Desktop" "Graphical Administration Tools" reboot 记得别忘了更新 ...
- .net core3.0 webapi搭建(一)
一.创建WebApi项目: 生成项目之后,控制器默认生成了一个WeatherForecastController 我们可以直接启动项目,F5调试,默认进入WeatherForecastControll ...
- ES6 class(基本语法+方法)
静态属性与静态方法 1. 不会被类实例所拥有的属性与方法 只是类自身拥有2. 只能通过类调用 静态方法与普通方法重名,不会冲突static 关键字(静态方法) 静态属性类名.属性名 = 属性值; 1. ...
- Linux网络课程学习第六天
本节课程主要内容:针对第四章节进行了收尾,以及对第五章的用户身份与文件权限进行了详细讲解. 学习心得:干货很多,收获满满.
- 修改testlink上传文件大小
大家在使用testlink导入测试时,可能会遇到由于上传的文件太大,而不能上传的现象.当然建议大家在导入用例或者上传文件时,不要上传过大的文件,因为这样的速度确实非常慢.可是由于特殊的原因我们必须要导 ...
- python3练习100题——051
题目:学习使用按位与 & . 不会的知识点,查了一下按位运算. 按位运算符是把数字看作二进制来进行计算的. 运算符 描述 实例 & 按位与运算符:参与运算的两个值,如果两个相应位都为1 ...
- H5_0015:判断是否是微信加载
var e = document.createElement("script"); e.src = "https://res.wx.qq.com/open ...
- java学习笔记之反射—Class类实例化和对象的反射实例化
反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,可以采用三种方式完成. java.lang.Class类的定义: public f ...
- chrome json接口数据 插件
chrome json接口数据 插件 JSON-Handle 官网 下载后 地址栏输入 chrome://extensions/ 将下载的文件拖入页面 OK
- Java并发,synchronized锁住的内容
synchronized用在方法上锁住的是什么? 锁住的是当前对象的当前方法,会使得其他线程访问该对象的synchronized方法或者代码块阻塞,但并不会阻塞非synchronized方法. 脏读 ...