1. 流程
(1) 使用高斯滤波器,以平滑图像,滤除噪声
(2) 计算图像中每个像素点的梯度强度和方向
(3) 应用非极大值(Nono-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应
(4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
(5) 通过抑制孤立的弱边缘最终完成边缘检测
2. 高斯滤波器

3. 梯度和方向

4. 非极大值抑制
线性插值法

设g1的梯度幅值M(g1),g2的梯度幅值M(g2),则dtmp1可以得到:
M(dtmp1) = w x M(g2) + (1-w) x M(g1)
其中w = distance(dtmp1, g2)/distance(g1, g2)
distance(g1, g2) 表示两点之间的距离
简化

为了简化计算,由于一个像素周围有八个像素,可以将一个像素的梯度方向离散为八个方向,如此一来计算前后即可,简化插值法

5. 双阈值检测

梯度值 > maxVal:则该点处理为边界
minVal < 梯度值 < maxVal:与现有的点(A点、C点)有关联(能连线),则保留,否则舍弃(B点)
梯度值 < minVal:舍弃
6. 演示
import cv2 # OpenCV 读取的格式是 BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img = cv2.imread('ysg.png', cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='gray')
plt.show()
# 参数说明:源图,最小值,最大值
c1 = cv2.Canny(img, 60, 150)
plt.imshow(c1, cmap='gray')
plt.show()
c2 = cv2.Canny(img, 50, 95)
plt.imshow(c2, cmap='gray')
plt.show()
# 阈值范围越小细节越多


评论 (0)