董 浩,王 帥,張 晶,周洪遠(yuǎn)
(河北省科學(xué)院自動(dòng)化研究所,河北 石家莊 050081)
數(shù)字圖像處理技術(shù)的目的是為了提高圖像的視感質(zhì)量、提取圖像中所包含的某些特征或者對(duì)圖像數(shù)據(jù)進(jìn)行格式變換,目前已在航空航天、生物醫(yī)學(xué)工程、工業(yè)檢測(cè)、機(jī)器人視覺(jué)等領(lǐng)域得到廣泛應(yīng)用,并逐漸深入人們的日常生活。一般來(lái)說(shuō),數(shù)字圖像處理無(wú)論基于何種目的,都需要由計(jì)算機(jī)和專用的圖像處理軟件對(duì)圖像進(jìn)行加工處理。
Visual Basic(VB)是一種由微軟公司開(kāi)發(fā)的編程設(shè)計(jì)語(yǔ)言,它具有簡(jiǎn)單易學(xué)、人機(jī)交互性好等優(yōu)點(diǎn),已經(jīng)在各領(lǐng)域得到廣泛應(yīng)用。圖像處理并不是Visual Basic最具優(yōu)勢(shì)的開(kāi)發(fā)方向,但是借助于其豐富的圖形控件和API函數(shù),Visual Basic可以用簡(jiǎn)潔、高效的語(yǔ)言代碼對(duì)圖像進(jìn)行實(shí)時(shí)處理,并取得令人滿意的效果。
鐵路軌道檢測(cè)儀主要用于檢測(cè)鐵路軌道的高低、水平、軌向等參數(shù),它主要由激光發(fā)射裝置和檢測(cè)接收系統(tǒng)組成。在檢測(cè)接收系統(tǒng)中,使用工業(yè)相機(jī)采集光斑圖像并對(duì)其進(jìn)行處理獲得檢測(cè)參數(shù)。對(duì)此,我們開(kāi)發(fā)了基于VB的實(shí)時(shí)圖像處理軟件,利用該軟件對(duì)光斑圖像進(jìn)行圖像捕捉、獲取像素、減噪處理、二值化等操作,處理后的光斑圖像經(jīng)數(shù)據(jù)處理、計(jì)算,結(jié)合軌道檢測(cè)儀所攜帶的其他設(shè)備,可以為鐵路日常維護(hù)提供詳實(shí)、全面的數(shù)據(jù),有效提高了工務(wù)段日常線路維護(hù)的效率和質(zhì)量。
要處理一幅圖像,首先要通過(guò)合適的手段捕捉圖像,Visual Basic提供了兩種控件用于圖像的顯示,分別是PictureBox控件和Image控件。Image控件沒(méi)有句柄,只能用于顯示圖片,不能作為其它控件的容器,也不支持PictureBox的高級(jí)方法。但是Image控件占用系統(tǒng)資源較少,繪圖速度快,而且其Strech屬性設(shè)置為ture時(shí),圖形能自動(dòng)調(diào)整大小以適應(yīng)Image的尺寸。鑒于此,我們?cè)诓蹲綀D像時(shí),采用PictureBox控件,在軟件人機(jī)顯示界面,采用Image控件。
每一幅圖像都是由一系列像素點(diǎn)構(gòu)成的點(diǎn)陣。在彩色圖像中,每個(gè)像素點(diǎn)都是由紅、綠、藍(lán)三個(gè)基色調(diào)調(diào)合而成的,如果獲取了每個(gè)像素點(diǎn)三種基色的數(shù)值,就可以對(duì)圖像進(jìn)行深層次的處理。
在Visual Basic中,主要有三種方法可以讀取像素值,前文提到的PictureBox控件可以打開(kāi)多種類型圖片,其本身提供的POINT方法可以讀取每一點(diǎn)的像素值,但是讀取速度較慢,占用內(nèi)存較大;GetPixel方法需要調(diào)用API函數(shù),但其核心和POINT方法相同,仍然不是最佳選擇。目前較主流的方法是GetDIBits方法,使用GetDIBits方法獲取picturebox中各點(diǎn)的RGB值,比POINT方法或GetPixel函數(shù)逐像素獲取像素要快出一個(gè)數(shù)量級(jí)。使用GetDIBits方法獲取像素,首先要注意定義數(shù)據(jù)結(jié)構(gòu),這是GetDIBits方法不可缺少的。然后需要定義變量,用來(lái)存儲(chǔ)圖形的寬度和高度,并定義三維數(shù)組,存放獲取原彩色圖像中各像素的RGB值,這里需要注意的是,GetDIBits方法只能用于從PictureBox控件獲取像素,并不能從Image控件獲取,因?yàn)镮mage控件沒(méi)有句柄,如果想把Image控件的快速性和GetDIBits結(jié)合起來(lái),可以采用自定義控件的方法,為Image控件添加句柄,這樣可以充分利用GetDIBits方法和Image控件的優(yōu)勢(shì),獲取更加快速的像素讀取速度。
以下是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方法可以快速獲取圖片各點(diǎn)像素值,便于后期對(duì)圖片進(jìn)行各種處理。
由于軌道檢測(cè)儀一般用于野外線路測(cè)量,檢測(cè)接收系統(tǒng)拍攝到的光斑圖像受日照影響較大,當(dāng)光線直射到接收屏?xí)r,甚至出現(xiàn)激光光斑湮沒(méi)在背景噪聲中的現(xiàn)象,另外,長(zhǎng)期野外測(cè)量,很容易使相機(jī)鏡頭帶有灰塵或者微小劃痕,這造成輸入的數(shù)碼圖像上帶有細(xì)微的雜色點(diǎn)或者細(xì)線,甚至出現(xiàn)背景波紋,如圖1、圖2所示。
圖1 激光光斑湮沒(méi)在背景噪聲中圖片
圖2 出現(xiàn)背景波紋的激光光斑圖片
為解決由光線和相機(jī)本身造成的噪聲污染,采集到的圖像必須經(jīng)過(guò)減噪處理,即采用濾波、調(diào)節(jié)對(duì)比度、調(diào)節(jié)亮度等手段,對(duì)圖像進(jìn)行減噪,以去除背景噪聲,提高圖像信噪比。借助于工業(yè)相機(jī)廠商提供的函數(shù),可以實(shí)現(xiàn)對(duì)不同光照狀態(tài)下圖像對(duì)比度、亮度的調(diào)節(jié)。下面主要介紹一下濾波,由于灰塵或者劃痕帶來(lái)的噪聲點(diǎn)寬度較小,一般在1到數(shù)個(gè)像素之間,而且其亮度和周圍正常像素點(diǎn)差異較大,如果我們針對(duì)每一個(gè)像素點(diǎn),取一個(gè)范圍,比如和他周圍最接近的8個(gè)像素點(diǎn)作比較,取出差異最小的n個(gè)像素求平均,代替當(dāng)前噪聲點(diǎn),就可以達(dá)到去除噪聲點(diǎn)的效果,由于代碼過(guò)長(zhǎng),下面僅給出算法,以供參考。
舉例如下:范圍為8,噪聲點(diǎn)為6,取最接近的點(diǎn)為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)
處理后結(jié)果如下:
4 5 5
7 5 8
3 4 4
可以看出噪聲點(diǎn)已被去除。
經(jīng)過(guò)采用濾波、調(diào)節(jié)對(duì)比度、調(diào)節(jié)亮度三種方法綜合處理,可以將不同光照條件下產(chǎn)生的噪聲有效去除,獲得的圖像具有較高信噪比,以下是調(diào)整前后圖像對(duì)比。
圖3 處理前的激光光斑圖片
圖4 處理后的激光光斑圖片
經(jīng)過(guò)減噪處理的圖片,已經(jīng)基本去除了環(huán)境噪聲,可以對(duì)圖像進(jìn)行二值化操作,進(jìn)一步處理圖像,二值化屬于VB比較常見(jiàn)的圖像處理手段,目前主要有平均值法、加權(quán)平均值法、最大值法等算法,在本系統(tǒng)中,經(jīng)過(guò)GetDIBits方法提取出的像素點(diǎn)已經(jīng)被存儲(chǔ)在bits()三維數(shù)組中,只需要對(duì)bits()三維數(shù)組進(jìn)行直接操作,就可以得到二值化后的圖片,部分代碼如下:
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
這里設(shè)定的閾值為90,可以根據(jù)具體測(cè)量條件設(shè)定為0-255之間的任意值。
本文介紹了基于VB的實(shí)時(shí)圖像處理系統(tǒng)的主要處理流程和算法,并給出了部分代碼,該系統(tǒng)已經(jīng)成功在鐵路軌道檢測(cè)儀上得到應(yīng)用,作為該儀器的前期數(shù)據(jù)處理核心,將采集到的光斑圖像處理為灰度圖像,便于后期數(shù)據(jù)計(jì)算。針對(duì)1024*768分辨率的圖片,處理速度可以到達(dá)每秒2-3張,基本滿足了鐵路軌道檢測(cè)儀的檢測(cè)需要,結(jié)合其他傳感器提供的參數(shù),可以得出全面的檢測(cè)數(shù)據(jù),為工務(wù)段日常維護(hù)線路提供了堅(jiān)實(shí)的保障。
[1] 倪明田,吳良芝,計(jì)算機(jī)圖形學(xué)[M].北京:北京大學(xué)出版社,1999.
[2] 劉獨(dú)玉,羅彬,基于 VB的圖像處理方法[J].四川輕化工學(xué)院學(xué)報(bào).2000,13(4):21-29.
[3] 田巖.數(shù)字圖像處理與分析[M].武漢 華中科技大學(xué)出版社,2009.