opencv学习之颜色空间转换cvtColor()

Posted 留下我美梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习之颜色空间转换cvtColor()相关的知识,希望对你有一定的参考价值。

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

 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
  • 1

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

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

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

技术分享图片
这里列出的类型并不齐全,但是对于一般的图像处理已经够用。需要特别说明的是RGB–>GRAY的转换是我们常用的转换格式,其转换公式如下: 
技术分享图片 
上图中出现的RGBA格式图片,RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间。虽然它有时候被描述为一个颜色空间,但是它其实是RGB模型附加了额外的信息,可以属于任何一种RGB颜色空间。Alpha参数一般用作不透明度参数,如果一个像素的alpha通道数值为0%,那它就是完全透明的也就是肉眼不可见,而数值为100%则意味着一个完全不透明的像素,传统的数字图像就是alpha值为100%,这种性质可以参考前面的文章《opencv(九)之Trackbar滑动条创建和使用》,通过TrackBar对alpha值的调节能有更直观的认识。 
需要注意的是cvtColor()函数不能直接将RGB图像转换为二值图像(Binary Image),需要借助threshold()函数,其具体用法请查阅threshold().

示例代码:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat srcImage = imread("星空.png");

    //判断图像是否加载成功
    if(!srcImage.data)
    {
        cout << "图像加载失败!" << endl;
        return false;
    }
    else
        cout << "图像加载成功!" << endl << endl;

    //显示原图像
    namedWindow("原图像",WINDOW_AUTOSIZE);
    imshow("原图像",srcImage);

    //将图像转换为灰度图,采用CV_前缀
    Mat grayImage;
    cvtColor(srcImage, grayImage, CV_BGR2GRAY);     //将图像转换为灰度图
    namedWindow("灰度图",WINDOW_AUTOSIZE);
    imshow("灰度图",grayImage);

    //将图像转换为HSV,采用COLOR_前缀
    Mat HSVImage;
    cvtColor(srcImage, HSVImage, COLOR_BGR2HSV);    //将图像转换为HSV图
    namedWindow("HSV",WINDOW_AUTOSIZE);
    imshow("HSV",HSVImage);

    waitKey(0);

    return 0;
}

运行结果如下: 
原图像 
技术分享图片 
灰度图 
技术分享图片 
HSV 
技术分享图片



















以上是关于opencv学习之颜色空间转换cvtColor()的主要内容,如果未能解决你的问题,请参考以下文章

利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方

使用 cvtColor 进行 OpenCV 图像色彩空间转换

OpenCV的颜色空间(cv2.cvtColor)

opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分

cvtColor()学习

opencv 基本绘图函数