1

我正在使用 cvSplit() 来分离 RGB 通道并将它们打印成 3 个不同的图像,显​​示颜色 r、g 和 b。但我只得到带有黑白照片的 BW 图像。这是使用 cvSplit() 时正确的输出吗?或者我必须做点什么让它上色?以下是我到目前为止的代码。

![#include <iostream>
#include <cv.h>
#include <highgui.h>
#include "rgb.h"

using namespace std;

int main(){
IplImage* img = cvLoadImage("rgb.jpg");



IplImage* channelRed = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelGreen = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* channelBlue = cvCreateImage(cvGetSize(img), 8, 1);



IplImage* Result1 = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* Result2 = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* Result3= cvCreateImage(cvGetSize(img), 8, 1);



cvSplit(img, channelBlue, channelGreen, channelRed, NULL);



cvThreshold(channelBlue, Result1, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelGreen, Result2, 20, 255, CV_THRESH_BINARY);
cvThreshold(channelRed, Result3, 20, 255, CV_THRESH_BINARY);





cvShowImage("original", img);

cvShowImage("blue", Result1);
cvShowImage("green", Result2);
cvShowImage("red", Result3);

cvWaitKey(0); 


return 0;
}][1]
4

2 回答 2

1

它不会以这种方式工作。当你有一个单通道图像时,opencv 假设它是灰度的。

您可以做的是创建一个大小相同的蓝色、红色和绿色滤镜图像,在感兴趣的通道中填充 255,在其他通道中填充为零。

然后你只需运行以下函数来获取你的蓝色图像:

cvAnd(original_img,bluefilter_img,blue_result_img)

重复红色和绿色过滤器。

于 2013-03-06T00:27:12.650 回答
0

如果您有一个 3 通道图像,当您使用cvSplit它时,它会为您提供 3 个灰度图像(而不是黑白),因为它们是单通道图像。

img(R,G,B) ==> chRed(R)、chGreen(G)、chBlue(B),其中 R、G 和 B 从 0 到 255。

img 有 255*255*255 颜色,其他只有 256。

你最终得到黑白图像只是因为你事后对它们进行了阈值处理。您可能想要使用 OpenCV 2.4.4 的最新版本并做一些更自动化和更强大的事情,例如threshold(imgIn, imgOut, 100, 255, CV_THRESH_OTSU); (参见:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#cv。阈值

所以如果目标是有一些艺术观点,那么perfanoff所说的就是正确的方法。但是,如果您打算对颜色检测进行某种工作,则单通道图像中没有颜色(因为这是不可能的)。

我不知道这是否清楚,请告诉我。

于 2013-03-06T14:01:48.317 回答