Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将YCrCb图像拆分为其强度通道_C++_Image_Opencv_Image Processing_Computer Vision - Fatal编程技术网

C++ 将YCrCb图像拆分为其强度通道

C++ 将YCrCb图像拆分为其强度通道,c++,image,opencv,image-processing,computer-vision,C++,Image,Opencv,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;

我想将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];
Mat-RGBImage;
RGBImage=imread(“xx.jpg”);
CVT颜色(RGBImage、YCrCb、CV_RGB2YCrCb);
向量ycc_平面;
拆分(YCrCb、ycc_平面);
Mat y=ycc_平面[0];
Mat Cr=ycc_平面[1];
Mat Cb=ycc_平面[2];
我的最终目标是对图像的Y分量应用均值滤波器,然后通过合并其他分量(Cr和Cb)将其更改回RGB。最后,我将获得原始RGB图像的模糊版本。然而,我的平均过滤器总是返回灰色模糊的图像。我想可能是因为我的Cr,Cb组件是灰色的

正如@在评论中所说,分割一个3通道图像将得到3个1通道图像,而1通道图像是灰度的!另外,@指出了一件重要的事情:OpenCV图像存储为BGR,因此您需要使用
CV\u BGR2YCrCb
而不是
cvtColor
中的
CV\u RGB2YCrCb

然而,我看到很多材料以丰富多彩的方式展示它们(各个频道),就像海斯教授所说的那样

如果希望以这种方式查看它们,则需要为其他通道设置一个固定值,然后将它们合并回来。这样您就可以实现下图的第一行。第二行是单独的通道。欲了解更多信息,请阅读或观看


将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;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
Mat3b bgr=imread(“路径到图像”);
Mat3b ycrcb;
CVT颜色(bgr、ycrcb、COLOR_BGR2YCrCb);
向量平面;
拆分(ycrcb,平面);
//拼贴平面
Mat1b拼贴平面(bgr.rows、bgr.cols*3);
对于(int i=0;i<3;++i)
{
平面[i].copyTo(拼贴平面(Rect(i*bgr.cols,0,bgr.cols,bgr.rows));
}
Mat1b灰色(bgr.rows,bgr.cols,uchar(128));
//Y
向量vy(3);
vy[0]=平面[0];
vy[1]=gray.clone();
vy[2]=gray.clone();
Mat3b我的;
合并(vy,my);
//铬
矢量录像机(3);
vcr[0]=gray.clone();
vcr[1]=平面[1];
vcr[2]=gray.clone();
Mat3b-mcr;
合并(vcr、mcr);
//Cb
载体vcb(3);
vcb[0]=gray.clone();
vcb[1]=gray.clone();
vcb[2]=平面[2];
Mat3b微型断路器;
合并(vcb、mcb);
//拼贴平面
Mat3b拼贴颜色(bgr.rows,bgr.cols*3);
my.copyTo(拼贴颜色(Rect(0,0,bgr.cols,bgr.rows));
mcr.copyTo(拼贴颜色(Rect(bgr.cols,0,bgr.cols,bgr.rows));
mcb.copyTo(拼贴颜色(Rect(2*bgr.cols,0,bgr.cols,bgr.rows));
cvtColor(拼贴颜色、拼贴颜色、颜色_YCrCb2BGR);
////////////////////////////
//模糊的
boxFilter(平面[0],平面[0],CV_8U,尺寸(7,7));
Mat3b模糊;
合并(平面,模糊);
CVT颜色(模糊、模糊、颜色_YCrCb2BGR);
imshow(“原件”,bgr);
imshow(“YCrCb平面”,拼贴平面);
imshow(“YCrCb平面彩色”,拼贴颜色);
imshow(“模糊”,模糊);
waitKey();
返回0;
}

您正在将一个3通道图像拆分为3个1通道图像。单通道图像是灰度图像,将显示为灰度sh。它们的像素值实际上是颜色信息这一事实无关紧要,它们仍然是灰度图像。所以,你的代码是可以的,只是你的解释是不正确的。我应该向我的代码中添加什么才能使它们丰富多彩@Miki
cvtColor(RGBImage、YCrCb、CV_BGR2YCrCb)