算法基于Python3.6实现
Python库
- opencv-python
- matplotlib
- numpy
下图是测试结果。
详细流程
- 输入图片并将其转换为灰度图
- 通过高斯滤波平滑图片去噪
- 使用Canny算法检测边缘
- 提取感兴趣候选区域
- 霍夫变换,直线检测
- 直线拟合得到车道线
图像处理
Candy算法介绍可以参考:https://blog.csdn.net/sc944201630/article/details/81272154
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
def load_image(path, show_img=False):
img = cv2.imread(path)
if(show_img):
cv2.imshow("original img", img)
cv2.waitKey(-1) # 按下任意键继续
return img
# 对图片进行灰度化,能加速边缘检测
def image_gray(img, show_gray=False, save_gray_img=False):
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
if show_gray:
cv2.imshow("gray_image", img_gray)
cv2.waitKey(-1)
if save_gray_img:
cv2.imwrite("./gray_img.jpg", img_gray)
return img_gray
# canny 算法,边缘检测
# cv2.Canny()参数:分别是输入图片,较小阈值和较大阈值
def canny_edge(img, g_kernel, g_dev, lth, hth, show_img=False, save_img=False):
# 高斯滤波
# (g_kernel, g_kernel) 高斯滤波的大小设置
# g_dev: 高斯滤波的标准差,如果设置为0.0即自动生成
# 滤波效果由标准差来决定
img_gaussian = cv2.GaussianBlur(img, (g_kernel, g_kernel), g_dev)
img_edge = cv2.Canny(img_gaussian, lth, hth)
if save_img:
cv2.imwrite("./img_edge.jpg", img_edge)
if show_img:
cv2.imshow("img_edge", img_edge)
cv2.waitKey(-1)
return img_edge
我们得到的边缘信息图片如下:
边缘处理
得到边缘信息之后我们需要提取感兴趣候选区域,感兴趣候选区域可通过代码自动提取,但这里我们是手动提取感兴趣候选区域。
# 提取感兴趣候选区域
# 显示图片,获取车道线坐标
# plt.imshow(img)
# plt.show()
# 提取区域,创建掩膜
def get_mask(img, show_img=False