OpenCV显示彩色Cb Cr通道

时间:2015-05-15 07:17:37

标签: opencv color-space

所以我理解如何使用cvtColor()将BGR图像转换为YCrCb格式,并在OpenCV中使用split()或mixChannels()分隔不同的通道。但是,这些通道显示为灰度图像,因为它们是CV_8UC1 Mats。

我想用彩色显示Cb和Cr通道 Barns image on Wikipedia。 我找到了这个solution in Matlab,但我怎么在OpenCV中做到这一点?

此外,mentioned solution显示的Cb和Cr通道“以50%的常数值填充其他通道”。我的问题是:

这是显示Cr Cb通道的常用方法吗?或者在显示Cr Cb通道时是否有任何建议或规格?

1 个答案:

答案 0 :(得分:1)

我按照answer中的描述从头开始编写代码。看起来就像你需要的那样。

Mat bgr_image = imread("lena.png");

Mat yCrCb_image;
cvtColor(bgr_image, yCrCb_image, CV_BGR2YCrCb);

Mat yCrCbChannels[3];
split(yCrCb_image, yCrCbChannels);

Mat half(yCrCbChannels[0].size(), yCrCbChannels[0].type(), 127);
vector<Mat> yChannels = { yCrCbChannels[0], half, half };
Mat yPlot;
merge(yChannels, yPlot);
cvtColor(yPlot, yPlot, CV_YCrCb2BGR);
imshow("y", yPlot);

vector<Mat> CrChannels = { half, yCrCbChannels[1], half };
Mat CrPlot;
merge(CrChannels, CrPlot);
cvtColor(CrPlot, CrPlot, CV_YCrCb2BGR);
imshow("Cr", CrPlot);

vector<Mat> CbChannels = { half, half, yCrCbChannels[2] };
Mat CbPlot;
merge(CbChannels, CbPlot);
cvtColor(CrPlot, CrPlot, CV_YCrCb2BGR);
imshow("Cb", CbPlot);
waitKey(0);

enter image description here

对于将灰度图像转换为彩色格式,通常在这种情况下,所有颜色通道(B,G,R)都设置为一个灰度值。在以这种方式实现的OpenCV CV_GRAY2BGR模式中。

至于“以50%的常数值填充其他通道”我相信将YCbCr和Lab这样的色彩空间可视化的常用方法。我没有找到任何关于这种方法的文章和描述,但我认为它是由可视化目的驱动的。事实上,如果我们用零填充其他通道,从根本上没有任何改变:我们也可以看到每个通道的影响,但图片看起来不是很好:

enter image description here

因此,这种方法的目的是使可视化更加丰富多彩。