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

问题描述 投票:0回答:2

天真的问题,我第一次使用颜色处理。我想从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

这是结果图像:qazxsw poi

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

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

c++ image opencv colors rgb
2个回答
0
投票

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

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

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

enter image description here

对于每个像素。

这里函数将表示您想要组合像素的R和G值以形成该像素的新R值的方式。由于你将G设为0,因此你不会在该像素中产生绿色阴影。


0
投票

如果我们混合不同的B-G-R成分,我们可以获得比B-G-R更多的成分。如:R = Function( R, G ) and G = 0 ; B(high)+G(high)+R(low) => Yellow

这是一个例子:

B(high)+G(low)+R(high) => Purple

依赖渠道如下:

enter image description here

现在回到你的花卉图像,enter image description hereR渠道的巨大差异是G。如果你用Red flowers regions替换G,那么这些区域就变成了R。如果你用B(low) + R(high) + R(high) => yellow替换R,那么就成为G

B(low) + G(low) + G(low) => dark


这是HSV中的Hue地图。 enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.