Canny边缘检测无法检测到100%水平/未旋转的线

Canny边缘检测是否应该检测纯,非旋转水平线?

这些是输入图像:

:100%水平(非旋转)非模糊线
:同一张图片旋转了1°

Canny边缘检测无法检测到100%水平/未旋转的线

Canny边缘检测无法检测到100%水平/未旋转的线

相应的输出“边缘”图像:

Canny边缘检测无法检测到100%水平/未旋转的线

Canny边缘检测无法检测到100%水平/未旋转的线

(图像在此处缩放为2倍,没有进行平滑处理以更好地进行判断。)

图像的处理阈值为低= 250x0.66和高= 250x1.33,内核尺寸k = 3。

虽然梯形图产生的效果令人满意,但前一个图像却没有。

目前,这些图像尚未进行进一步的预处理,您所看到的是Canny发生了什么。

我创建了第一张图像作为测试数据。尽管在现实世界中可能会出现这样的界限,但这可能是一个假想的案例。

MCVE:

public class q58884116 {
    public static void main(String[] args) throws Exception {
        System.load(new File(Paths.get("target","classes","libopencv_java412.so").toString()).getabsolutePath());

        File inFile = new File(args[0]);
        File outFile = new File(args[1]);

        Mat imageColor = Imgcodecs.imread(inFile.getabsolutePath(),Imgcodecs.IMREAD_COLOR);
        Mat patternProbeImage = new Mat();
        Imgproc.cvtColor(imageColor,patternProbeImage,Imgproc.COLOR_BGR2GRAY);

        Mat edges = new Mat();
        // Value determined from histogram in Gimp.
        Imgproc.Canny(patternProbeImage,edges,250 * 0.66,250 * 1.33,3,true);

        Imgcodecs.imwrite(outFile.getabsolutePath(),edges);
    }
}

输入图像(未缩放):input.png

  • 从Git编译
  • OpenCV 4.1.2
  • cmake 3.7.2
  • gcc 6.3.0
  • openjdk 1.8.0_232
  • 使用Java库。

构建步骤:

$ git clone https://github.com/opencv/opencv.git
$ cd opencv/
$ git checkout 4.1.2
$ cd cmake/
$ cmake -DCMAKE_INSTALL_PREFIX="/opt/opencv" ..
$ make -j4
$ make install

我必须承认,我不熟悉Canny甚至整个计算机视觉背后的理论。我才刚刚开始。尽管我可以想象这可能是由Sobel function(在Canny函数文章中提到)使用的Gy矩阵的零行引起的。

如果这确实是Canny的局限性,那么处理此类情况的常用方法是什么(简称)?


我凭经验接近:我创建了一个白色到黑色的渐变图像 在它上面有黑色的光栅图案。光栅应代表 原始测试图像在不同背景上的几行。

这是我们的输入图像:

Canny边缘检测无法检测到100%水平/未旋转的线

(为更漂亮的帖子download original裁剪并调整大小。)

扩展了MCVE,以生成各种阈值范围的边缘(不 每种可能的组合都有,但数量不多):

for (int i = 0; i < 255 - 50; i++) {
    Mat edges = new Mat();
    Imgproc.Canny(patternProbeImage,i,i + 50,true);

    Imgcodecs.imwrite(getOutputFile(outFile,"lb-0-" + String.format("%03d",i)).getabsolutePath(),edges);
}

然后我们可以检查生成的边缘。

使用此衬纸可以轻松生成所有图像的马赛克(小图片) 检查:

$ convert gradient-grating.out.lb-0-*.png +append  gradient-grating.out.lb.png

这是结果:

Canny边缘检测无法检测到100%水平/未旋转的线

正如人们所看到的,Canny无法检测到越来越少的边缘 阈值越高,价值侧(顶部)越大。我期望如此。尽管在最大值方面,无论给出什么阈值,Canny都从不能够检测边缘。

cz289548699 回答:Canny边缘检测无法检测到100%水平/未旋转的线

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3092791.html

大家都在问