Canny算法简解
Canny理论:
1、首先用高斯模糊过滤掉噪声
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。2、然后用 Sobel 过滤器确定图像边缘的强度和方向
根据以上公式可以求出梯度及方向。
3、对sobel的输出使用非极大抑制来观察每个检测边缘的强度和方向,选出局部最大像素,从而把最强的边缘绘制成连续的、一个像素宽的细线
4、最后 用滞后阀值来分离最佳边缘。滞后阀值是双阀值化操作,以某图一像素宽的横切面为例,这里的曲线代表边缘强度,峰值指的是十分强的边缘。使用滞后阀值时 我们要确定一个高阀值 以便允许这些强边缘通过,再设置一个低阀值,任何低于该阀值的边缘即为弱边缘 会被舍弃。但位于高低阀值之间的边缘只有当其与另一个强边缘相连时 才会得到保留。这样Canny 就删除了弱边缘、消除了噪声,还将关联最强的那些边缘分离了出来,而这些边缘恰恰最可能是物体边界的一部分。高阈值和低阈值的比率应为2:1,3:1 。
由于 Canny 着重强调重要边缘,所以它特别适合检测边界和形状。
代码实现:
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)
gray = cv2.cvtColor(image_copy,cv2.COLOR_RGB2GRAY) plt.imshow(gray,cmap='gray')
lower =120 upper =240 edge = cv2.Canny(gray,lower,upper) plt.imshow(edge,cmap='gray')
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')

更多精彩