OpenCV二进制图像只获得白色像素不起作用

时间:2011-03-13 22:43:31

标签: c++ opencv

我正在做一些图像处理来学习,我正在使用openCV和新的C ++接口。

我有一个RGB图像,我读取灰度版本,均衡直方图,然后使用canny来检测边缘。

问题是:Canny函数是返回灰度图像还是二进制图像? 我使用双循环来检查图像中的像素值,因为应用了canny边缘检测器,我有很多值完全不同。在二进制图像中必须只有两个值0或1(0或255)......我该怎么做?

我的代码:

imagen = imread(nombre_imagen,0); //lee la imagen en escala de grises
equalizeHist(imagen,imagen);
Canny(binary,binary,0.66*threshold,1.33*threshold,3,true);
for(int i=0;i<binary.rows;i++){
    for(int j=0;j<binary.cols;j++){
       std::cout << binary.at<float>(i,j)<< ",";
    }
    std::cout << "\n";
}

这是一个183x183矩阵,我甚至可以看到很多值nan。 我怎样才能制作这个二进制文件?

对于Canny函数,我使用阈值来获得灰度图像的“平均”值;我在这里看到了:http://www.kerrywong.com/2009/05/07/canny-edge-detection-auto-thresholding/

2 个答案:

答案 0 :(得分:1)

二进制图片的类型为uchar,如果您想要0-255范围,则需要投放到int(或unsigned int):

for(int i=0;i<edges.rows;i++) {
    for(int j=0;j<edges.cols;j++) {
       std::cout << (int)edges.at<uchar>(i,j)<< ",";
    }
    std::cout << "\n";
}

你应该避免使用C风格的演员表,但我会将其作为练习留给读者。

答案 1 :(得分:0)

文档(http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html?highlight=canny#Canny)说:

void Canny(const Mat&amp; image,Mat&amp; edges,double threshold1,double threshold2,int apertureSize = 3,bool L2gradient = false)

第二个参数 - 边 - 输出边缘图。它将具有与图像相同的大小和相同的类型

在你的通话中,你传递的是与第二个参数相同的源图像,这会导致奇怪的结果。