OpenCv学习笔记四——颜色空间转换

本文详细介绍了OpenCV中的cvtColor函数,用于在RGB、BGR、灰度、HSV、HSL等多种颜色空间间转换图像,包括函数参数、常见转换类型和示例代码。

颜色空间转换

我们平时看到的彩色图像大多数都是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~255CV_8U类型的图像
0~65535CV_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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值