图像处理读书旅行·在路上

【图像处理】OpenCV系列二十一 --- 颜色空间转换cvtC

2019-05-04  本文已影响228人  307656af5a04

上一节我们学习了用如何用threshold函数对一幅图像进行二值化,相信大家学习之后,已经有所了解,有的算法只支持对灰度图像进行二值化,那么我么如何将一幅彩色图像转换为灰度图像呢,我们今天讲的主角就是如何讲一幅彩色的图像转换为灰度图像,即cvtColor函数!

1、函数原型

void cvtColor(InputArray src, 
    OutputArray dst, 
    int code, 
    int dstCn = 0);

2、函数功能
转换图像的颜色空间;在RGB颜色空间转换的时候,应该显示的指定颜色空间的顺序,即是RGB还是BGR;OpenCV中默认的颜色空间是BGR,因此写代码实现的时候需要注意哦!因此,标准24位的彩色图像中的第一个字节是一个8位是B(蓝色通道),第二个字节是G(绿色通道),第三个字节是R(红色通道);对于后面的每一个图像像素,都是BGR,以此类推;

R、G和B通道值的范围
CV_8U图像通道值的范围为0-255;
CV_16U图像通道值的范围为0-65535;
CV_32F图像通道值的范围为0-1;

在线性变换的情况下,范围并不重要;但是在非线性变换的情况下,输入RGB图像应该归一化到适当的值范围,才能得到正确的结果;例如,从RGB颜色空间到LUV空间的转换;

例如,如果32位浮点图像直接从8位图像中转换而不进行任何缩放,那么它的值范围为0-255,而不是函数假定的0-1;

因此,在调用cvtColor之前,需要缩小图像,

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

如果你用cvtColor去处理8位的图像,在转换的过程中会有一些信息丢失!对于许多应用程序来说,这并不明显,但建议在需要全部颜色的应用程序中使用32位图像,或者在操作之前转换图像,然后再进行转换;

如果转换添加了alpha通道,则将其值设置为相应通道范围的最大值:

例如:CV_8U设置为255
CV_16U设置为65535
CV_32F设置为1

3、参数详解

4、常用的颜色空间转换表示(用于函数的第三个参数)
(1)COLOR_BGR2BGRA 、COLOR_RGB2RGBA
将alpha通道增加到BGR或者RGB图像中

(2)COLOR_BGRA2BGR、COLOR_RGBA2RGB
从图像中移除alpha通道

(3)COLOR_BGR2GRAY 、COLOR_RGB2GRAY
将RGB/BGR颜色空间转换为GRAY颜色空间,即将彩色图转换为灰度图

暂时就列出这几个常用的,如果需要其他的可以到OpenCV的官网上查文档哦!

5、实验案例

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv)
{
    // 载入图像
    Mat srcImage = imread("lena.png");

    Mat dstImage;
    // 对图像进行颜色空间的转换
    // 将BGR图像转换为灰度图像
    cvtColor(srcImage, dstImage, 
        COLOR_BGR2GRAY);

    namedWindow("原图");
    namedWindow("效果图");

    // 显示原图与灰度图
    imshow("原图", srcImage);
    imshow("效果图", dstImage);

    waitKey(0);
    return 0;
}

6、实验结果

原图(左)与效果图(右)

我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C语言编程,C++语言编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!

上一篇下一篇

猜你喜欢

热点阅读