[opencv教程(十三)]Canny边缘检测

       边缘检测算法有很多,除了在图像梯度介绍的三个算子可以用于边缘检测,这次主要介绍Canny边缘算法

步骤

  1. 使用高斯滤波器,以平滑图像,滤除噪声。

  2. 计算图像中每个像素点的梯度强度和方向。

  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应

  4. 应用双阈值(Double-Threshold)检测来确定真实和潜在的边缘

  5. 通过抑制孤立弱边缘最终完成边缘检测

函数公式

 一、高斯滤波去噪

        因为噪声点也会有梯度,所以为了减少噪点影响,应该先去噪

        这边再讲一次高斯滤波,高斯滤波就是服从高斯分布矩阵的滤波矩阵,并且进行归一化处理

        G = \begin{bmatrix} 0.0924 & 0.1192 &0.0924 \\ 0.1192 & 0.1538 & 0.1192\\ 0.0924 & 0.1192& 0.0924 \end{bmatrix}

        e = H * A = \begin{bmatrix} h_{11} & h_{12} &h_{13} \\ h_{21} &h_{22} &h_{23} \\ h_{31} &h_{32} & h_{33} \end{bmatrix}*\begin{bmatrix} a_{11} & a_{12}&a_{13} \\ a_{21} &a_{22} &a_{23} \\ a_{31} &a_{32} & a_{33} \end{bmatrix}=sum\left ( \begin{bmatrix}h_{11}*a_{11} & h_{12}*a_{12}&h_{13}*a_{13} \\ h_{21}*a_{21}& h_{22}*a_{22}& h_{23}*a_{23}\\ h_{31}* a_{31} &h_{32}* a_{32 }&h_{33}* a_{33} \end{bmatrix} \right )

二、计算每个像素点的梯度和方向

        算子为Sobel

G_{x} = S_{x}*A = \begin{bmatrix} -1 & 0& 1\\ -2& 0&2 \\ -1 & 0 & 1 \end{bmatrix}*\begin{bmatrix} a_{11} &a_{12} &a_{13} \\ a_{21}& a_{22} & a_{23}\\ a_{31} &a_{32} & a_{33} \end{bmatrix} = -a_{11}+a_{13}-2a_{21}+2a_{23}-a_{31}+a_{33}

G_{y} = S_{y}*A = \begin{bmatrix} -1 & -2& -1\\ 0& 0&0 \\ 1 & 2 & 1 \end{bmatrix}*\begin{bmatrix} a_{11} &a_{12} &a_{13} \\ a_{21}& a_{22} & a_{23}\\ a_{31} &a_{32} & a_{33} \end{bmatrix} = -a_{11}-a_{12}-a_{13}+a_{31}+2a_{32}+a_{33}

三、非极大值抑制

        找到局部极大值,并筛除(抑制)邻域内其余的值。

        NMS算法实际上有很多,在此处仅讲解最原始的算法

  1. 将所有检测框按照得分从高到低排序。
  2. 选择得分最高的检测框并将其添加到最终检测框列表中。
  3. 计算该检测框与剩余检测框之间的交并比(IoU)。
  4. 去除与该检测框IoU值大于某个阈值的所有检测框。
  5. 重复步骤2-4,直到所有检测框都被处理完毕。

其中交并比(IoU)就是两个图像的交集面积和并集面积之比

具体可以查看:非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现 - 知乎 (zhihu.com)

 

四、应用双阈值

大于maxval的设置为边界,

处于maxval和minval中间 和边界点相连保留,其余舍去,

小于minval 舍去

案例

        

def On_Track_Canny(value):
    minvalue = cv2.getTrackbarPos('minvalue','Canny')
    maxvalue = cv2.getTrackbarPos('maxvalue','Canny')
    canny = cv2.Canny(lenaGary,minvalue,maxvalue)
    cv2.imshow('Canny',canny)
minvalue = 50
maxvalue = 100
lenaGary = cv2.imread('Picture/Lena.png',cv2.IMREAD_GRAYSCALE)
cv2.namedWindow('Canny')
cv2.createTrackbar('minvalue','Canny',50,100,On_Track_Canny)
cv2.createTrackbar('maxvalue','Canny',100,300,On_Track_Canny)
cv2.setTrackbarMin('minvalue','Canny',50)
cv2.setTrackbarMin('maxvalue','Canny',100)
canny = cv2.Canny(lenaGary,minvalue,maxvalue)
cv2.imshow('Canny',canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值