基于形态学的图像处理

一、实验原理、目的与要求

、实验原理、目的与要求

要求:从带有车道线的图像(图2)中检测出车道线,并将检测算法通过摄像头采集实现实时的车道线检测。检测算法包括(但不限)以下步骤:

  1. 读入图像;
  2. 灰度变换;
  3. 去噪;
  4. 边缘检测;
  5. 线检测(直线/曲线);
  6. 视频采集及实时检测

图3-1 原图

原理:

形态学处理

  1. 开运算:先腐蚀后膨胀的过程。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。开运算通常是在需要去除小颗粒噪声,以及断开目标物之间粘连时使用。其主要作用与腐蚀相似,与腐蚀操作相比,具有可以基本保持目标原有大小不变的优点
  2. 闭运算:先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积

Canny检测:是一种多级边缘检测算法,它首先进行图像降噪(但是在opencv和matlab调用的检测并不包括降噪)、计算图像梯度、非极大值抑制和阈值筛选

Hough变换及直线检测:如果直线 y=mx+b 在图片中,那么图片中,必需有N多点在直线上(像素点代入表达式成立),只要有这条直线上的两个点,就能确定这条直线。该问题可以转换为:求解所有的(m,b)组合。设置两个坐标系,左边的坐标系表示的是(x,y)值,右边的坐标系表达的是(m,b)的值,即直线的参数值。那么一个(x,y)点在右边对应的就是是一条线,左边坐标系的一条直线就是右边坐标系中的一个点。这样,右边左边系中的交点表示有多个点经过(m,b)确定的直线。

二、实验仪器设备及环境

电脑(windows10)

环境:matlab2016b

三、实验内容步骤

1.首先进行二值化处理

2.对图像进行去噪

3.检测图像边缘

4.检测直线,找出车道线

5.尝试视频录制和动态检测

四、实验数据记录及数据处理

1.二值化:

实验时发现,如果直接使用大津法计算阈值,车道线反而会被模糊掉

图3-2直接用大津法二值化

   于是尝试了用先用对数变换扩展暗处像素,以期使车道线与车道背景分离开,再二值化,,实践后发现,虽然扩展了暗处像素,但二值化的效果并不明显

图3-3对数变换后的图片

图3-4对数变换后再OTSU二值化

    于是最终选择了手动调节阈值来进行二值化

图3-5使用阈值为148进行二值化

2.去噪:

图3-6按连通域面积滤除后的效果

  接下来利用上一次实验的成果,对图像进行闭运算,进一步增强图像

图3-7进行闭运算之后的结果

  3.进行canny边缘检测

图3-8进行canny边缘检测后的结果

   4.进行霍夫变换并进行直线检测,通过调节参数,获得比较理想的结果

图3-9进行直线检测的结果

5.视频采集

由于没有合适的手段采集实际的车道线并动态检测,这里仅仅分别尝试了在matlab和opencv中获取电脑自带摄像头的图像,获取之后直接用于图像处理即可

这里要注意的是,一般摄像头都会有最大帧率,比如50fps。那么如果想用满所有的图像,就必须要保证每张图像的处理时间在20ms以内(假设采集不需要占用cpu),不然就不能用满所有帧;或者说,最终的图像处理速度,取决于采集和处理之中的慢者

图3-10获取电脑摄像头图像

五、实验结论探讨及分析

本次实验进行车道线检测,相比于前两次实验,本次实验算是一个相对比较完整的图像工程,从最基本的图片中提取出需要的信息——车道线

实现的思路比较常规,由于图像中并没有过多的噪点,二值化后图像就已经很清晰了,后面的canny边缘检测和hough变换直线检测都显得水到渠成。不过这里也发现,选取合适的阈值对图像进行二值化并不容易。虽然大津法是动态阈值,但是有时候用大津法二值化并不能不满足提取图像细节的需求。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
形态学图像处理是一种基于数学形态学原理的图像处理方法,可以用于图像的特征提取、边缘检测、形状分析等。在Python,有多种库可以进行形态学图像处理,如OpenCV和scikit-image。 在OpenCV,可以使用cv2.morphologyEx函数进行形态学图像处理。其,可以使用cv2.MORPH_GRADIENT参数来进行形态学梯度操作,即膨胀与腐蚀之差。下面是一个使用OpenCV进行形态学梯度操作的示例代码: ```python import numpy as np import cv2 # 读取输入图像 img = cv2.imread('g1.png') # 定义卷积核 kernel = np.ones((6,6), dtype="uint8")/9 # 进行形态学梯度操作 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 保存结果图像 cv2.imwrite('gradient.jpg', gradient) ``` 另外,scikit-image库也提供了一些形态学图像处理的函数。可以使用skimage.morphology模块的函数进行膨胀、腐蚀等操作。下面是一个使用scikit-image进行膨胀与腐蚀操作的示例代码: ```python from skimage.morphology import erosion, dilation from skimage.morphology import square from skimage.color import rgb2gray from skimage.io import imread # 读取输入图像并转为灰度图像 im = imread('zebras.jpg', as_gray=True) # 进行腐蚀操作 selem = square(5) eroded = erosion(im, selem) # 进行膨胀操作 dilated = dilation(im, selem) ``` 以上是使用OpenCV和scikit-image库进行形态学图像处理的示例代码,你可以根据自己的需求选择合适的库和函数进行图像处理

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值