颜色空间转换
我们平时看到的彩色图像大多数都是RGB类型的,但是在图像处理时,需要用到灰度,二值,HSV,HSL等颜色空间(又称颜色模式)。
opencv中提供了cvtColor()来实现这些空间之间的转换。其定义如下:
void cvtColor(InputArray src,OutputArray dst,int code[,int dstCn=0]);
该函数参数解析如下:
InputArray src:输入图像,即要进行颜色空间转换的源图像,可以是Mat类。
OutputArray dst:输出图像,即进行颜色空间转换后的图像,也是Mat类。
int code:转换的代码或标识,即在此确定将说明模式的图像转换成什么模式的图像,,,,,,
int dstCn:目标图像通道数,如果取值为0,则由src和code确定。
该函数的作用是将图像从一个颜色空间转换到,另一个颜色空间。应该注意的是,从RGB颜色空间向其他颜色空间转换时。应注意的是,从RGB颜色空间向其他颜色空间转换时,必须明确指出图像的颜色通道。前面提到过,在OpenCv中,默认的颜色排列是BGR和RGB。所以对于24位颜色图像来说,前8位是蓝色,中间8位是绿色,最后8位是红色。常见的RGB通道的取值范围如下:
| 0~255 | CV_8U类型的图像 |
|---|---|
| 0~65535 | CV_16U类型的图像 |
| -3.4028235e+38~3.4028235e+38(书上给出的0 ~1,不太清楚后面明白了回来修改一下) | CV_32F类型的图像 |
对于线性变换来说,这些取值范围是无关紧要的。但是对于非线性变化,输入的RGB图像必须归一化到其对应的取值范围来获得最终正确的转换结果,例如RGB->CIE L * u * v * 转换。如果一个32位浮点图像直接从8位图像转化而不经过仍和缩放,那么它将具有0~ 255值的范围而不是函数假定的0~1.所以在调用cvtColor()函数之前,要先将图像缩小。
img *=1./255;
cvtColor(img,img,COLOR_BGR2Luv);
cvtColor()函数的转换代码(code)如表1-4所示:
转换类型和转换码
cv::cvtColor()支持多种颜色空间之间的转换,其支持的转换类型和转换码如下:
1、RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换
cv::COLOR_BGR2RGB
cv::COLOR_RGB2BGR
cv::COLOR_RGBA2BGRA
cv::COLOR_BGRA2RGBA
2、向RGB和BGR图像中增添alpha通道
cv::COLOR_RGB2RGBA
cv::COLOR_BGR2BGRA
3、从RGB和BGR图像中去除alpha通道
cv::COLOR_RGBA2RGB
cv::COLOR_BGRA2BGR
4、从RBG和BGR颜色空间转换到灰度空间
cv::COLOR_RGB2GRAY
cv::COLOR_BGR2GRAY
cv::COLOR_RGBA2GRAY
cv::COLOR_BGRA2GRAY
5、从灰度空间转换到RGB和BGR颜色空间
cv::COLOR_GRAY2RGB
cv::COLOR_GRAY2BGR
cv::COLOR_GRAY2RGBA
cv::COLOR_GRAY2BGRA
6、RGB和BGR颜色空间与BGR565颜色空间之间的转换
cv::COLOR_RGB2BGR565
cv::COLOR_BGR2BGR565
cv::COLOR_BGR5652RGB
cv::COLOR_BGR5652BGR
cv::COLOR_RGBA2BGR565
cv::COLOR_BGRA2BGR565
cv::COLOR_BGR5652RGBA
cv::COLOR_BGR5652BGRA
7、灰度空间域BGR565之间的转换
cv::COLOR_GRAY2BGR555
cv::COLOR_BGR5552GRAY
8、RGB和BGR颜色空间与CIE XYZ之间的转换
cv::COLOR_RGB2XYZ
cv::COLOR_BGR2XYZ
cv::COLOR_XYZ2RGB
cv::COLOR_XYZ2BGR
9、RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
cv::COLOR_RGB2YCrCb
cv::COLOR_BGR2YCrCb
cv::COLOR_YCrCb2RGB
cv::COLOR_YCrCb2BGR
10、RGB和BGR颜色空间与HSV颜色空间之间的相互转换
cv::COLOR_RGB2HSV
cv::COLOR_BGR2HSV
cv::COLOR_HSV2RGB
cv::COLOR_HSV2BGR
11、RGB和BGR颜色空间与HLS颜色空间之间的相互转换
cv::COLOR_RGB2HLS
cv::COLOR_BGR2HLS
cv::COLOR_HLS2RGB
cv::COLOR_HLS2BGR
12、RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
cv::COLOR_RGB2Lab
cv::COLOR_BGR2Lab
cv::COLOR_Lab2RGB
cv::COLOR_Lab2BGR
13、RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
cv::COLOR_RGB2Luv
cv::COLOR_BGR2Luv
cv::COLOR_Luv2RGB
cv::COLOR_Luv2BGR
14、Bayer格式(raw data)向RGB或BGR颜色空间的转换
cv::COLOR_BayerBG2RGB
cv::COLOR_BayerGB2RGB
cv::COLOR_BayerRG2RGB
cv::COLOR_BayerGR2RGB
cv::COLOR_BayerBG2BGR
cv::COLOR_BayerGB2BGR
cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR
上面的转换码是我copy的,懒得写了,原文链接:https://blog.csdn.net/weixin_51105360/article/details/113941015
下面是该函数使用的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
Mat src,dst,dst1;
src=imread("D:/360/lhc.png");
//判断函数是否载入成功
if(src.empty())
{
cout<<"can not open the image"<<endl;
return -1;
}
imshow("img",src);
cvtColor(src,dst,COLOR_BGR2GRAY);//转换为灰度图
cvtColor(src,dst1,COLOR_BGR2Lab);
imshow("img1",dst);
imshow("img2",dst1);
waitKey(0);
return 0;
}
本文详细介绍了OpenCV中的cvtColor函数,用于在RGB、BGR、灰度、HSV、HSL等多种颜色空间间转换图像,包括函数参数、常见转换类型和示例代码。

1万+

被折叠的 条评论
为什么被折叠?



