Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取

Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取图像处理颜色选择区域遮罩组合颜色和区域选择边缘检测Canny边缘检测Hough变换Hough变换寻找直线边缘检测图像和Hough变换本文偏向于算法实际代码的应用举例,对算法原理只作简单的介绍。图像处理无人驾驶汽车检测车道线需要用到的特征:颜色、形状、方向、图片中的位置。以RGB颜色为例,黑色为接近0,白色为接近255。颜色选择下面先编写一个简单的程序,通过对颜色的选择来检测车道线:1、首先,从matplo
摘要由CSDN通过智能技术生成

Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取

本文偏向于算法实际代码的应用举例,对算法原理只作简单的介绍。

图像处理

无人驾驶汽车检测车道线需要用到的特征:颜色、形状、方向、图片中的位置。以RGB颜色为例,黑色为接近0,白色为接近255。
在这里插入图片描述

颜色选择

下面先编写一个简单的程序,通过对颜色的选择来检测车道线:
1、首先,从matplotlib导入pyplot和image,导入了numpy来操作图像。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

2、然后读入一张图片,并打印出一些数据。提取x和y的大小,并制作一个图像的副本来操作。注意:在python中,对要操作的数组或者变量,尽量先复制出来处理。如果不复制出来,操作“a=b”,那么你对“a”所做的所有更改也将应用在“b”中!

# 读入图片并打印出一些数据
image = mpimg.imread('test.jpg')
print('This image is: ',type(image), 
         'with dimensions:', image.shape)

# 抓取x和y的大小,并制作一个图像的副本
ysize = image.shape[0]
xsize = image.shape[1]

# 注意:不要简单地使用“=”,要复制出来
color_select = np.copy(image)

3、接下来,在变量red_threshold、green_threshold和blue_threshold中定义颜色阈值,并用这些值填写rgb_threshold。这个向量包含了红色、绿色和蓝色(r、g、b)的最小值。

# 定义颜色选择标准。
red_threshold = 0
green_threshold = 0
blue_threshold = 0
rgb_threshold = [red_threshold, green_threshold, blue_threshold]

4、接下来,将选择低于阈值的任何像素并将其设置为零。之后,所有符合颜色标准(高于阈值)的像素将被保留,那些不符合(低于阈值)的像素将被置成黑色。

# 识别低于阈值的像素
thresholds = (image[:,:,0] < rgb_threshold[0]) \
            | (image[:,:,1] < rgb_threshold[1]) \
            | (image[:,:,2] < rgb_threshold[2])
color_select[thresholds] = [0,0,0]

# 显示图像                 
plt.imshow(color_select)
plt.show()

5、结果,输出图像color_select,其中高于阈值的像素被保留,低于阈值的像素变成黑色。

在上面的代码片段中,red_threshold、green_threshold和blue_threshold都设置为0,这意味着所有像素都将包含在选择中。

下面是完整的代码,修改变量red_threshold、green_threshold和blue_threshold的值,直到能够保留尽可能多的车道线,同时去掉大多数其他内容。运行代码后,输出一个示例图像。调整这些变量,使输入图像看起来像下面的图像。
在这里插入图片描述

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

image = mpimg.imread('test.jpg')

ysize = image.shape[0]
xsize = image.shape[1]
color_select = np.copy(image)

red_threshold = 200
green_threshold = 200
blue_threshold = 200

rgb_threshold = [red_threshold, green_threshold, blue_threshold]

thresholds = (image[:,:,0] < rgb_threshold[0]) \
            | (image[:,:,1] < rgb_threshold[1]) \
            | (image[:,:,2] < rgb_threshold[2])
color_select[thresholds] = [0,0,0]

plt.imshow(color_select)
plt.show()

# 如果在本地运行代码并希望保存图像,请取消对以下代码的注释
# mpimg.imsave("test-after.png", color_select)

可以发现,当红色阈值=绿色阈值=蓝色阈值=200时,可以得到了一个相当好的结果,可以清楚地看到车道线,其他大部分都被遮住了。但此时,自动提取精确的线仍然是困难的,仍然在外围检测到许多其他像素。

区域遮罩

通过简单的颜色选择,已经设法消除几乎所有的图像,除了车道线。然而,此时,自动提取精确的直线仍然是困难的,因为仍然在外围检测到一些不是车道线的其他对象。
在这里插入图片描述
在这种情况下,假设拍摄图像的前摄像头安装在汽车上的固定位置,这样车道线将始终出现在图像的相同特定区域中。接下来,利用这一点,添加一个范围(即能找到车道线的区域),将其他无关的区域遮盖住,然后再从相关区域里考虑选择的颜色像素。

这里用一个三角形的遮罩来说明最简单的情况,变量left_bottom、right_bottom和apex表示三角形区域的顶点,保留这些顶点以进行颜色选择。除了三角形,还可以用任何多边形。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

image = mpimg.imread('test.jpg')
print('This image is: ', type(image), 
         'with dimensions:', image.shape)

ysize = image.shape[0]
xsize = image.shape[1]
region_select = np.copy(image)

# 定义一个感兴趣的三角形区域。记住原点(x=0,y=0)在图像处理中位于左上角
left_bottom = [0, 539]
right_bottom = [900, 300]
apex = [400, 0]

# 确定感兴趣区域的3条边(y=Ax+B),np.polyfit() 返回拟合的系数向量[A,B]
fit_left = np.polyfit((left_bottom[0], apex[0]), (left_bottom[1], apex[1]), 1)
fit_right = np.polyfit((right_bottom[0], apex[0]), (right_bottom[1], apex[1]</
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值