OpenCV联合C++/Qt 学习笔记(三)----图像颜色空间转换及多通道分离与合并
本文介绍了图像处理中的颜色空间转换和通道操作。主要内容包括:1)RGB、HSV和GRAY三种颜色空间模型的特性;2)使用convertTo()和cvtColor()函数进行颜色空间转换的方法;3)通过split()和merge()函数实现多通道图像的分离与合并。文中提供了完整的示例代码,演示了如何加载图像、转换颜色空间、分离通道以及重新合并通道等操作。
·
一、图像颜色空间介绍
1、RGB颜色模型
第一个通道是蓝色(B)分量
第二个通道是绿色(G)分量
第三个通道是红色(R)分量

/* 用途:用于对图像进行数据类型转换,同时对像素值进行线性变换(缩放+平移) */
void cv::Mat::convertTo(OutputArray dst, int rtype, double alpha, double beta);
/*
dst:输出图像
rtype:转换后数据类型
alpha:缩放系数
beta:平移系数
*/
2、HSV颜色模型
H是色度(Hue):决定颜色的种类(0°~360°)
S是饱和度(Saturation):决定颜色的鲜艳程度,从灰色到鲜艳(0%~100%)
V是亮度(Value):决定颜色的明亮程度,从暗到亮(0%~100%)

3、GRAY颜色模型
RGB模型转灰度图的关系:

二、不同颜色空间互相转换
/* 用途:用于在不同颜色空间之间进行转换 */
void cv::cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
/*
src:待转换颜色模型的原始图像
dst:转换颜色模型后的目标图像
code:颜色空间转换的标志,如由RGB空间到HSV空间
dstCn:目标图像中的通道数,如果参数是0,则从src和代码中自动导出通道数
*/
三、示例代码
QString imgPath = QApplication::applicationDirPath() + "/Images/lena.jpg";
cv::String s_imgPath = imgPath.toLocal8Bit().data();
Mat mat = imread(s_imgPath, IMREAD_COLOR);
if (mat.empty())
{
qDebug() << "图片加载失败, 图片路径: " << QString::fromStdString(s_imgPath);
return;
}
Mat mat32;
mat.convertTo(mat32, CV_32F, 1 / 255.0, 0);
Mat HSV, HSV32;
cvtColor(mat, HSV, COLOR_BGR2HSV);
cvtColor(mat32, HSV32, COLOR_BGR2HSV);
imshow("img", mat);
imshow("HSV", HSV);
imshow("HSV32", HSV32);
Mat Gray0, Gray1;
cvtColor(mat, Gray0, COLOR_BGR2GRAY);
cvtColor(mat, Gray1, COLOR_RGB2GRAY);
imshow("Gray0", Gray0);
imshow("Gray1", Gray1);
waitKey(0);
destroyAllWindows();
四、多通道分离与合并
1、多通道分离
/* 用途:用于将多通道图像(如BGR彩色图像)拆分为多个单通道图像 */
void cv::split(InputArray m, OutputArrayOfArrays mv);
/*
m:待分离的多通道图像
mv:分离后的单通道图像,为向量vector形式
*/
2、多通道合并
/* 用途:用于将多个单通道图像合并为一个多通道图像 */
void cv::merge(InputArrayOfArrays mv, OutputArray dst);
/*
mv:需要合并的图像向量vector,其中每个图像必须拥有相同的尺寸和数据类型
dst:合并后输出的图像,通道数等于所有输入图像的通道数总和
*/
五、示例代码
QString imgPath = QApplication::applicationDirPath() + "/Images/lena.jpg";
cv::String s_imgPath = imgPath.toLocal8Bit().data();
Mat img = imread(s_imgPath, IMREAD_COLOR);
if (img.empty())
{
qDebug() << "图片加载失败, 图片路径: " << QString::fromStdString(s_imgPath);
return;
}
Mat imgs[3];
split(img, imgs);
Mat img0, img1, img2;
img0 = imgs[0];
img1 = imgs[1];
img2 = imgs[2];
imshow("img", img);
imshow("img0", img0);
imshow("img1", img1);
imshow("img2", img2);
Mat newImg;
merge(imgs, 3, newImg);
imshow("newImg", newImg);
Mat zero = Mat::zeros(img.size(), CV_8UC1);
vector<Mat> imgsV;
imgsV.push_back(img0);
imgsV.push_back(zero);
imgsV.push_back(zero);
Mat imgsVH;
merge(imgsV, imgsVH);
imshow("imgsVH", imgsVH);
waitKey(0);
destroyAllWindows();
更多推荐
所有评论(0)