【问题标题】:Splitting YCrCb image to its intensity channels将 YCrCb 图像拆分为其强度通道
【发布时间】:2016-01-13 00:23:25
【问题描述】:

我想将 YCrCb 拆分为 Y、Cr 和 Cb 通道。

代码运行良好,但是当我为每个 Y、Cr、Cb 显示带有 imshow("Y", y) 的通道时,所有通道看起来都是灰色的。

只有 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];

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

【问题讨论】:

  • 您将一个 3 通道图像拆分为 3 个 1 通道图像。 1通道图像是灰度的,将显示为gray-sh。它们的像素值实际上是颜色信息这一事实无关紧要,它们仍然是灰度图像。所以,你的代码没问题,只是你的解释不正确。
  • 我应该在我的代码中添加什么以使它们变得丰富多彩? @三木
  • cvtColor(RGBImage, YCrCb, CV_BGR2YCrCb); 或许更好
  • 哦,也许我明白了……你的意思是this?这只是一个颜色图,一种视觉效果。
  • 是的,实际上我将均值滤波器应用于图像的 Y 分量,我需要通过合并其他分量 (Cr 和 Cb) 将其更改回 RGB。最后,我将获得原始 RGB 图像的模糊版本。然而,我的平均滤波器总是返回灰色模糊图像。我虽然可能是因为我的 Cr,Cb 组件是灰色的。这就是我问这个问题的原因。

标签: c++ image opencv image-processing computer-vision


【解决方案1】:

正如@Miki在cmets中所说,分割一个3通道的图像会给你3个1通道的图像,而1通道的图像是灰度的!另外,@sturkmen 指出了一个重要的事情:OpenCV 图像存储为 BGR,因此您需要在cvtColor 中使用CV_BGR2YCrCb 而不是CV_RGB2YCrCb。

但是,我看到很多资料以丰富多彩的方式展示它们(各个频道),例如 Hays 教授的 this。

如果您想以这种方式查看它们,则需要为其他通道设置一个固定值并将它们合并回来。这样就可以实现下图的第一行。第二行是各个频道。有关更多信息,您可以阅读此post 或观看此video。

【讨论】:

  • 不错的博客顺便说一句,现在我知道当 SO 用户在安装 OpenCV 时遇到问题时该链接什么:D
【解决方案2】:

当您将 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;
}

【讨论】:

  • 哇!!非常感谢您的回答,我在问这个问题时学到了很多东西! =)) @Miki
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 2015-08-12
  • 2021-05-27
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2018-03-29
相关资源
最近更新 更多