【图像处理】OpenCV系列二十一 --- 颜色空间转换cvtC
上一节我们学习了用如何用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、参数详解
-
第一个参数,InputArray src,输入图像,图像的类型为8位无符号图像,16位无符号图像 ( CV_16UC... )或者单精度浮点型图像;
-
第二个参数,OutputArray dst,目标图像,与原图像具有同样的尺寸与深度;
-
第三个参数,int code,颜色空间转换的标识符;
-
第四个参数,int dstCn = 0,目标图像的通道数,如果dstCn = 0,则目标图像的通道数是由原图像src以及第三个参数code组合得出来的;
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对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!