使用cvSplit():我得到的是BW pic而不是彩色pic

时间:2013-03-05 23:57:37

标签: c++ opencv

我正在使用cvSplit()来分离RGB通道,并将它们打印在显示颜色r,g和b的3个不同图像中。但我只有黑白图片的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]

2 个答案:

答案 0 :(得分:1)

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

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

然后您只需运行以下功能即可获得蓝色图像:

cvAnd(original_img,bluefilter_img,blue_result_img)

重复红色和绿色滤镜。

答案 1 :(得分:0)

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

img(R,G,B)==&gt; chRed(R),chGreen(G),chBlue(B),R,G和B从0到255。

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

你最终得到B&amp; W图像只是因为你事后对它们进行了限制。 您可能希望使用最新版本的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.Threshold

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

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