【问题标题】:Fast Adaptive Threshold for Canny Edge Detector in AndroidAndroid 中 Canny 边缘检测器的快速自适应阈值
【发布时间】:2012-09-22 22:44:59
【问题描述】:

根据我的研究,Canny Edge Detector 对于检测图像的边缘非常有用。经过我的努力,我发现OpenCV函数可以做到这一点,这是

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

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

【问题讨论】:

  • Rui Marques,你能帮帮我吗?提前谢谢。
  • 您应该查看 OpenCV 的代码源,它们在阈值方法内部使用来自 Otsu 的自适应阈值计算。您可以使用它来获得 canny 的高阈值并将其乘以 0.4 0.5 以获得低阈值。
  • Adrian Popovici,你的意思是这样的:Imgproc.Canny(image, image, 0.4*Imgproc.THRESH_OTSU, Imgproc.THRESH_OTSU)?但是现在图像结果非常模糊。对不起,因为我是 OpenCV 的新手我已经尽力研究了。希望你能帮助我。谢谢。
  • 我不知道在 Java 中如何获得 Otsu 阈值,但您应该有这样的方法:返回整数的 getOtsuThreshold(image)。然后你就像这样 Canny(srcImage, dstImage, 0.4 * thresh, thresh) 应用它。请记住,目标图像与源图像不同。
  • 嗨,我看到你在 cmets 中写了我的名字,但你必须在名字前写 @ 才能收到通知。

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


【解决方案1】:

这相对容易做到。看看这个老的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)。

希望有帮助!

【讨论】:

    【解决方案2】:

    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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-31
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多