Python用原图减去canny算子检测后的图,代码
时间: 2024-06-08 14:00:55 浏览: 13
这里提供一种基于OpenCV库实现的Python代码:
```python
import cv2
# 读取原图
img = cv2.imread('original.jpg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Canny算子检测边缘
edges = cv2.Canny(gray, 100, 200)
# 将原图减去Canny检测后的图像
result = cv2.subtract(img, cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR))
# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中:
- `cv2.imread()`函数用于读取原图;
- `cv2.cvtColor()`函数用于将原图转换为灰度图;
- `cv2.Canny()`函数用于对灰度图进行Canny算子边缘检测;
- `cv2.subtract()`函数用于将原图减去Canny检测后的图像;
- `cv2.imshow()`函数用于显示结果图像;
- `cv2.waitKey()`函数用于等待用户按下任意键后关闭图像窗口;
- `cv2.destroyAllWindows()`函数用于关闭所有图像窗口。
相关问题
用opencv-python编程实现canny算子检测复杂图像的边缘检测
好的,下面是使用 OpenCV-Python 库实现 Canny 算子进行边缘检测的示例代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波器的大小
kernel_size = (5, 5)
# Sobel 算子的大小
sobel_size = 3
# 高低阈值
low_threshold = 50
high_threshold = 150
# 进行边缘提取
edges = cv2.Canny(gray, low_threshold, high_threshold, apertureSize=sobel_size, L2gradient=False)
# 显示边缘图像
cv2.imshow('Edges', edges)
cv2.waitKey(0)
# 对边缘进行膨胀操作
kernel = np.ones((3, 3), np.uint8)
dilation = cv2.dilate(edges, kernel, iterations=1)
# 显示膨胀后的边缘图像
cv2.imshow('Dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码将读取一张名为 `image.jpg` 的图像,将其转为灰度图像,并使用 Canny 算子进行边缘检测,然后对边缘进行膨胀操作,最后分别显示边缘图像和膨胀后的边缘图像。
你可以根据实际需要对代码进行修改和调整,得到不同的边缘检测效果。
Prewitt算子,Sobel算子,Laplacian算子,Canny算子边缘检测python代码
以下是基于 OpenCV 库实现的 Prewitt 算子、Sobel 算子、Laplacian 算子、Canny 算子边缘检测的 Python 代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Prewitt算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
img_prewittx = cv2.filter2D(img, -1, kernelx)
img_prewitty = cv2.filter2D(img, -1, kernely)
img_prewitt = img_prewittx + img_prewitty
# Sobel算子
img_sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
img_sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
img_sobel = img_sobelx + img_sobely
# Laplacian算子
img_laplacian = cv2.Laplacian(img, cv2.CV_64F)
# Canny算子
img_canny = cv2.Canny(img, 100, 200)
# 显示图像
cv2.imshow('prewitt', img_prewitt)
cv2.imshow('sobel', img_sobel)
cv2.imshow('laplacian', img_laplacian)
cv2.imshow('canny', img_canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,Prewitt 算子和 Sobel 算子使用的是 `cv2.filter2D()` 函数,Laplacian 算子使用的是 `cv2.Laplacian()` 函数,Canny 算子使用的是 `cv2.Canny()` 函数。注意,Canny 算子需要指定两个阈值参数。