Android中Canny边缘检测器的快速自适应阈值

时间:2012-10-02 03:40:33

标签: java android image-processing opencv image-recognition

根据我的研究,Canny Edge Detector对于检测图像边缘非常有用。在我付出了很多努力之后,我发现OpenCV函数可以做到这一点,这是

    Imgproc.Canny(Mat image, Mat edges, double threshold1, double threshold2)

但是对于低阈值和高阈值,我知道不同的图像有不同的阈值,所以我能否知道是否有任何快速自适应阈值方法可以根据不同的图像自动分配低阈值和高阈值?

2 个答案:

答案 0 :(得分:5)

这相对容易。查看有关该主题的旧版SO post

快速方法是计算当前图像的平均值和标准差,并对图像应用+/-一个标准偏差。

C ++中的示例如下:

Mat img = ...;
Scalar mu, sigma;
meanStdDev(img, mu, sigma);

Mat edges;
Canny(img, edges, mu.val[0] - sigma.val[0], mu.val[0] + sigma.val[0]);

另一种方法是计算图像的中位数,并确定中位数之上和之下的比率(例如0.66*medianValue1.33*medianValue)。

希望有所帮助!

答案 1 :(得分:3)

Opencv具有自适应阈值功能。 使用OpenCV4Android就是这样的:

Imgproc.adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C);

一个例子:

Imgproc.adaptiveThreshold(mInput, mInput, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);

至于如何选择参数,您必须阅读文档以获取更多详细信息。为每张图片选择合适的阈值是一个完全不同的问题。