如何在OpenCV实现的Canny边缘检测算法中选择最佳参数集?

25

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

以下是我所使用的步骤:

  1. Imgproc.cvtColor()
  2. Imgproc.Canny()
  3. Imgproc.GausianBlur()
  4. Imgproc.findContours()
  5. Imgproc.approxPolyDP()
  6. findLargestRectangle()
  7. 找到矩形的顶点
  8. 通过质心法按逆时针顺序找到矩形左上角的顶点
  9. 找到矩形的高度和宽度,以保持它的长宽比并进行warpPerspective变换。

应用所有这些步骤后,我可以轻松地从图像中获取文档或最大的矩形。但这高度取决于背景和文档纸之间强度的差异。由于Canny边缘检测器基于强度梯度原理工作,因此实现方面总是假定存在强度差异。这就是为什么Canny考虑了各种阈值参数的原因。

  1. 较低阈值
  2. 较高阈值
如果一个像素的强度梯度大于较高的阈值,则它将作为边缘像素添加到输出图像中。如果像素的强度梯度值低于较低的阈值,则该像素将被完全拒绝。如果一个像素的强度在较低和较高阈值之间,则只有当它连接到任何其他像素的值大于较高阈值时,它才会被添加为边缘像素。
我的主要目的是使用Canny边缘检测进行文档扫描。那么如何动态计算这些阈值,以便可以处理暗色和亮色背景的两种情况?
我尝试了很多手动调整参数,但我找不到与场景相关的任何关系。

给那位点了踩的人,能否请您解释一下这里有什么问题? - Ankur Gautam
3
有些天才喜欢投反对票,这对我来说是一个好问题。 - Gabriel Bursztyn
Imgproc.cvtColor() 我们应该将颜色转换为哪种?灰度图像吗? - TapanHP
嘿,你能否提供上述步骤的完整实现和代码?或者一个链接,我可以在那里找到任何东西。这将是非常有帮助的,因为我们正在按照你的步骤进行项目。@AnkurGautam - TapanHP
2个回答

27

你可以使用大津算法来计算阈值。

代码(Python)如下:

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

1
我需要一张灰度图像吗?我面临的主要问题是,虽然背景看起来与纸张不同,但在灰度下,由于它们的强度几乎相同,它们看起来相同。 - Ankur Gautam
因此,Canny边缘检测器无法检测到纸张的边缘,因为其中一条边缘有一个间隙(四条边缘中有三条被检测为锐利的,但在另一条边缘上,存在一个间隙,但根据实际图像,不建议基于三条边缘来预测另一条边缘)。我尝试使用膨胀来填补这个间隙,但是根据所使用的内核(通常是2*2的矩形),它似乎会产生其他问题(产生一些额外的边缘)。 我将尝试使用您的方法计算Canny的参数。如果您有任何想法,请与我分享。 - Ankur Gautam
1
也许你应该寻找更好的分割策略。 - Mailerdaimon
我不想更精确地进行分割。我想从图像中扫描出页面(删除多余的内容和透视变形的内容),这更像是CamScanner应用程序使用的功能。即使在几乎相同的背景下,他们也可以轻松地检测到边缘。由于我是OpenCV的新手,我想知道是否有任何过滤器或其他东西可以增加图像部分之间的强度差异(我的意思是以原始格式创建更多的强度梯度)。 - Ankur Gautam
不给我期望的结果,或者我应该说与之前的参数相比较差。高阈值的值大约为121。 - Ankur Gautam
显示剩余5条评论

6
请使用我从这篇博客中获取的代码片段,如下所示:
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值进行数据科学。因此,在这里也被考虑进来了。


1
如果您提供参考链接就更好了:http://www.pyimagesearch.com/2015/04/06/zero-parameter-automatic-canny-edge-detection-with-python-and-opencv/ - harsh
3
在回答中提到了它。 - Jeru Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接