使用OpenCV C ++交换RGB通道颜色

时间:2017-12-22 06:23:54

标签: c++ image opencv colors rgb

天真的问题,我第一次使用颜色处理。 我想从Mat图像交换RGB通道。 我正在尝试从原始图像创建另一个图像,并将R和G值指定为R.然后在另一个图像上,将R和G值指定为G. 这是我的代码:

Mat testcolor = imread("tulip.jpg", CV_LOAD_IMAGE_COLOR);
int rows = testcolor.rows;
int cols = testcolor.cols;

Mat leftimg(rows, cols, CV_8UC3);
Mat rightimg(rows, cols, CV_8UC3);

cvtColor(testcolor, testcolor, COLOR_RGB2BGR);
for (int i = 0; i < testcolor.rows; i++) {
    for (int j = 0; j < testcolor.cols; j++  ){ 
        leftimg.at<Vec3b>(i, j)[0] = testcolor.at<Vec3b>(i,j)[0];
        leftimg.at<Vec3b>(i, j)[1] = testcolor.at<Vec3b>(i,j)[0];
        leftimg.at<Vec3b>(i, j)[2] = testcolor.at<Vec3b>(i,j)[2];

        rightimg.at<Vec3b>(i, j)[0] = testcolor.at<Vec3b>(i, j)[1];
        rightimg.at<Vec3b>(i, j)[1] = testcolor.at<Vec3b>(i, j)[1];
        rightimg.at<Vec3b>(i, j)[2] = testcolor.at<Vec3b>(i, j)[2];
    }
}

cvtColor(leftimg, leftimg, COLOR_BGR2RGB);
imwrite("leftimg.png", leftimg);
cvtColor(rightimg, rightimg, COLOR_BGR2RGB);
imwrite("rightimg.png", rightimg);

但我不认为我得到了我所期望的结果。 这是原始图像。 This is the original image

这是reult图像: enter image description here

我期待类似的东西,如果我将R和G分配为R - &gt;绿色部分将有一些红色阴影。如果我将R和G指定为G,则红色部分将具有一些绿色阴影。我在代码中遗漏了什么吗?或者我缺乏理解?

在这种情况下,我没有原始图像,我没有转换我的色彩空间,因为我想看看它如何与RGB一起工作。然后,如果需要,我稍后将转换颜色空间。

2 个答案:

答案 0 :(得分:0)

对于当前实现,如果在执行(R,G) - > R转换时像素的RGB值说(100,150,200),则最终得到值(100,100,200)。因此像素将同时具有红色和绿色成分。

但是,我相信,你想要的结果是像素中没有绿色成分的图像。

为此,您必须为每个像素执行以下操作。

R = Function( R, G )
and 
G = 0
每个像素

此处函数将表示您希望组合像素的R和G值以形成该像素的新R值的方式。 由于你将G设为0,你不会在该像素中出现绿色阴影。

答案 1 :(得分:0)

如果混合使用不同的B-G-R成分,我们可以得到比B-G-R更多的成分。例如:B(high)+G(high)+R(low) => Yellow; B(high)+G(low)+R(high) => Purple

以下是一个例子:

enter image description here

依赖渠道如下:

enter image description here

现在回到你的鲜花图片,RG频道的巨大差异是Red flowers regions。如果您将G替换为R,则区域将变为B(low) + R(high) + R(high) => yellow。如果您将R替换为G,则成为B(low) + G(low) + G(low) => dark

enter image description here

以下是 HSV Hue 的地图。

这里有一个在HSV中找到绿色的例子。

How to define a threshold value to detect only green colour objects in an image :Opencv