【问题标题】:OpenCV binary image get only white pixels don't workOpenCV二进制图像只得到白色像素不起作用
【发布时间】:2011-03-13 22:43:30
【问题描述】:

我正在做一些图像处理来学习,我正在使用带有新 C++ iterface 的 openCV。

我有一个 RGB 图像,我读取灰度版本,均衡直方图,然后使用 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/

【问题讨论】:

    标签: c++ opencv


    【解决方案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 风格的演员表,但我会将其作为练习留给读者。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 是使用另一个 mat 图像的相同结果
      • 这很奇怪。在我的程序中,我像这样使用它:cv::Mat after; cv::Canny(m_mImage,after,50,120);,它运行良好。也许尝试不将 L2gradient 设置为 true。你检查过你的阈值函数是否正常工作吗?
      猜你喜欢
      • 2012-01-15
      • 2017-07-19
      • 2013-05-31
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多