繁体   English   中英

使用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,则红色部分将具有一些绿色阴影。 我是否错过了代码中的某些内容? 还是我缺乏理解?

在这种情况下,我没有原始图像,也没有转换颜色空间,因为我想了解它如何与RGB配合使用。 然后,如果需要,我稍后将转换色彩空间。

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

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

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

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

对于每个像素。

此处,函数将表示您想要组合像素的R和G值以形成该像素的新R值的方式。 并且由于将G设为0,因此在该像素中将没有绿色阴影。

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

这是一个例子:

在此处输入图片说明

依赖通道如下:

在此处输入图片说明

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

在此处输入图片说明


这是HSV中顺化地图。

在此处找到在HSV中寻找绿色的示例。

如何定义阈值以仅检测图像中的绿色对象:Opencv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM