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

Swap RGB channel color using OpenCV C++

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

但我认为我没有得到预期的结果。 这是原始图像。

这是结果图像:

我希望是这样的,如果我将 R 和 G 指定为 R --> 绿色部分会有一些红色阴影。如果我将 R 和 G 分配为 G,则红色部分将带有一些绿色阴影。我在我的代码中遗漏了什么吗?或者我缺乏理解?

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

如果在执行 (R,G)->R 转换时某个像素的 RGB 值是 ( 100, 150, 200 ),在您当前的实现中,您最终将得到值 ( 100, 100, 200 )。因此像素将同时具有红色和绿色分量。

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

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

R = Function( R, G )
and 
G = 0

每个像素。

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

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

这是一个例子:

并且依赖的渠道如下:

现在回到你的花朵图像,RG 频道的最大区别是 Red flowers regions。如果将 G 替换为 R,则区域变为 B(low) + R(high) + R(high) => yellow。如果将 R 替换为 G,则变为 B(low) + G(low) + G(low) => dark


这是 HueHSV 中的地图。

此处是在 HSV 中查找绿色的示例。

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