一、图像颜色空间介绍

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模型转灰度图的关系: Gray = R * 0.3 + G * 0.59 + B * 0.11

二、不同颜色空间互相转换

/* 用途:用于在不同颜色空间之间进行转换 */
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();

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐