董 浩,王 帅,张 晶,周洪远
(河北省科学院自动化研究所,河北 石家庄 050081)
数字图像处理技术的目的是为了提高图像的视感质量、提取图像中所包含的某些特征或者对图像数据进行格式变换,目前已在航空航天、生物医学工程、工业检测、机器人视觉等领域得到广泛应用,并逐渐深入人们的日常生活。一般来说,数字图像处理无论基于何种目的,都需要由计算机和专用的图像处理软件对图像进行加工处理。
Visual Basic(VB)是一种由微软公司开发的编程设计语言,它具有简单易学、人机交互性好等优点,已经在各领域得到广泛应用。图像处理并不是Visual Basic最具优势的开发方向,但是借助于其丰富的图形控件和API函数,Visual Basic可以用简洁、高效的语言代码对图像进行实时处理,并取得令人满意的效果。
铁路轨道检测仪主要用于检测铁路轨道的高低、水平、轨向等参数,它主要由激光发射装置和检测接收系统组成。在检测接收系统中,使用工业相机采集光斑图像并对其进行处理获得检测参数。对此,我们开发了基于VB的实时图像处理软件,利用该软件对光斑图像进行图像捕捉、获取像素、减噪处理、二值化等操作,处理后的光斑图像经数据处理、计算,结合轨道检测仪所携带的其他设备,可以为铁路日常维护提供详实、全面的数据,有效提高了工务段日常线路维护的效率和质量。
要处理一幅图像,首先要通过合适的手段捕捉图像,Visual Basic提供了两种控件用于图像的显示,分别是PictureBox控件和Image控件。Image控件没有句柄,只能用于显示图片,不能作为其它控件的容器,也不支持PictureBox的高级方法。但是Image控件占用系统资源较少,绘图速度快,而且其Strech属性设置为ture时,图形能自动调整大小以适应Image的尺寸。鉴于此,我们在捕捉图像时,采用PictureBox控件,在软件人机显示界面,采用Image控件。
每一幅图像都是由一系列像素点构成的点阵。在彩色图像中,每个像素点都是由红、绿、蓝三个基色调调合而成的,如果获取了每个像素点三种基色的数值,就可以对图像进行深层次的处理。
在Visual Basic中,主要有三种方法可以读取像素值,前文提到的PictureBox控件可以打开多种类型图片,其本身提供的POINT方法可以读取每一点的像素值,但是读取速度较慢,占用内存较大;GetPixel方法需要调用API函数,但其核心和POINT方法相同,仍然不是最佳选择。目前较主流的方法是GetDIBits方法,使用GetDIBits方法获取picturebox中各点的RGB值,比POINT方法或GetPixel函数逐像素获取像素要快出一个数量级。使用GetDIBits方法获取像素,首先要注意定义数据结构,这是GetDIBits方法不可缺少的。然后需要定义变量,用来存储图形的宽度和高度,并定义三维数组,存放获取原彩色图像中各像素的RGB值,这里需要注意的是,GetDIBits方法只能用于从PictureBox控件获取像素,并不能从Image控件获取,因为Image控件没有句柄,如果想把Image控件的快速性和GetDIBits结合起来,可以采用自定义控件的方法,为Image控件添加句柄,这样可以充分利用GetDIBits方法和Image控件的优势,获取更加快速的像素读取速度。
以下是GetDIBits方法获取像素的部分代码:
Dim iWidth As Integer
Dim iHeight As Integer
Dim bits()As Byte
iWidth=form1.Picture1.ScaleWidth/Screen.TwipsPerPixelX
iHeight=form1.Picture1.ScaleHeight/Screen.TwipsPerPixelY
Dim bi24BitInfo As BitMapInfo
With bi24BitInfo.bmiHeader
.biBitCount=32
.biCompression=0&
.biPlanes=1
.biSize= Len(bi24BitInfo.bmiHeader)
.biWidth=iWidth
.biHeight=form10.Picture1.ScaleHeight/Screen.TwipsPerPixelY
End With
ReDim bits(3,0To iWidth-1,0To iHeight)As Byte
ReDim bitsBW(3,0To iWidth-1,0To iHeight)As Byte
lrtn= GetDIBits(form1.Picture1.hdc,form1.Picture1.Picture.Handle,0&,iHeight,bits(0,0,0),bi24BitInfo,0&)
利用GetDIBits方法可以快速获取图片各点像素值,便于后期对图片进行各种处理。
由于轨道检测仪一般用于野外线路测量,检测接收系统拍摄到的光斑图像受日照影响较大,当光线直射到接收屏时,甚至出现激光光斑湮没在背景噪声中的现象,另外,长期野外测量,很容易使相机镜头带有灰尘或者微小划痕,这造成输入的数码图像上带有细微的杂色点或者细线,甚至出现背景波纹,如图1、图2所示。
图1 激光光斑湮没在背景噪声中图片
图2 出现背景波纹的激光光斑图片
为解决由光线和相机本身造成的噪声污染,采集到的图像必须经过减噪处理,即采用滤波、调节对比度、调节亮度等手段,对图像进行减噪,以去除背景噪声,提高图像信噪比。借助于工业相机厂商提供的函数,可以实现对不同光照状态下图像对比度、亮度的调节。下面主要介绍一下滤波,由于灰尘或者划痕带来的噪声点宽度较小,一般在1到数个像素之间,而且其亮度和周围正常像素点差异较大,如果我们针对每一个像素点,取一个范围,比如和他周围最接近的8个像素点作比较,取出差异最小的n个像素求平均,代替当前噪声点,就可以达到去除噪声点的效果,由于代码过长,下面仅给出算法,以供参考。
举例如下:范围为8,噪声点为6,取最接近的点为4,4,4,5,5,7,8
4 5 5
7 6 8
3 4 4
均值为(4+4+4+5+5+7+8)/7=5.28(四舍五入后为5)
处理后结果如下:
4 5 5
7 5 8
3 4 4
可以看出噪声点已被去除。
经过采用滤波、调节对比度、调节亮度三种方法综合处理,可以将不同光照条件下产生的噪声有效去除,获得的图像具有较高信噪比,以下是调整前后图像对比。
图3 处理前的激光光斑图片
图4 处理后的激光光斑图片
经过减噪处理的图片,已经基本去除了环境噪声,可以对图像进行二值化操作,进一步处理图像,二值化属于VB比较常见的图像处理手段,目前主要有平均值法、加权平均值法、最大值法等算法,在本系统中,经过GetDIBits方法提取出的像素点已经被存储在bits()三维数组中,只需要对bits()三维数组进行直接操作,就可以得到二值化后的图片,部分代码如下:
If bits(0,ix,iy)<90Then
bitsBW(0,ix,iy)=0
bitsBW(1,ix,iy)=0
bitsBW(2,ix,iy)=0
Else
bitsBW(0,ix,iy)=255
bitsBW(1,ix,iy)=255
bitsBW(2,ix,iy)=255
这里设定的阈值为90,可以根据具体测量条件设定为0-255之间的任意值。
本文介绍了基于VB的实时图像处理系统的主要处理流程和算法,并给出了部分代码,该系统已经成功在铁路轨道检测仪上得到应用,作为该仪器的前期数据处理核心,将采集到的光斑图像处理为灰度图像,便于后期数据计算。针对1024*768分辨率的图片,处理速度可以到达每秒2-3张,基本满足了铁路轨道检测仪的检测需要,结合其他传感器提供的参数,可以得出全面的检测数据,为工务段日常维护线路提供了坚实的保障。
[1] 倪明田,吴良芝,计算机图形学[M].北京:北京大学出版社,1999.
[2] 刘独玉,罗彬,基于 VB的图像处理方法[J].四川轻化工学院学报.2000,13(4):21-29.
[3] 田岩.数字图像处理与分析[M].武汉 华中科技大学出版社,2009.