• OpenCV之cvtColor颜色空间转换


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

     C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
    • 参数解释: 

    . 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函数之前需要对图像进行缩放如下:

    1. img *= 1./255;
    2. cvtColor(img, img, CV_BGR2Luv);

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

            需要注意的是cvtColor()函数不能直接将RGB图像转换为二值图像(Binary Image),需要借助threshold()函数,其具体用法请查阅threshold().

    实例:

    1. #include <iostream>
    2. #include <opencv2/core.hpp>
    3. #include <opencv2/highgui.hpp>
    4. #include <opencv2/imgproc.hpp>
    5. using namespace std;
    6. using namespace cv;
    7. int main()
    8. {
    9. Mat srcImage = imread("星空.png");
    10. //判断图像是否加载成功
    11. if(!srcImage.data)
    12. {
    13. cout << "图像加载失败!" << endl;
    14. return false;
    15. }
    16. else
    17. cout << "图像加载成功!" << endl << endl;
    18. //显示原图像
    19. namedWindow("原图像",WINDOW_AUTOSIZE);
    20. imshow("原图像",srcImage);
    21. //将图像转换为灰度图,采用CV_前缀
    22. Mat grayImage;
    23. cvtColor(srcImage, grayImage, CV_BGR2GRAY);
    24. //将图像转换为灰度图
    25. namedWindow("灰度图",WINDOW_AUTOSIZE);
    26. imshow("灰度图",grayImage);
    27. //将图像转换为HSV,采用COLOR_前缀
    28. Mat HSVImage;
    29. cvtColor(srcImage, HSVImage, COLOR_BGR2HSV); //将图像转换为HSV图
    30. namedWindow("HSV",WINDOW_AUTOSIZE);
    31. imshow("HSV",HSVImage);waitKey(0);
    32. return 0;
    33. }

    原图:

    灰度图:

     

    HSV:

     

  • 相关阅读:
    Playwright直接控制本地Chrome浏览器的方法
    Github创建的个人简历
    导入JankStats检测卡帧库遇到问题记录
    关于python的数据可视化与可视化:数据读取
    【容器网络】跨主通信网络实现方法之UDP实现原理
    数据库基础知识
    区块链的风潮
    typescript里面一个问号(?)两个问号(??)一个感叹号(!)两个感叹号(!!)的用法和区别。
    Eslint配置
    合宙Air724UG LuatOS-Air LVGL API控件-开关 (Switch)
  • 原文地址:https://blog.csdn.net/hulinhulin/article/details/133018144