【OpenCV3图像处理】颜色空间转换(二)转换函数 cvtColor()
2017-05-02 10:17
1006 查看
opencv中颜色空间转换函数cvtColor()详解
颜色空间的分类,和不同类型颜色空间的用途,参考博客 :颜色空间分类总结
opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:
void cvtColor(InputArray src, OutputArray dst, int code,int dstCn=0 );
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类,输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类,输出的8-bit,
16-bit或 32-bit单倍精度浮点数影像。
. 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函数之前需要对图像进行缩放如下:
如果图像不转换为0-1之间的32-bit浮点型图像,直接对8-bit图像使用cvtColor()函数进行转换,将会由一些信息丢失。
函数可以做下面类型的转换,需要说明的是在opencv2.x时颜色空间转换code用的宏定义是CV_前缀开头,而在opencv3.x版本其颜色空间转换code宏定义更改为COLOR_开头,2.4.13版本中opencv同事支持这两种形式的写法
上图中出现的RGBA格式图片,RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间。虽然它有时候被描述为一个颜色空间,但是它其实是RGB模型附加了额外的信息,可以属于任何一种RGB颜色空间。Alpha参数一般用作不透明度参数,如果一个像素的alpha通道数值为0%,那它就是完全透明的也就是肉眼不可见,而数值为100%则意味着一个完全不透明的像素,传统的数字图像就是alpha值为100%。
下面给出RGB , 灰度图,HSV,Lab之间的转换,如果要转换到其他颜色空间,cvtColor()的用法类似
示例代码:
从RGB图像到灰度图像:
RGB和HSV相互转化
H、S、V三通道分别单独显示:
RGB转化为HSV的结果,和HSV转化为RGB的结果:
RGB和Lab相互转化
L、a、b三通道分别单独显示:
RGB转化为Lab的结果,和Lab转化为RGB的结果:
完整示例代码:
颜色空间的分类,和不同类型颜色空间的用途,参考博客 :颜色空间分类总结
opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:
void cvtColor(InputArray src, OutputArray dst, int code,int dstCn=0 );
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类,输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类,输出的8-bit,
16-bit或 32-bit单倍精度浮点数影像。
. 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.0/255; cvtColor(img, img,CV_BGR2Luv);
如果图像不转换为0-1之间的32-bit浮点型图像,直接对8-bit图像使用cvtColor()函数进行转换,将会由一些信息丢失。
函数可以做下面类型的转换,需要说明的是在opencv2.x时颜色空间转换code用的宏定义是CV_前缀开头,而在opencv3.x版本其颜色空间转换code宏定义更改为COLOR_开头,2.4.13版本中opencv同事支持这两种形式的写法
上图中出现的RGBA格式图片,RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间。虽然它有时候被描述为一个颜色空间,但是它其实是RGB模型附加了额外的信息,可以属于任何一种RGB颜色空间。Alpha参数一般用作不透明度参数,如果一个像素的alpha通道数值为0%,那它就是完全透明的也就是肉眼不可见,而数值为100%则意味着一个完全不透明的像素,传统的数字图像就是alpha值为100%。
下面给出RGB , 灰度图,HSV,Lab之间的转换,如果要转换到其他颜色空间,cvtColor()的用法类似
示例代码:
从RGB图像到灰度图像:
Mat srcImage = imread("4.2.03.tiff"); if (!srcImage.data) { cout << "图像加载失败!" << endl; return false; } else cout << "图像加载成功!" << endl << endl; imshow("原图像", srcImage); //将图像转换为灰度图 Mat grayImage; cvtColor(srcImage, grayImage, CV_BGR2GRAY); imshow("灰度图", grayImage);
RGB和HSV相互转化
Mat srcImage = imread("4.2.03.tiff"); if (!srcImage.data) { cout << "图像加载失败!" << endl; return false; } else cout << "图像加载成功!" << endl << endl; imshow("原图像", srcImage); //将RGB图像转换为HSV图 Mat HSVImage; Mat Image[3]; cvtColor(srcImage, HSVImage, COLOR_BGR2HSV); split(HSVImage, Image); imshow("H", Image[0]); imshow("S", Image[1]); imshow("V", Image[2]); imshow("HSV", HSVImage); //将HSV图像转换为RGB图 Mat RGBImage; cvtColor(HSVImage, RGBImage, COLOR_HSV2BGR); imshow("RGB1", RGBImage);
H、S、V三通道分别单独显示:
RGB转化为HSV的结果,和HSV转化为RGB的结果:
RGB和Lab相互转化
Mat srcImage = imread("4.2.03.tiff"); if (!srcImage.data) { cout << "图像加载失败!" << endl; return false; } else cout << "图像加载成功!" << endl << endl; imshow("原图像", srcImage); //将RGB图像转换为Lab图 Mat LabImage; Mat Image[3]; cvtColor(srcImage, LabImage, COLOR_BGR2Lab); split(LabImage, Image); imshow("L", Image[0]); imshow("a", Image[1]); imshow("b", Image[2]); imshow("Lab", LabImage); //将Lab图像转换为RGB图 Mat RGBImage; cvtColor(LabImage, RGBImage, COLOR_Lab2BGR); imshow("RGB2", RGBImage);
L、a、b三通道分别单独显示:
RGB转化为Lab的结果,和Lab转化为RGB的结果:
完整示例代码:
#include <iostream> #include <opencv.hpp> using namespace std; using namespace cv; int main() { Mat srcImage = imread("4.2.03.tiff"); if (!srcImage.data) { cout << "图像加载失败!" << endl; return false; } else cout << "图像加载成功!" << endl << endl; imshow("原图像", srcImage); //将图像转换为灰度图 Mat grayImage; cvtColor(srcImage, grayImage, CV_BGR2GRAY); imshow("灰度图", grayImage); //将RGB图像转换为HSV图 Mat HSVImage; Mat Image[3]; cvtColor(srcImage, HSVImage, COLOR_BGR2HSV); split(HSVImage, Image); imshow("H", Image[0]); imshow("S", Image[1]); imshow("V", Image[2]); imshow("HSV", HSVImage); //将HSV图像转换为RGB图 Mat RGBImage; cvtColor(HSVImage, RGBImage, COLOR_HSV2BGR); imshow("RGB1", RGBImage); //将RGB图像转换为Lab图 Mat LabImage; cvtColor(srcImage, LabImage, COLOR_BGR2Lab); split(LabImage, Image); imshow("L", Image[0]); imshow("a", Image[1]); imshow("b", Image[2]); imshow("Lab", LabImage); //将Lab图像转换为RGB图 cvtColor(LabImage, RGBImage, COLOR_Lab2BGR); imshow("RGB2", RGBImage); waitKey(0); return 0; }
相关文章推荐
- 【OpenCV学习笔记】【函数学习】五(颜色空间转换cvCvtColor()函数)
- opencv学习(十六)之颜色空间转换cvtColor()
- OpenCV: 颜色空间转换 cvtColor()出错?注意浮点数精度
- opencv: 颜色空间转换(cv2.cvtColor) 探究(图示+源码)
- 【OpenCV3图像处理】颜色空间转换(一)颜色空间分类总结
- OpenCV之颜色空间转换:cvtColor()函数
- opencv学习(十六)之颜色空间转换cvtColor()
- 【OpenCV3】颜色空间转换——cv::cvtColor()详解
- 【OpenCV3】颜色空间转换——cv::cvtColor()详解
- OpenCV 之 cvCvtColor (色彩空间转换)
- opencv android 图像处理错误error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(const
- opencv-python 读取图像并转换颜色空间
- python3-opencv库(3)--图片颜色空间转换,利用HSV进行物体跟踪,图像通道分离与合并
- 图像处理基础-颜色空间转换(3)
- 【opencv+python】图像处理之一、颜色空间RGB,Gray与HSV
- opencv学习之图像颜色空间转换
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- 图像处理算法基础(一)---图像颜色空间转换
- 【OpenCV】颜色空间(RGB,HSV与Gray)及图像处理中的颜色识别