六、Canny 边缘检测

suaxi
2025-10-26 / 0 评论 / 7 阅读 / 正在检测是否收录...

1. 流程

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

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

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

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

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

2. 高斯滤波器

高斯滤波器.png

3. 梯度和方向

梯度和方向.png

4. 非极大值抑制

  • 线性插值法

    1.1非极大值抑制-线性插值法.png

    设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) 表示两点之间的距离

  • 简化

    1.2非极大值抑制-线性插值法简化.png

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

    1.3非极大值抑制-线性插值法简化.png

5. 双阈值检测

1.4双阈值检测.png

梯度值 > 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()

# 阈值范围越小细节越多

2.1original_gray.png

2.2canny.png

2.3canny.png

0

评论 (0)

取消