编程实现Canny算子的前3步(高斯滤波,梯度强度和方向计算和非最大值抑制)对提供的图像进行边缘特征检测并输出图像。
时间: 2024-12-28 21:39:56 浏览: 19
要实现Canny算子的前三个步骤,我们需要分步操作:
1. **高斯滤波**[^2]:这是Canny算法的第一步,它有助于减少噪声影响。这里以Python的OpenCV库为例,使用`cv2.GaussianBlur()`函数进行高斯滤波。
```python
import cv2
import numpy as np
# 假设img是输入的图像
blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
```
2. **计算梯度强度和方向**[^1]:使用Sobel算子计算图像的梯度。这涉及两个步骤:水平和垂直方向的梯度计算,然后合成。
```python
gray_img = cv2.cvtColor(blurred_img, cv2.COLOR_BGR2GRAY)
sobel_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize=3)
# 计算梯度幅值和方向
gradient_mag, gradient_dir = cv2.cartToPolar(sobel_x, sobel_y, angleInDegrees=True)
```
3. **非极大值抑制(Non-Maximum Suppression, NMS)**:这一步用来保持每个像素点的梯度方向,但仅保留强度最大的邻域内的像素。
```python
dx = np.zeros_like(gradient_mag)
dy = np.zeros_like(gradient_mag)
dx[np.where((gradient_dir >= 45) & (gradient_dir < 135))] = 1
dx[np.where((gradient_dir >= 225) & (gradient_dir < 315))] = -1
dy[(gradient_dir >= 0) & (gradient_dir < 45)] = 1
dy[(gradient_dir >= 135) & (gradient_dir < 225)] = -1
mask = np.logical_or.reduce((np.abs(dx) == gradient_mag, np.abs(dy) == gradient_mag))
filtered_grad = np.copy(gradient_mag)
filtered_grad[mask] = 0
thresholded_img = np.uint8(filtered_grad > cv2.THRESH_CANNY(minVal, maxVal))
```
这里的`minVal`和`maxVal`是Canny算法的双阈值,可以根据具体需求调整。
请注意,实际应用时可能还需要对这些步骤进行一些优化和参数调整,以获得最佳的结果。
阅读全文