基于Canny算法的自适应阈值边缘检测算法代码
时间: 2024-10-29 13:15:08 浏览: 31
Canny边缘检测是一种经典且广泛使用的图像处理算法,它包含两个步骤:高斯滤波和平滑后的梯度计算,以及非极大值抑制和双阈值化。基于Canny算法的自适应阈值版本会根据图像局部像素强度的变化动态调整阈值,这样可以更好地适应噪声和光照变化。
以下是基于Python OpenCV库的一个简单示例,展示了如何实现自适应Canny边缘检测:
```python
import cv2
import numpy as np
def adaptive_canny(image, sigma=0.33):
# 高斯平滑
blurred = cv2.GaussianBlur(image, (5, 5), sigmaX=sigma, sigmaY=sigma)
# 计算梯度幅值和方向
gradient_x, gradient_y = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)
gradient_y, gradient_x = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)
magnitude, angle = cv2.cartToPolar(gradient_x, gradient_y, angleInDegrees=True)
# 自适应阈值
low_threshold = int(max(0, (1.0 - sigma) * np.median(magnitude)))
high_threshold = int(min(255, (1.0 + sigma) * np.median(magnitude)))
edges = np.zeros_like(image)
edges[(magnitude >= low_threshold) & (magnitude <= high_threshold)] = 255
# 双阈值化
edges = cv2.Canny(edges, low_threshold, high_threshold)
return edges
# 使用例子
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
edges = adaptive_canny(image)
cv2.imshow('Adaptive Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个例子中,`sigma`是一个关键参数,用于控制阈值的动态范围。较小的`sigma`会使阈值更敏感,而较大的`sigma`则会降低对细节的敏感性。
阅读全文