OpenCV-Python图像处理:Canny边缘检测

本 文 目 录 :

前言:Canny边缘检测算法介绍

1. 高斯滤波器(GaussianBlur)     

2. 梯度和方向 (Sobel算子)

3. 非极大值抑制(NMS)

4. 双阈值检测

5. Canny边缘检测代码实现


前言:Canny边缘检测算法介绍

canny边缘检测是一种一阶微分算子检测算法,是迄今为止讨论的边缘检测子中最优秀的。Canny(坎尼)方法基于以下三个基本目标:

  • 1)低错误率。所有边缘都应被找到,并且不能有虚假响应;
  • 2)边缘点精确定位。已定位的边缘必须应该尽可能接近真实边缘,也就是说,由检测子标记为边缘的一点和真实边缘的中心之间的距离应最小。
  • 3)单个边缘点响应。对于每个真实的边缘点,检测子应只返回一个点。也就是说,真实边缘周围的局限最大数应是最小的。这意味着检测子不应识别只存在单个边缘点的多个边缘像素。

Canny的工作本质是,从数学表达了上述三个准则,并试图找到这些公式的最优解。Canny边缘检测在一阶微分算子的基础上,增加了非最大值抑制和双阈值两项改进。利用非极大值抑制不仅可以有效地抑制多响应边缘,而且还可以提高边缘的定位精度;利用双阈值可以有效减少边缘的漏检率。canny边缘检测算法的步骤小结如下:

  • 1)使用高斯滤波器平滑输入图像,滤除噪声;
  • 2)计算梯度幅度图像和角度图像;
  • 3)对梯度幅度图像应用非极大值抑制(Non-maximum Suppression),以消除边缘检测带来的杂散响应;
  • 4)使用双阈值(Double Thresholding)处理和连通性分析来检测与连接边缘。

1. 高斯滤波器(GaussianBlur)     

高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。   

高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的,为1。而高斯滤波器的模板系数,随着距离模板中心距离的增大,系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器而言,对图像模糊程度较小,更能保持图像的整体细节。

二维的高斯函数如下:其中 (x , y)为坐标, σ 为标准差:

  不同尺寸的滤波器,得到的值也不同,下面是 (2k+1)x(2k+1) 滤波器的计算公式 :

例如,标准差\sigma =1.3 的 3*3 的整数形式的高斯滤波器如下(归一化处理):

2. 梯度和方向 (Sobel算子)

接下来,我们要寻找边缘,在这张圆中,梯度即为边界点,即灰度强度变化最强的位置(一道黑边一道白边中间就是边缘,它的灰度值变化是最大的)。Sobel算子就是找到这些存在梯度的边缘位置(边缘检测)。


在图像中,用梯度来表示灰度值的变化程度和方向。我们引入Gx和Gy来处理水平和竖直两个方向的梯度。Gx是用图像右边的数据减去左边的数据来比较大小,Gy是用图像下边的数据减去上边的数据来比较大小,以此判断像素周围是否存在梯度。(请参考:OpenCV-Python中的图像处理

3. 非极大值抑制(NMS)

在目标检测任务中,一个目标可能会被多个边界框检测到,这些边界框可能会有不同的位置和大小,但表示同一个目标。非极大值抑制(Non-Maximum Suppression,NMS)是一种常用的方法,用于抑制这些重叠的边界框,只保留置信度最高的那个边界框,从而得到最终的目标检测结果。

NMS算法原理

  • 1)首先,对所有的边界框按照其置信度进行排序,置信度最高的边界框排在最前面。
  • 2)从置信度最高的边界框开始,依次遍历其余边界框。
  • 3)对于当前遍历到的边界框,如果它与前面已经保留的边界框的重叠程度(通过计算IOU值)大于一定阈值(比如0.5),那么就将其抑制掉,不保留。
  • 4)继续遍历下一个边界框,重复上述过程,直到所有的边界框都被处理完毕。

点A位于图像边缘垂直方向,梯度方向垂直于边缘,点B和点C位于梯度方向。因此,检查点 A 和点 、点 C,确定点A是否是局部最大值。如果点 A 是局部最大值,则继续下一个阶段;如果点 A 不是局部最大值,则其被抑制设为0。

4. 双阈值检测

在进行了非极大值抑制之后,剩余的梯度像素已经可以较准确地表示图像中的实际边缘了。但是,还可能仍然存在一些由于噪声和颜色变化引起的一些伪边缘存在。为了解决这些杂散的伪边缘响应,必须要对梯度像素再过滤一遍。    

处理思路:

  • 人工给定两个阈值,一个是低阈值TL,一个高阈值TH,
  • 如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素,该位置的像素值置255;
  • 如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;
  • 如果边缘像素的梯度值小于低阈值,则会被抑制,该位置的像素值置0。

双阈值检测: 

如果边缘像素的值高于高阈值,将其标记为强边缘像素;如果边缘像素值小于高阈值但大于低阈值,则将其标记为弱边缘像素;如果边缘像素值小于低阈值,则会被抑制。

通过这样的处理,NMS可以抑制掉大量重叠的边界框,只保留最好的那个边界框,从而得到最终的目标检测结果。这种方法虽然简单,但是在实践中非常有效,已经被广泛应用于各种目标检测任务中。

5. Canny边缘检测代码实现

OpenCV提供了函数cv2.Canny()来实现Canny边缘检测,其语法形式如下:         

  • edges=cv.Canny(image,threshold1,threshold2[,apertureSize[,L2gradient]])
    • edges为计算得到的边缘图像。
    • image为8位输入图像。
    • threshold1表示处理过程中的第一个阈值。
    • threshold2表示处理过程中的第二个阈值。
    • apertureSize表示Sobel算子的孔径大小。
    • L2gradient为计算图像梯度幅度(gradient magnitude)的标识。其默认值为False。 如果为 True,则使用更精确的 L2范数进行计算(即两个方向的导数的平方和再开方), 否则使用L1范数(直接将两个方向导数的绝对值相加)。一般令L2gradient为默认值。     
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("./liuyifei.jpg",cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img, 100, 200)   # 80为minVal(越小标准越低), 150为maxVal(越小标准越低)
v2 = cv2.Canny(img, 50, 100)
res = np.hstack((img,v1, v2))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

从上图可以看出,minVal和maxVal值越低时,能够捕捉到更多梯度的信息,进而使图像的线条更为丰富,但也要根据自己的研究目的合理设置阈值。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python是一个用于计算机视觉和图像处理的开源库。边缘检测OpenCV-Python中一个重要的图像处理操作。根据引用的内容,边缘检测的方法包括Laplacian边缘检测、Sobel边缘检测Canny边缘检测。其中,Laplacian边缘检测是一种基于二阶导数的方法,Sobel边缘检测是一种基于一阶导数的方法,而Canny边缘检测是一种综合了多种方法的优化算法。您可以根据引用中的文章目录了解更多关于这些方法的详细信息。 引用给出了一个使用OpenCV-Python进行自动确定阈值的边缘检测的示例代码。该代码首先读取一张名为'bee.jpg'的图像,并将其转换为灰度图像。然后,通过应用高斯模糊对图像进行预处理,使用自动确定阈值的方法计算合适的阈值,最后使用Canny边缘检测算法检测图像的边缘。您可以根据需要调整代码中的参数来适应不同的图像。 总而言之,OpenCV-Python提供了多种边缘检测方法,包括Laplacian边缘检测、Sobel边缘检测Canny边缘检测。您可以根据具体需求选择适合的方法,并使用OpenCV-Python提供的函数进行图像处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【OpenCV-Python】14.OpenCV边缘检测](https://blog.csdn.net/weixin_43843069/article/details/121950301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值