不要调库,写出canny边缘检测的Python代码
时间: 2024-09-29 13:00:30 浏览: 40
Canny边缘检测是一种广泛使用的图像处理算法,用于检测图像中的边缘。虽然Python中有现成的库如OpenCV可以方便地进行边缘检测,如果你想要不依赖外部库来实现,我们可以基于简单的数学运算和图像处理步骤来编写代码。这里是一个简单的非库版本的Canny边缘检测算法示例:
```python
import numpy as np
def gradient(x):
dx = [ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1] ]
dy = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
Gx = np.zeros_like(x)
Gy = np.zeros_like(x)
for i in range(3):
for j in range(3):
Gx += x[(i+1)*x.shape[0]:-(i+1), (j+1)*x.shape[1]:-(j+1)] * dx[i][j]
Gy += x[(i+1)*x.shape[0]:-(i+1), (j+1)*x.shape[1]:-(j+1)] * dy[i][j]
return np.hypot(Gx, Gy)
def non_max_suppression(img, sigma=3):
blurred = gaussian_filter(img, sigma)
dx = gradient(blurred)
dy = gradient(np.fliplr(blurred)) # 对垂直方向求导后水平翻转
suppressed = np.copy(img)
suppressed[dy < 0] = 0 # 水平边缘,向下抑制
suppressed[dx < 0] *= dy > 0 # 垂直边缘,如果向左,则保持;否则抑制
return suppressed
def thresholding(suppressed, low_threshold, high_threshold):
edges = np.copy(suppressed)
edges[suppressed >= high_threshold] = 255
edges[suppressed < low_threshold] = 0
return edges
# 使用函数
img = np.random.rand(100, 100) # 生成测试图像
edges = thresholding(non_max_suppression(img), 0.1*img.max(), 0.3*img.max())
```
请注意,这个代码仅用于演示目的,实际应用中可能会涉及到更多的优化和调整。此外,它没有考虑双阈值策略、连接边缘等完整的Canny流程。
阅读全文