Canny算子python代码实现并保存
时间: 2023-12-12 15:27:47 浏览: 98
下面是Canny算子的Python实现代码:
```
import cv2
import numpy as np
# 读取图片
img = cv2.imread('input.jpg', 0)
# Canny算子边缘检测
edges = cv2.Canny(img, 100, 200)
# 保存图片
cv2.imwrite('output.jpg', edges)
```
其中,`input.jpg`为输入图片的路径,`output.jpg`为输出边缘检测结果的路径。
相关问题
Canny算子手写python实现
您好,欢迎和我对话。关于Canny算子的手写Python实现,我可以给您提供一个代码示例:
```
import cv2
import numpy as np
# 读取图像
img = cv2.imread('test.jpg',0)
# 高斯滤波
blur = cv2.GaussianBlur(img,(3,3),0)
# 计算梯度
sobelx = cv2.Sobel(blur,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(blur,cv2.CV_64F,0,1,ksize=3)
grad_magnitude = np.sqrt(sobelx**2 + sobely**2)
grad_magnitude *= 255.0 / grad_magnitude.max()
# NMS
grad_direction = np.arctan2(sobely, sobelx) * 180.0 / np.pi
grad_direction[grad_direction < 0] += 180
grad_direction[grad_direction > 157.5] -= 180
grad_direction = grad_direction.astype(int) // 45
grad_magnitude_padded = np.pad(grad_magnitude, ((1,1),(1,1)), mode='constant')
nms = np.zeros_like(grad_magnitude)
for i in range(1,grad_magnitude_padded.shape[0]-1):
for j in range(1,grad_magnitude_padded.shape[1]-1):
if grad_direction[i-1, j-1] == 0:
nms[i-1,j-1] = grad_magnitude_padded[i,j] > grad_magnitude_padded[i,j-1] and grad_magnitude_padded[i,j] > grad_magnitude_padded[i,j+1]
elif grad_direction[i-1, j-1] == 1:
nms[i-1,j-1] = grad_magnitude_padded[i,j] > grad_magnitude_padded[i-1,j+1] and grad_magnitude_padded[i,j] > grad_magnitude_padded[i+1,j-1]
elif grad_direction[i-1, j-1] == 2:
nms[i-1,j-1] = grad_magnitude_padded[i,j] > grad_magnitude_padded[i-1,j] and grad_magnitude_padded[i,j] > grad_magnitude_padded[i+1,j]
else:
nms[i-1,j-1] = grad_magnitude_padded[i,j] > grad_magnitude_padded[i-1,j-1] and grad_magnitude_padded[i,j] > grad_magnitude_padded[i+1,j+1]
# 双阈值处理
low_threshold_ratio = 0.05
high_threshold_ratio = 0.15
high_threshold = grad_magnitude.max() * high_threshold_ratio
low_threshold = high_threshold * low_threshold_ratio
edges = np.zeros_like(grad_magnitude)
edges[grad_magnitude > high_threshold] = 255
edges[grad_magnitude < low_threshold] = 0
for i in range(1,edges.shape[0]-1):
for j in range(1,edges.shape[1]-1):
if edges[i,j] == 255:
if np.any(edges[i-1:i+2,j-1:j+2] > 0):
edges[i,j] = 255
else:
edges[i,j] = 0
# 输出结果
cv2.imwrite('canny_output.jpg', edges)
```
这段代码实现了基于梯度的Canny算子,包括高斯滤波、梯度计算、非极大值抑制、双阈值处理等步骤。您可以将它保存为`.py`文件并在命令行中运行,将`test.jpg`替换为您想要处理的图像的路径。左图是原始图像,右图是输出结果。
![canny-demo.png](https://cdn.cnbj1.fds.api.mi-img.com/book/images/5549d6048f954302bd0dd80787a68041?thumb=1&w=1080&h=810)
希望能对您有所帮助!
如何在得到Canny算子后,保存结果
在Python中,你可以使用OpenCV库中的cv2.imwrite()函数来保存Canny算子的结果。
以下是一个保存Canny算子结果的示例代码:
```
import cv2
# 读取图像
img = cv2.imread('input.jpg', 0)
# Canny算子边缘检测
edges = cv2.Canny(img, 100, 200)
# 保存结果
cv2.imwrite('output.jpg', edges)
```
在这个例子中,我们首先读取了名为“input.jpg”的图像,并将其转换为灰度图像。然后,我们使用Canny算子进行边缘检测,并将结果保存为名为“output.jpg”的图像文件。
值得注意的是,保存的文件名和路径应该根据你的具体需求进行更改。
阅读全文