将YCrCb图像分割为其强度通道

Blu*_*Blu 4 c++ opencv image image-processing computer-vision

我想将YCrCb拆分为Y,Cr和Cb通道.

代码效果很好但是当我imshow("Y", y)为每个Y,Cr,Cb 显示通道时,所有通道看起来都是灰色的.

只有Y通道必须是灰色的,其他通道应该是彩色的.我对吗?或者代码有什么问题?

    Mat RGBImage;
    RGBImage = imread("xx.jpg");    
    cvtColor(RGBImage, YCrCb, CV_RGB2YCrCb);

    vector<Mat> ycc_planes;
    split(YCrCb, ycc_planes);

    Mat y = ycc_planes[0];
    Mat Cr = ycc_planes[1];
    Mat Cb = ycc_planes[2];
Run Code Online (Sandbox Code Playgroud)

我的最终目标是将均值滤波器应用于图像的Y分量,然后通过合并其他分量(Cr和Cb)将其更改回RGB.最后,我将得到原始RGB图像的模糊版本.然而,我的平均滤波器总是返回灰色模糊图像.我可能是因为我的Cr,Cb组件是灰色的.

Mik*_*iki 6

将3通道图像分割为3个单通道图像时,每个图像都是灰度图像.它们代表颜色信息的事实是无关紧要的.

原始图片:

在此输入图像描述

YCrCb频道:

在此输入图像描述

但是,您可以应用颜色效果:

在此输入图像描述


您可以模糊Y通道,然后合并3个单通道,并转换回BGR:

在此输入图像描述

这里的完整代码供参考:

#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    Mat3b bgr = imread("path_to_image");

    Mat3b ycrcb;
    cvtColor(bgr, ycrcb, COLOR_BGR2YCrCb);

    vector<Mat1b> planes;
    split(ycrcb, planes);

    // Collage planes
    Mat1b collagePlanes(bgr.rows, bgr.cols*3);
    for (int i = 0; i < 3; ++i)
    {
        planes[i].copyTo(collagePlanes(Rect(i*bgr.cols, 0, bgr.cols, bgr.rows)));
    }

    Mat1b gray(bgr.rows, bgr.cols, uchar(128));

    // Y
    vector<Mat1b> vy(3);
    vy[0] = planes[0];
    vy[1] = gray.clone();
    vy[2] = gray.clone();
    Mat3b my;
    merge(vy, my);

    // Cr
    vector<Mat1b> vcr(3);
    vcr[0] = gray.clone();
    vcr[1] = planes[1];
    vcr[2] = gray.clone();
    Mat3b mcr;
    merge(vcr, mcr);

    // Cb
    vector<Mat1b> vcb(3);
    vcb[0] = gray.clone();
    vcb[1] = gray.clone();
    vcb[2] = planes[2];
    Mat3b mcb;
    merge(vcb, mcb);



    // Collage planes
    Mat3b collageColor(bgr.rows, bgr.cols * 3);
    my.copyTo(collageColor(Rect(0, 0, bgr.cols, bgr.rows)));
    mcr.copyTo(collageColor(Rect(bgr.cols, 0, bgr.cols, bgr.rows)));
    mcb.copyTo(collageColor(Rect(2 * bgr.cols, 0, bgr.cols, bgr.rows)));

    cvtColor(collageColor, collageColor, COLOR_YCrCb2BGR);


    ////////////////////////////

    // Blur Y
    boxFilter(planes[0], planes[0], CV_8U, Size(7,7));

    Mat3b blurred;
    merge(planes, blurred);
    cvtColor(blurred, blurred, COLOR_YCrCb2BGR);


    imshow("Original", bgr);
    imshow("YCrCb planes", collagePlanes);
    imshow("YCrCb planes colored", collageColor);
    imshow("Blurred", blurred);
    waitKey();


    return 0;
}
Run Code Online (Sandbox Code Playgroud)