编程实现Canny算子的前3步(高斯滤波,梯度强度和方向计算和非最大值抑制)对提供的图像进行边缘特征检测。
时间: 2024-12-28 09:39:47 浏览: 16
在Python中,Canny边缘检测的一般流程包括三个主要步骤:
1. **高斯滤波**[^1]:
```python
from scipy.ndimage import gaussian_filter
original_image = ... # 原始图像
blurred_image = gaussian_filter(original_image, sigma=1) # 使用高斯滤波器平滑图像
```
2. **计算梯度强度和方向**[^2]:
```python
from skimage.feature import sobel
gradient_x, gradient_y = sobel(blurred_image)
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2) # 梯度幅值
gradient_direction = np.arctan2(gradient_y, gradient_x) # 梯度方向 (以弧度表示)
```
3. **非极大值抑制(Non-Maximum Suppression, NMS)**:
```python
direction_gradient = gradient_direction * (np.pi / 2) # 转换为0到pi范围
suppressed_gradients = np.zeros_like(direction_gradient)
for i in range(1, gradient_magnitude.shape[0]-1):
for j in range(1, gradient_magnitude.shape[1]-1):
if direction_gradient[i, j] == 0 or direction_gradient[i, j] == np.pi:
suppressed_gradients[i, j] = gradient_magnitude[i, j]
else:
if direction_gradient[i, j] > direction_gradient[i-1, j] and direction_gradient[i, j] > direction_gradient[i+1, j]:
suppressed_gradients[i, j] = gradient_magnitude[i, j]
elif direction_gradient[i, j] < direction_gradient[i-1, j] and direction_gradient[i, j] < direction_gradient[i+1, j]:
suppressed_gradients[i, j] = gradient_magnitude[i-1, j] if gradient_magnitude[i-1, j] > gradient_magnitude[i+1, j] else gradient_magnitude[i+1, j]
```
完成这三步后,`suppressed_gradients`就是经过非极大值抑制处理后的图像,下一步将是双阈值筛选来确定最终的边缘。
阅读全文