我正在Android平台上使用OpenCV。在这个社区和技术人员的巨大帮助下,我能够成功地从图像中检测出一张纸。

这些是我使用的步骤。

  • Imgproc.cvtColor()
  • Imgproc.Canny()
  • Imgproc.GausianBlur()
  • Imgproc.findContours()
  • Imgproc.approxPolyDP()
  • findLargestRectangle()
  • 查找矩形
  • 的顶点
  • 使用质心方法
  • 来找到矩形的左上角逆时针方向的顶点
  • 查找矩形的高度和宽度,以保持纵横比并进行warpPerspective转换。

  • 应用所有这些步骤后,我可以轻松地从图像中获取文档或最大的矩形。但这很大程度上取决于背景和文档纸强度的差异。由于Canny edge detector遵循强度梯度原理,因此始终会在实现方面假定强度差异。因此,Canny考虑了各种阈值参数。
  • 下限阈值
  • 阈值较高

  • 因此,如果像素的强度梯度大于较高阈值,则它将作为边缘像素添加到输出图像中。如果像素的强度梯度值低于下限阈值,则将完全拒绝该像素。并且,如果像素的强度介于阈值上限和下限之间,则仅当像素连接到值大于上限阈值的任何其他像素时,才将其添加为边缘像素。

    我的主要目的是使用Canny边缘检测进行文档扫描。那么,如何动态计算这些阈值,以便它可以在黑暗和明亮背景的两种情况下工作?

    我通过手动调整参数做了很多尝试,但是找不到与场景相关的任何关系。

    最佳答案

    您可以使用Otsu’s method计算阈值。

    (Python)代码如下所示:

    high_thresh, thresh_im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    lowThresh = 0.5*high_thresh
    

    关于opencv - 如何在OpenCV中实现的Canny边缘检测算法中选择最佳的参数集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21324950/

    10-12 18:10