(1) 减噪声:边缘检测对噪声非常敏感,利用5*5高斯滤波器进行操作
(2) 图像梯度:利用sobel求X、Y的梯度,得到边缘梯度和方向,梯度方向与边缘垂直
(3) 梯度幅值非最大值抑制:该点是8邻域的边缘梯度幅值最大值,则该点保留,否则就剔除
点A在垂直方向边缘上,梯度方向正交于边缘。点B与点C在梯度方向,检测点A是否点B和点C形成局部极大值,如果是,进入下阶段,否则设置为0。
(4) 滞后阈值:梯度大于最大值是边界,低于最小值是非边界,剔除掉。介于最小值和最大值之间的边界取决于连接性,与只是真实边界相连为边界,不相连予以剔除
边缘A高于最大值,被认为是真边缘。边缘C低于最大值,与边缘A相连,被认为是真边缘。边缘B没有与真边缘相连接,予以剔除。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()