python实现+彩色图像转换为灰度图+车道线图像去噪+Prewitt 一阶边缘检测算子检测车道边缘线+生成 Mask 掩模+直线检测+ 绘制车道线
时间: 2023-08-07 16:03:03 浏览: 128
基于opencv传统数字图像处理实现车道线检测-python-c++源码+项目说明.7z
5星 · 资源好评率100%
好的,下面是实现这个功能的 Python 代码:
```python
import cv2
import numpy as np
# 读入原始图像
img = cv2.imread('road.jpg')
# 将原始图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行高斯模糊去噪
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 使用 Prewitt 算子进行边缘检测
prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])
edge_x = cv2.filter2D(blur, -1, prewitt_x)
edge_y = cv2.filter2D(blur, -1, prewitt_y)
edge = cv2.addWeighted(edge_x, 0.5, edge_y, 0.5, 0)
# 生成车道线的 Mask 掩模
mask = np.zeros_like(edge)
mask[200:400, :] = 255
# 对边缘检测结果应用 Mask 掩模
masked_edge = cv2.bitwise_and(edge, mask)
# 进行直线检测
lines = cv2.HoughLinesP(masked_edge, rho=1, theta=np.pi/180, threshold=50, minLineLength=50, maxLineGap=5)
# 绘制车道线
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 显示车道线检测结果
cv2.imshow('Lane Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先读入了原始图像,并将其转换为灰度图像。然后,我们对灰度图像进行高斯模糊去噪,以减少噪声对边缘检测结果的影响。接着,我们使用 Prewitt 算子进行边缘检测,得到车道边缘线的强度图像。然后,我们生成了车道线的 Mask 掩模,将其应用到边缘检测结果上,以过滤掉不需要的区域。最后,我们使用 cv2.HoughLinesP() 函数进行直线检测,得到车道线的端点坐标,并使用 cv2.line() 函数将其绘制在原始图像上。
需要注意的是,在实际应用中,我们需要对车道线进行拟合和平滑处理,以得到更加精确的车道线。此外,我们还可以使用其他的边缘检测算子和直线检测方法来实现车道线检测,以提高检测的精度和鲁棒性。
阅读全文