Canny理论:

1、首先用高斯模糊过滤掉噪声

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2、然后用 Sobel 过滤器确定图像边缘的强度和方向

Canny算法简解 随笔 第1张

Canny算法简解 随笔 第2张

根据以上公式可以求出梯度及方向。

3、对sobel的输出使用非极大抑制来观察每个检测边缘的强度和方向,选出局部最大像素,从而把最强的边缘绘制成连续的、一个像素宽的细线

4、最后 用滞后阀值来分离最佳边缘。滞后阀值是双阀值化操作,以某图一像素宽的横切面为例,这里的曲线代表边缘强度,峰值指的是十分强的边缘。使用滞后阀值时 我们要确定一个高阀值 以便允许这些强边缘通过,再设置一个低阀值,任何低于该阀值的边缘即为弱边缘 会被舍弃。但位于高低阀值之间的边缘只有当其与另一个强边缘相连时 才会得到保留。这样Canny 就删除了弱边缘、消除了噪声,还将关联最强的那些边缘分离了出来,而这些边缘恰恰最可能是物体边界的一部分。高阈值和低阈值的比率应为2:1,3:1 。

由于 Canny 着重强调重要边缘,所以它特别适合检测边界和形状。

 Canny算法简解 随笔 第3张

 

代码实现:

import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
image = cv2.imread('3.png')
image_copy = np.copy(image)
image_copy = cv2.cvtColor(image_copy,cv2.COLOR_BGR2RGB)
plt.imshow(image_copy)

Canny算法简解 随笔 第4张

gray = cv2.cvtColor(image_copy,cv2.COLOR_RGB2GRAY)
plt.imshow(gray,cmap='gray')

Canny算法简解 随笔 第5张

lower =120
upper =240
edge = cv2.Canny(gray,lower,upper)
plt.imshow(edge,cmap='gray')

Canny算法简解 随笔 第6张

wide = cv2.Canny(gray,30,100)
tight = cv2.Canny(gray,180,240)
f,(ax1,ax2) = plt.subplots(1,2,figsize=(20,10))
ax1.set_title('wide')
ax1.imshow(wide,cmap='gray')
ax2.set_title('tight')
ax2.imshow(tight,cmap='gray')

Canny算法简解 随笔 第7张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄