使用 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) => 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
。
这是 Hue 在 HSV 中的地图。
此处是在 HSV 中查找绿色的示例。
How to define a threshold value to detect only green colour objects in an image :Opencv
天真的问题,我是第一次使用颜色处理。 我想从 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) => 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
。
这是 Hue 在 HSV 中的地图。
此处是在 HSV 中查找绿色的示例。
How to define a threshold value to detect only green colour objects in an image :Opencv