我正在使用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]
答案 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所说的是正确的方法。 但是,如果您打算使用颜色检测进行某种工作,则单个通道图像中没有颜色的业务(因为这是不可能的)。
我不知道这是否清楚,请告诉我。