![](/img/trans.png)
[英]RGB Color Image Histogram for Contrast Stretching using OpenCV c++
[英]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
。
这是一个例子:
依赖通道如下:
现在回到您的花朵图像, R
和G
通道的最大区别是Red flowers regions
。 如果用R
代替G
,则区域变为B(low) + R(high) + R(high) => yellow
。 如果用G
代替R
,则变为B(low) + G(low) + G(low) => dark
。
在此处找到在HSV中寻找绿色的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.