基于opencv的车辆轮廓线检测本科生毕业论文(编辑修改稿)内容摘要:

灰度 图像 中,由于 其 本身计算公式的影响,噪声点是肯定存在 于 其中的,并且 对图像的质量有很大的影响。 作为一种 对 图像 进行 平滑去噪的手段,中值滤波既可第 3 章 车辆图像的处理 9 以去除孤点噪声点, 也可以保持图像的边缘特性, 适于光线条件较好的环境。 中值滤波是 一种以 排序统计理论 为基础 的 非线性信号处理技术,它的作用是能够 有效抑制噪声。 它是一种 和卷积相似的 邻域运算 , ,但是 它 不是 按照 加权求和来计算的 ,而是 是用图像中指定一点的领域中各边缘点的值求平均值后来取代这个点,这样能 让周围像素 值差异 较大的 点 用周围的像素值 接近的值来替代 ,以此来 达到 消除 图像中孤立 噪声点 的目的。 在处理图像是, 傅立叶空间的高频分量 可以依靠中值滤波的方法来消除或削弱 ,但 是对傅立叶空间的 低频分量 来说也会造成一定的影响。 因为 傅立叶的 高频分量 在图像中 是 与指定 区域边缘的灰度值 相差较大的 部分 相对应的 ,运用中值滤波 可以 把 这些分量 去除 掉 ,平滑图像,为接下来的实验做好准备,为得到精确的实验结果打好基础。 本试验中,在测试场地所采集到的车辆图片,由于场地和环境、天气等因素的影响,存在这许多的噪声,所以需要对图像进行平滑处理才能使车辆的轮廓保持清晰,同时还要除去图像中的高频噪声。 采用中值滤波,能实现这一目的。 中值滤波器 在滤除长尾叠加噪声和叠加白噪声时能够取得较好的效果。 为了 使中值滤波 在更多的场合运用 ,人们对它进行了很多的算法改进 ,如 一种改进就是权重中值滤波 ,其原理是 给窗口内的 各像素指定 不同的权值 ,以此 来 平衡抑制图像 噪声与 保持图像 细节 之间所存在的 矛盾 ,这种较传统的中值滤波方法而言,能更好的保持图像的细节,但也有一定不足,即 牺牲 了图像的 噪声抑制 ; 还有一种方法 是 以 排序 阈值 为基础 的开关中值滤波算法。 这种方法的原理是 对 图像的 噪声点和平坦 的 区 域 进行中值滤波 ,效果显著,能够有效 的 滤除 噪声 ,同时,因为对边缘细节区域没有做任何处理,故有良好的细节保持能力。 为了处理更大概率的冲激噪声,人们还改进出一种自适应中值滤波器,这种滤波器在对图像进行处理时的特点是,它可以根据条件需要来改变领域的大小。 图像 的 二值化阈值分割 在图像处理过程时,有着相当多的图像分割方法, 其中一种简单而又高效的方法就是二值化。 在对图像进行 二值化 时可以由 下 面给出的 公式 来实现 : 𝑅𝑥( x,y) = *0 𝐻𝑘(𝑖,𝑗)𝑇1 𝐻𝑘(𝑖,𝑗)≥𝑇 在这个公式 中 ,H(x,y)代表的是 中 在原图像中 ( i, j)处像素的灰度 ; 𝐻𝑏( i,j) 的值只能是 1 或者 0,代表的 是 这点在 二值化 过 后的像素值 ,用 0来表示上面公式中所得到的二值化图像中的背景,用 1 来表示对象图像。 上述公式中, T 代表的 是 用于二值化处理的闭值。 只要决定好了阈值的选取,图像的二值化过程也变得相对简单。 图像分割的 作用 是把 要处理的 图像空间分割成 若干 具 有 特定 意义的区域。 在本篇文章中,要完成对 车辆轮廓 线 的 检测 并绘制出车辆的轮廓线 , 首先要完成的 就第 3 章 车辆图像的处理 10 是通过 输入的 图像 进行 分割,得到 该图的 二值 化 图像。 所以为了将图像中的指定对象和背景分割,就要使用 二值 化阈值分割法 将两者当作用是以阈值来分割的不同成分来实现去除图像背景的目的。 采用二值化阈值分割法时要 先 确定分割阈值, 根据 顺序 来 读取图像 中 各像素点的 灰度值 ,然后和确定好的 阈值 进行 对比 , 如果该点的灰度值是 大于 或 者 等于 确定的阈值,就 用 1来代替; 否则 就 用 0代替 该点的灰度值。 在对输入的图像进行了二值化分割 后 , 能够 得到 该图像的 黑白图像, 为接下来的实验做好准备工作。 车辆轮廓 提取 与轮廓跟踪 在对输入图像进行了预处理后,得到了去噪平滑的二值化图像 ,在此基础上,利用轮廓提取语句对汽车轮廓进行提取,并用跟踪语句对图像轮廓进行跟踪,得到完整的轮廓曲线。 轮廓提取 图像的 轮 廓 由 外轮廓和内轮廓 两类组成。 轮廓的提取需要特定的算法,这个 算法 很 简单, 原理是把图像 内部 的 点 掏空 :如果 在二值化的 图 像 中有一 个 点 是 黑 色 ,并 且 与 它 相邻 的 8个点都是黑色时 ,那么这个 点 就 称为是 内部点, 需 要把这个 点删除。 应该指出的是 , 虽然 我们处理 时用 的是二值图 像 ,但 是 实际上 我们输入的却 是 256 级 的 灰度图, 只不过我们在处理图像的时候只使用到 了 0 和 255 这 两种颜色。 OpenCV 提供 的 寻找轮廓的函数 如下 : inttotals=cvFindContours(img,storage,amp。 contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0))。 其中 img 是二值图像, storage 是内存存储序列, contours 指向存储的第一个轮廓, CvMemStorage *storage =cvCreateMemStorage(0)为内存存储序列,CvSeq *contours = 0; 指向 storage 中的序 列。 CV_RETR_LIST 表示的是图像处理后提取的图像 轮廓在内存中的排列方式, 有下面四种方式 :  CV_RETR_EXTERNAL: first = c0;  CV_RETR_CCOMP: 轮廓的排列方式是按照 从里 依次 到外,从右 依次 到左 的顺序 , 这 个表示的 是一个双向链表;  CV_RETR_LIST: first = c01001 – c01000 – h0100 – h0000 – h0100 – h0000 – c010 – c000 – h01 – h00 – c0 这也是双向链表;  CV_RETR_TREE 轮廓提取的代码如下所示: 第 3 章 车辆图像的处理 11 include iostream include include include using namespace std。 int main() { CvMemStorage *storage = cvCreateMemStorage(0)。 // 内存存储序列 IplImage *img = cvLoadImage(E:\\study_OpenCV_video\\lesson14_1\\Debug\\55。 png, 0)。 IplImage *imgColor = cvCreateImage(cvGetSize(img), 8, 3)。 IplImage *contoursImage = cvCreateImage(cvGetSize(img), 8, 1)。 CvSeq *contours = 0, *contoursTemp = 0。 cvZero(contoursImage)。 cvThreshold(img, img, 100, 255, CV_THRESH_BINARY)。 // 二值化操作 cvCvtColor(img, imgColor, CV_GRAY2BGR)。 int totals = cvFindContours(img, storage,amp。 contours, sizeof(CvContour), //img 必须是一个二值图像 storage 用来存储的contours 指向存储的第 一个轮廓 CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0))。 contoursTemp = contours。 int count = 0。 int i。 for(。 contoursTemp != 0。 contoursTemp = contoursTemp h_next) /// 这样可以访问每一个轮廓 ====横向轮廓 { for(i = 0。 i contoursTemp total。 i++) // 提取一个轮廓的所有坐标点 { CvPoint *pt = (CvPoint*) cvGetSeqElem(contoursTemp, i)。 // cvGetSeqElem 是为了 得到轮廓中一个点的函数 cvSetReal2D(contoursImage, pty, ptx, 255。 0)。 cvSet2D(imgColor, pty, ptx, cvScalar(0,0,255,0))。 第 3 章 车辆图像的处理 12 } count ++。 CvSeq *InterCon = contoursTempv_next。 // 访问每个轮廓的纵向轮廓 for(。 InterCon != 0。 InterCon = InterCon h_next) { for(i = 0。 i InterContotal。 i++ ) { CvPoint *pt = (CvPoint*)cvGetSeqElem(InterCon, i)。 cvSetReal2D(contoursImage, pty, ptx, 255。 0)。 cvSet2D(imgColor, pty, ptx, cvScalar(0, 255, 0, 0))。 } } } cvNamedWindow(contoursImage)。 cvShowImage(contoursImage, contoursImage)。 cvNamedWindow(imgColor)。 cvShowImage(imgColor,imgColor)。 cvWaitKey(0)。 cvReleaseMemStorage(amp。 storage)。 // 也要释放内存序列空间 cvReleaseImage(amp。 contoursImage)。 cvReleaseImage(amp。 imgColor)。 cvDestroyWindow(contoursImage)。 cvDestroyWindow(imgColor)。 return 0。 SPAN style=FONTFAMILY: Arial,Helvetica,sansserif}/SPAN 轮廓跟踪 对一个简单的 二值化图像而言,对它的闭合边界的轮廓进行跟踪,只需一个简单的算法 :首先 需要依照先左后右,先上后下 的顺序 依次对图像 进行 搜索, 在搜索结果中,把 第一个黑点 当作是 左上方的边界点,记为 点 a。 在这个边界点 a 周围, 右,右下,下,左下 这 四个 相 邻 的 点 当 中 需要 至少有一个 点也 是边界点, 那么把这个点记作 b。 然后又 从 b 点为起点 开始 找起, 依 照 从 右,右下,下,左下,左,左上,上,右上的 搜索 顺序 依次来 找 到 与 b 点 相邻 的周围 点中的 边界点,如果有,那么记这个点为点 c。 若通过 b点查找到的边界点 c 点 就是 a点, 那就 表第 3 章 车辆图像的处理 13 明 对图像的搜索在此时已经经过了一个轮回 , 结束运行的搜索 程序; 如果 c点不是 a 点,那么又 将。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。