在opencv中自动计算Canny操作的低和高阈值

hof*_*fer 32 opencv image-processing

在openCV中,canny运算符的低阈值和高阈值是强制性的:

cvCanny(input,output,thresh1,thresh2)
Run Code Online (Sandbox Code Playgroud)

在Matlab中,有一个自动计算的选项:

edge(input,'canny')
Run Code Online (Sandbox Code Playgroud)

我已经研究了Matlab的边缘代码,这实际上并不是直接自动计算的.

您是否了解canny运算符的任何实现以及opencv的自动阈值计算?

谢谢

VP.*_*VP. 46

当我在寻找一种自动计算Canny阈值的方法时,我偶然发现了这个答案.

希望这有助于任何寻找确定Canny算法自动阈值的好方法的人......


如果您的图像由不同的前景和背景组成,则前景对象的边缘可以使用以下提取:

  1. 使用以下方法计算Otsu的阈值:

    double otsu_thresh_val = cv::threshold(
        orig_img, _img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU
    );
    
    Run Code Online (Sandbox Code Playgroud)

    我们不需要_img.我们只感兴趣otsu_thresh_val但不幸的是,目前OpenCV中没有允许您仅计算阈值的方法.

  2. 使用Otsu的阈值作为更高的阈值,使用Canny算法的下限阈值的一半.

    double high_thresh_val  = otsu_thresh_val,
           lower_thresh_val = otsu_thresh_val * 0.5;
    cv::Canny( orig_img, cannyOP, lower_thresh_val, high_thresh_val );
    
    Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息可以在本文中找到:Otsu方法在Canny算子中的应用研究.可在此处找到Otsu实施的解释.


Luc*_*ngo 16

您可以使用输入灰度图像的平均值,并使用标准偏差定义下限和上限阈值.您可以在此处获得更详细的解释和opencv代码:http: //www.kerrywong.com/2009/05/07/canny-edge-detection-auto-thresholding/


小智 7

此外,还有一些代码可以自动执行此操作,方法是将其放入OpenCV构建中.我在OpenCV用户邮件列表中找到了它,所以没有保证.:)

讨论:http://opencv-users.1802565.n2.nabble.com/Automatic-thresholding-in-cvCanny-td5871024.html GitHub(代码):https://gist.github.com/756833