第2章 OpenCV简介及其配置
C: \\Program files\\OpenCV\\cvaux\\include C: \\Program files\\OpenCV\\otherlibs\\highgui C: \\Program files\\OpenCV\\otherlibs\\cvcam\\include 完成以上操作,则已设置好OpenCV在VC6.0下的运行环境。
2.3.4 在项目中运用OpenCV
单击Project|Settings菜单选项,在弹出的Project|Settings 对话框中选
择All configurations,然后单击Link标签,在Category列表框中选择General,在Object/library modules文本框中输入cv。lib ml。lib cxcore。lib highgui。lib cvcam。lib(按需要添加,若不需要,则可不添加)。
7
第3章 车辆图像的处理
第3章 车辆图像的处理
为实现车辆轮廓提取检测这一功能,需要做很多准备工作,为轮廓的检测创造
一个良好的条件,需要对输入的图像做很多的处理,在此基础上再由轮廓提取语句来实现预期的功能。本章主要介绍对车辆图像进行腐蚀、膨胀、中值滤波去噪等图像预处理,为最终的轮廓检测提供更精准的图像。
3.1 车辆图像预处理
3.1.1 形态学去噪
在对图像进行处理时,数学形态学作为辅助处理的数学工具,它的基本思想较为简单,用具有某种形态的结构元素去测量和提出图像中所指定的形状,从而完成对图像处理。膨胀和腐蚀是数学形态学的两种原始操作这两种,在这两种操作的基础上可以完成其它很多的形态学操作。膨胀的原理是扩张图像指定的区域,根据它的这个原理,在现实运用时可以用它来填充图像上狭窄的缝隙或者小的空洞。腐蚀的原理是收缩图像指定的区域,根据它的这个原理,可以用它来去除图像中的菱角。值得注意的是,膨胀和腐蚀这两种运算并不是互为逆运算的,所以在运算时这两者可以结合使用,对腐蚀后的图像进行膨胀操作,或者对膨胀后的图像进行腐蚀操作。对图像先进行腐蚀操作后膨胀操作的运算称为开运算,对图像先进行膨胀操作后再进行腐蚀操作的运算被称为闭运算,这两种运算对数学形态学来说是相当重要的。通常可以用开运算来去除图像中孤立的小点和毛刺等,闭运则可以用来弥合图像中的小裂缝,填平图像中的小孔,并且能够保持图像总的形状和位置不改变。在本篇文章中,我们需要做的操作是先对采集到的图像进行一次闭运算操作,然后再进行开运算操作,通过这些操作来填平图像的轮廓缺口,去除图像中的孤立的小点毛刺等,为进一步的轮廓提取绘制奠定良好的基础。
3.1.2利用中值滤波进行图像平滑处理
在消除椒盐噪音的方法中,中值滤波法的效果显著,在用分析和处理光学测量
条纹图象的相位时,用中值滤波法能起独特的作用,但是它在条纹中心分析方法中起的作用不大。在图像处理中,中值滤波是典型的平滑噪声方法,常被用来保护图像边缘信息。其基本原理是用图像中指定一点的领域中各边缘点的值求平均值后来取代这个点,以此来避免孤立的噪声点在图像处理时造成不良的影响。在灰度图像中,由于其本身计算公式的影响,噪声点是肯定存在于其中的,并且对
8
第3章 车辆图像的处理
图像的质量有很大的影响。作为一种对图像进行平滑去噪的手段,中值滤波既可以去除孤点噪声点,也可以保持图像的边缘特性,适于光线条件较好的环境。 中值滤波是一种以排序统计理论为基础的非线性信号处理技术,它的作用是能够有效抑制噪声。它是一种和卷积相似的邻域运算, ,但是它不是按照加权求和来计算的,而是是用图像中指定一点的领域中各边缘点的值求平均值后来取代这个点,这样能让周围像素值差异较大的点用周围的像素值接近的值来替代,以此来达到消除图像中孤立噪声点的目的。在处理图像是,傅立叶空间的高频分量可以依靠中值滤波的方法来消除或削弱,但是对傅立叶空间的低频分量来说也会造成一定的影响。因为傅立叶的高频分量在图像中是与指定区域边缘的灰度值相差较大的部分相对应的,运用中值滤波可以把这些分量去除掉,平滑图像,为接下来的实验做好准备,为得到精确的实验结果打好基础。本试验中,在测试场地所采集到的车辆图片,由于场地和环境、天气等因素的影响,存在这许多的噪声,所以需要对图像进行平滑处理才能使车辆的轮廓保持清晰,同时还要除去图像中的高频噪声。采用中值滤波,能实现这一目的。
中值滤波器在滤除长尾叠加噪声和叠加白噪声时能够取得较好的效果。为了使中值滤波在更多的场合运用,人们对它进行了很多的算法改进,如一种改进就是权重中值滤波,其原理是给窗口内的各像素指定不同的权值,以此来平衡抑制图像噪声与保持图像细节之间所存在的矛盾,这种较传统的中值滤波方法而言,能更好的保持图像的细节,但也有一定不足,即牺牲了图像的噪声抑制;还有一种方法是以排序阈值为基础的开关中值滤波算法。这种方法的原理是对图像的噪声点和平坦的区域进行中值滤波,效果显著,能够有效的滤除噪声,同时,因为对边缘细节区域没有做任何处理,故有良好的细节保持能力。为了处理更大概率的冲激噪声,人们还改进出一种自适应中值滤波器,这种滤波器在对图像进行处理时的特点是,它可以根据条件需要来改变领域的大小。 3.1.3图像的二值化阈值分割
在图像处理过程时,有着相当多的图像分割方法,其中一种简单而又高效的
方法就是二值化。在对图像进行二值化时可以由下面给出的公式来实现:
(x,y)=
(i,
在这个公式中,H(x,y)代表的是中在原图像中(i,j)处像素的灰度;
j)的值只能是1或者0,代表的是这点在二值化过后的像素值,用0来表示上面公式中所得到的二值化图像中的背景,用1来表示对象图像。上述公式中,T代表的是用于二值化处理的闭值。只要决定好了阈值的选取,图像的二值化过程也变得相对简单。
图像分割的作用是把要处理的图像空间分割成若干具有特定意义的区域。在本
9
第3章 车辆图像的处理
篇文章中,要完成对车辆轮廓线的检测并绘制出车辆的轮廓线,首先要完成的就是通过输入的图像进行分割,得到该图的二值化图像。所以为了将图像中的指定对象和背景分割,就要使用二值化阈值分割法将两者当作用是以阈值来分割的不同成分来实现去除图像背景的目的。
采用二值化阈值分割法时要先确定分割阈值,根据顺序来读取图像中各像素点的灰度值,然后和确定好的阈值进行对比,如果该点的灰度值是大于或者等于确定的阈值,就用1来代替;否则就用0代替该点的灰度值。在对输入的图像进行了二值化分割后,能够得到该图像的黑白图像,为接下来的实验做好准备工作。
3.2 车辆轮廓提取与轮廓跟踪
在对输入图像进行了预处理后,得到了去噪平滑的二值化图像,在此基础上,利用轮廓提取语句对汽车轮廓进行提取,并用跟踪语句对图像轮廓进行跟踪,得到完整的轮廓曲线。 3.2.1轮廓提取
图像的轮廓由外轮廓和内轮廓两类组成。轮廓的提取需要特定的算法,这个算法很简单,原理是把图像内部的点掏空:如果在二值化的图像中有一个点是黑色,并且与它相邻的8个点都是黑色时,那么这个点就称为是内部点,需要把这个点删除。应该指出的是,虽然我们处理时用的是二值图像,但是实际上我们输入的却是256级的灰度图,只不过我们在处理图像的时候只使用到了0和255这两种颜色。
OpenCV 提供的寻找轮廓的函数如下:
inttotals=cvFindContours(img,storage,&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
10