python图像边缘检测_python Canny边缘检测算法的实现
时间: 2023-11-14 20:56:06 浏览: 45
Canny边缘检测是一种常用的图像处理算法,它可以检测图像中物体的边缘,并将其转换为二值化图像。下面是Python实现Canny边缘检测算法的示例代码:
``` python
import cv2
import numpy as np
# 读取图像
img = cv2.imread("test.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用高斯滤波平滑图像
blur = cv2.GaussianBlur(gray, (3, 3), 0)
# 计算梯度
dx = cv2.Sobel(blur, cv2.CV_16S, 1, 0)
dy = cv2.Sobel(blur, cv2.CV_16S, 0, 1)
# 计算梯度的幅值和方向
edge = cv2.Canny(dx, dy, 50, 150)
# 显示结果
cv2.imshow("original image", img)
cv2.imshow("edge detection", edge)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先读取了一张图像,并将其转换为灰度图像。接下来,我们使用高斯滤波平滑了图像,然后使用Sobel算子计算了图像的梯度。最后,我们使用Canny算法计算了梯度的幅值和方向,并将其转换为二值化图像进行显示。
在运行上述代码之前,需要先安装OpenCV库。
相关问题
利用Canny算法进行图像边缘检测Python实现代码
好的,下面是利用Canny算法进行图像边缘检测的Python实现代码:
```python
import cv2
# 读取图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 边缘检测
edges = cv2.Canny(img, 100, 200)
# 显示图像
cv2.imshow('Original image', img)
cv2.imshow('Edge image', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`cv2.imread`函数用于读取图像,`cv2.Canny`函数用于进行边缘检测,`cv2.imshow`函数用于显示图像,`cv2.waitKey`函数用于等待用户按下按键,`cv2.destroyAllWindows`函数用于关闭所有窗口。
在上述代码中,`cv2.Canny`函数的第一个参数为输入图像,第二个参数为阈值下限,第三个参数为阈值上限。在实际使用中,可以根据图像特点和需求,调整这两个阈值来得到更好的边缘检测效果。
python实现canny边缘检测算法
Canny边缘检测是一种经典的图像边缘检测算法,下面是Python实现代码:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('image.jpg')
# 灰度化处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯平滑滤波
gaussian = cv2.GaussianBlur(gray, (5, 5), 0)
# 计算梯度
sobelx = cv2.Sobel(gaussian, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(gaussian, cv2.CV_64F, 0, 1, ksize=3)
mag = np.sqrt(sobelx**2 + sobely**2)
mag = np.uint8(mag)
# 非极大值抑制
height, width = mag.shape
non_max = np.zeros((height, width), dtype=np.uint8)
for i in range(1, height - 1):
for j in range(1, width - 1):
if sobelx[i, j] == 0:
tangent = 1e5
else:
tangent = sobely[i, j] / sobelx[i, j]
if mag[i, j] >= mag[i-1, j-1] * tangent and mag[i, j] >= mag[i+1, j+1] * tangent:
non_max[i, j] = 255
elif mag[i, j] >= mag[i-1, j] and mag[i, j] >= mag[i+1, j]:
non_max[i, j] = 255
elif mag[i, j] >= mag[i, j-1] * tangent and mag[i, j] >= mag[i, j+1] * tangent:
non_max[i, j] = 255
elif mag[i, j] >= mag[i, j-1] and mag[i, j] >= mag[i, j+1]:
non_max[i, j] = 255
# 双阈值和连接边缘
weak = 75
strong = 255
result = np.zeros((height, width), dtype=np.uint8)
result[mag > weak] = 1
result[mag > strong] = 255
for i in range(1, height - 1):
for j in range(1, width - 1):
if result[i, j] == 1:
if result[i-1, j-1] == 255 or result[i-1, j] == 255 or result[i-1, j+1] == 255 or result[i, j-1] == 255 or result[i, j+1] == 255 or result[i+1, j-1] == 255 or result[i+1, j] == 255 or result[i+1, j+1] == 255:
result[i, j] = 255
else:
result[i, j] = 0
# 显示图片
cv2.imshow('Canny Edge Detection', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
以上代码中使用了OpenCV库实现了Canny边缘检测算法,其中包括灰度化处理、高斯平滑滤波、计算梯度、非极大值抑制、双阈值和连接边缘等步骤,最终结果显示在窗口中。