天真的问题,我第一次使用颜色处理。 我想从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 - &gt;绿色部分将有一些红色阴影。如果我将R和G指定为G,则红色部分将具有一些绿色阴影。我在代码中遗漏了什么吗?或者我缺乏理解?
在这种情况下,我没有原始图像,我没有转换我的色彩空间,因为我想看看它如何与RGB一起工作。然后,如果需要,我稍后将转换颜色空间。
答案 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
。
以下是一个例子:
依赖渠道如下:
现在回到你的鲜花图片,R
和G
频道的巨大差异是Red flowers regions
。如果您将G
替换为R
,则区域将变为B(low) + R(high) + R(high) => yellow
。如果您将R
替换为G
,则成为B(low) + G(low) + G(low) => dark
。
这里有一个在HSV中找到绿色的例子。
How to define a threshold value to detect only green colour objects in an image :Opencv