如何在openCV中实现的Canny Edge检测算法中选择最佳参数集?
edge-detection
image-processing
image-segmentation
opencv
6
0

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

1.Imgproc.cvtColor()
 2.Imgproc.Canny()
 3.Imgproc.GausianBlur()
 4.Imgproc.findContours()
 5.Imgproc.approxPolyDP()
 6.findLargestRectangle()
 7.find the vertices of the rectangle
 8.find the vertices of the rectangle top-left anticlockwise order using center of mass approach
 9.find the height and width of the rectangle just to maintain the aspect ratio and do warpPerspective transformation.

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

  1. 下阈值
  2. 报警器阈值

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

我的主要目的是使用Canny边缘检测进行文档扫描。因此,我想知道如何动态计算这些阈值,以便它可以适用于深色和浅色背景的两种情况。

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

希望我能阐明我的观点,并在此先感谢

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

您可以使用大津的方法来计算您的阈值

(Python)代码如下所示:

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

使用我从THIS BLOG获得的以下代码段:

v = np.median(gray_image)

#---- apply automatic Canny edge detection using the computed median----
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(gray_image, lower, upper)
cv2.imshow('Edges',edged)

那我在这里做什么?

我正在使用灰度图像的中间值。选择0.33的sigma值可设置上下阈值。统计人员通常将0.33的值用于数据科学。因此,这里也考虑它。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号