程序实现自适应阈值的canny
时间: 2023-10-02 16:09:37 浏览: 131
Canny边缘检测算法中的阈值参数很重要,可以通过调整阈值参数来控制检测到的边缘的数量和质量。传统的Canny算法需要手动设置阈值参数,但是实际应用中,不同的图像和应用场景需要不同的阈值参数。因此,自适应阈值的Canny算法变得越来越受欢迎。
实现自适应阈值的Canny算法可以采用以下步骤:
1. 对输入图像进行灰度化处理。
2. 对灰度图像进行高斯滤波,以减少噪声的影响。
3. 计算梯度幅值和方向。
4. 对梯度幅值进行非极大值抑制,以保留边缘的细节。
5. 对每个像素点进行双阈值处理,将像素点分为强边缘、弱边缘和非边缘三类。
6. 对弱边缘进行连接,以得到完整的边缘。
7. 自适应调整双阈值参数,以适应不同的图像和应用场景。
代码实现如下:
```python
import cv2
import numpy as np
def adaptive_canny(image, sigma=0.33):
# 计算高斯滤波器的尺寸
ksize = int(2 * np.ceil(3 * sigma) + 1)
# 对图像进行高斯滤波
blurred = cv2.GaussianBlur(image, (ksize, ksize), sigma)
# 计算梯度幅值和方向
grad_x = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)
gradient = np.sqrt(grad_x ** 2 + grad_y ** 2)
theta = np.arctan2(grad_y, grad_x) * 180 / np.pi
theta[theta < 0] += 180
# 进行非极大值抑制
nms = np.zeros_like(gradient)
for i in range(1, gradient.shape[0] - 1):
for j in range(1, gradient.shape[1] - 1):
if (0 <= theta[i, j] < 22.5) or (157.5 <= theta[i, j] <= 180):
if (gradient[i, j] > gradient[i, j - 1]) and (gradient[i, j] > gradient[i, j + 1]):
nms[i, j] = gradient[i, j]
elif (22.5 <= theta[i, j] < 67.5):
if (gradient[i, j] > gradient[i - 1, j - 1]) and (gradient[i, j] > gradient[i + 1, j + 1]):
nms[i, j] = gradient[i, j]
elif (67.5 <= theta[i, j] < 112.5):
if (gradient[i, j] > gradient[i - 1, j]) and (gradient[i, j] > gradient[i + 1, j]):
nms[i, j] = gradient[i, j]
elif (112.5 <= theta[i, j] < 157.5):
if (gradient[i, j] > gradient[i + 1, j - 1]) and (gradient[i, j] > gradient[i - 1, j + 1]):
nms[i, j] = gradient[i, j]
# 双阈值处理
threshold1 = np.median(gradient) * sigma
threshold2 = np.median(gradient) * 2 * sigma
strong_edges = (nms > threshold2).astype(np.uint8)
weak_edges = ((nms >= threshold1) & (nms <= threshold2)).astype(np.uint8)
# 连接弱边缘
connected_edges = cv2.dilate(strong_edges, np.ones((3, 3), np.uint8), iterations=1) & weak_edges
# 输出结果
return connected_edges
# 加载图像
image = cv2.imread("test.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 自适应Canny边缘检测
edges = adaptive_canny(gray)
# 显示结果
cv2.imshow("Original", image)
cv2.imshow("Edges", edges * 255)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在自适应Canny算法中,可以通过调整sigma参数来控制双阈值的范围,从而适应不同的图像和应用场景。
阅读全文