当前位置: 首页 > 知识库问答 >
问题:

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

包丁雨
2023-03-14

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

这是我使用的步骤。

  1. Imgproc。cvtColor()
  2. Imgproc。Canny()
  3. Imgproc。高斯模糊()
  4. Imgproc。findContours()
  5. Imgproc。approxPolyDP()
  6. findLargestRectangle()
  7. 找到矩形的顶点
  8. 使用重心法逆时针查找矩形左上角的顶点
  9. 找到矩形的高度和宽度,以保持纵横比并进行透视变换

应用所有这些步骤后,我可以很容易地从图像中获取文档或最大的矩形。但这在很大程度上取决于背景和文件页的强度差异。由于Canny边缘检测器基于强度梯度原理工作,因此从实现角度来看,总是假设强度存在差异。这就是为什么Canny考虑了各种阈值参数。

  1. 下限
  2. 更高的门槛

因此,如果一个像素的强度梯度大于较高的阈值,它将被添加为输出图像中的边缘像素。如果一个像素的强度梯度值低于较低的阈值,它将被完全拒绝。如果一个像素的强度介于较低和较高的阈值之间,只有当它连接到任何其他值大于较高阈值的像素时,它才会被添加为边缘像素。

我的主要目的是使用Canny边缘检测进行文档扫描。那个么,我如何动态计算这些阈值,以便它可以同时处理暗背景和亮背景?

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

共有2个答案

巩阳秋
2023-03-14

使用我从这个博客中获得的以下片段:

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被选择来设置上下阈值。0.33值通常被统计学家用于数据科学。所以这里也考虑它。

邴俊达
2023-03-14

你可以用大津的方法计算你的阈值。

(Python)代码看起来像这样:

high_thresh, thresh_im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
lowThresh = 0.5*high_thresh
 类似资料:
  • Canny边缘检测用于检测图像中的边缘。 它接受灰度图像作为输入,并使用多级算法。可以使用类的方法在图像上执行此操作,以下是此方法的语法。 该方法接受以下参数 - image - 表示此操作的源(输入图像)的对象。 edges - 表示此操作的目标(边缘)的对象。 threshold1 - 类型为的变量表示滞后过程的第一个阈值。 threshold2 - 类型为的变量表示滞后过程的第二个阈值。 示

  • 本文向大家介绍python实现canny边缘检测,包括了python实现canny边缘检测的使用技巧和注意事项,需要的朋友参考一下 canny边缘检测原理 canny边缘检测共有5部分组成,下边我会分别来介绍。 1 高斯模糊(略) 2 计算梯度幅值和方向。 可选用的模板:soble算子、Prewitt算子、Roberts模板等等; 一般采用soble算子,OpenCV也是如此,利用soble水平和

  • 目标 在这一章中,我们将学习 Canny 边缘检测的概念 OpenCV 的 Canny 边缘检测函数:cv2.Canny() 理论基础 Canny边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 于 1986 年开发的。它是一个多阶段算法,我们将学习每个阶段做了什么。 降噪 由于边缘检测容易受到图像中的噪声影响,因此首先要用5x5高斯滤波器去除图像中的噪声。我们在前面的章节已经

  • 目标 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 这是一个多阶段算法,我们将经历每个阶段。 降噪 由于边缘检测容易受到图像中噪声的影响,因此第一步是使用5x5高斯滤波器消除图像中的噪声。我们已经在前面的章节中看到了这一点。 查找图像的强度梯度 然

  • 我正试图从彩色背景图像中提取文本。我正在尝试的一种方法是边缘检测。用它我把原始图像转换成我可以处理的图像。这将消除图像中的所有颜色,只留下边缘。 我使用此代码获取边缘图像 我的问题是,在我得到这些图像后,我如何才能追踪这些图像中的字母?任何帮助都会很好。谢谢你们 这些是原始图像和边缘检测图像。 原始图像 边缘检测图像

  • 我想检测具有一定角度/方向的边缘。 根据SO中的帖子改编,我想出了使用OpenCV幅值、相位和Sobel函数来过滤不需要的边缘点。然后使用幅值图像(以相位图像为条件)输出边缘点。 然而,结果与Canny边缘函数不相似。最好是过滤掉带有不需要的角度的边缘,但检测到的边缘是点的斑点,而不是细线边缘 在使用findContour后,左边缘图像也会绘制出来,但这几乎没有帮助 1) 为了模仿精明的处理,还应