Canny边缘检测 - 灰度图像总是呈现为3通道,无法使用?

时间:2010-05-10 02:07:28

标签: c++ opencv edge-detection

我正在阅读O'Reilly系列中的“学习OpenCV”一书,并试图执行一个精确的边缘检测样本。

我选择的任何灰度图像似乎都有3个通道,据我所知,canny只适用于单通道图像,因此总是失败。我甚至使用OpenCV提供的图像。

这是我的代码..

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
{
    if(in->nChannels != 1)
        return(0); //canny only handles gray scale images
    IplImage* out = cvCreateImage(cvSize(in->width, in->height), IPL_DEPTH_8U, 1);
    cvCanny(in, out, lowThresh, highThresh, aperture);
    return(out);
};

IplImage* img = cvLoadImage("someGrayscaleImage.jpg");
IplImage* out = doCanny(img, 10, 100, 3);

为什么这总是给我3通道图像?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以将此方法与其他参数

一起使用
IplImage* cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR)

#define CV_LOAD_IMAGE_COLOR       1

#define CV_LOAD_IMAGE_GRAYSCALE   0

#define CV_LOAD_IMAGE_UNCHANGED  -1

默认参数是带颜色的加载图像。你要做的是用灰度加载它

这是一个例子

cvLoadImage("yourimage.jpg", CV_LOAD_IMAGE_GRAYSCALE);

以下是该方法的详细说明。您可以在此处查看更多详细信息: Open CV 2.0 References

scolor - 加载图像的特定颜色类型:if $> 0 $,加载的图像被强制为3通道彩色图像;如果为0,则加载的图像被强制为灰度;如果$< 0 $,加载的图像将按原样加载(请注意,在当前实现中,alpha通道(如果有)从输出图像中剥离,例如,4通道RGBA图像将作为RGB加载。)