2011-03-13 74 views
1

我正在做一些图像处理学习,我用新的C++ iterface使用openCV。OpenCV二进制图像只得到白色像素不工作

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

问题是:Canny函数返回灰度图像还是二进制图像? 我使用double for循环来检查应用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/

回答

0

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

空隙的Canny(常量垫&图像,垫&边缘,双阈值1,双阈值2,INT apertureSize = 3,布尔L2gradient =假)

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

在您的调用中,您传递与第二个参数相同的源图像,这会导致我认为奇怪的结果。

+0

是使用另一个垫子图像的结果 – matiasfh 2011-03-15 23:06:39

+0

这很奇怪。在我的程序中,我这样使用它: 'cv :: Mat after; cv :: Canny(m_mImage,之后,50,120);' 它的功能完美。也许尝试没有L2gradient设置为true。您是否检查了您的阈值功能是否正常工作? – Yax 2011-03-16 18:01:16

1

二进制图像有您需要转换为int(或unsigned int)型uchar如果你想在0-255范围:

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风格的演员,但我会离开作为读者的练习。

相关问题