【问题标题】:Swap RGB channel color using OpenCV C++使用 OpenCV C++ 交换 RGB 通道颜色
【发布时间】:2023-03-19 03:50:01
【问题描述】:

天真的问题,我是第一次使用颜色处理。 我想从 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,红色部分会有一些绿色阴影。我错过了代码中的某些内容吗?还是我缺乏理解?

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

【问题讨论】:

    标签: c++ image opencv colors rgb


    【解决方案1】:

    使用您当前的实现,如果在执行 (R,G)->R 转换时说 (100, 150, 200) 像素处的 RGB 值,您最终将得到值 (100, 100, 200)。所以像素将同时具有红色和绿色分量。

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

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

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

    每个像素。

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

    【讨论】:

    • 正是我现在需要的程序。谢谢!
    【解决方案2】:

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

    这是一个例子:

    依赖的渠道如下:

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


    这是 HSVHue 的地图。

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

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

    【讨论】:

    • 你的解释救了我。我们如何判断一个通道是高还是低?
    • 一般来说,你应该转换成HSV来分割特定的颜色(如绿色)。也许这有助于stackoverflow.com/questions/47483951/…
    • 我之前确实转换了我的色彩空间,但我仍然需要确定我正在尝试做的是最适合 RGB 还是 HSV,这就是我想尝试使用 RGB 的原因。跨度>
    • 那就随心所欲地尝试吧。
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多