崔 宣,丁 楊,高 文,金世林
(西華大學(xué)機(jī)械工程與自動(dòng)化學(xué)院, 四川 成都 610039)
在一些機(jī)械零部件的生產(chǎn)過(guò)程中,焊接起到了十分關(guān)鍵的作用,其焊接質(zhì)量對(duì)工件的質(zhì)量有非常大的影響[1]。焊縫中出現(xiàn)的夾渣、虛焊、沙孔、疏松甚至偏焊漏焊等缺陷很難完全避免,所以在焊接之后焊縫的探傷工作是不可避免的。探傷需要首先找到準(zhǔn)確的焊接部分。在歐美等發(fā)達(dá)國(guó)家,探傷的研究進(jìn)行較早,且投入了大量的人力物力[2];而我國(guó)基本上采用人工抽樣探傷或者半自動(dòng)設(shè)備探傷,識(shí)別錯(cuò)誤率高、速度慢,探傷的有效性低。為此,本文提出一種基于圖像快速并行細(xì)化的焊縫識(shí)別方法,以代替人工對(duì)焊縫的位置識(shí)別,該方法主要是通過(guò)圖像快速并行細(xì)化算法找到焊接部分的準(zhǔn)確位置,并指導(dǎo)檢查設(shè)備對(duì)其進(jìn)行檢測(cè),實(shí)現(xiàn)自動(dòng)化。大部分的圖像主要集中在PC環(huán)境中使用matlab實(shí)現(xiàn)識(shí)別,不利于嵌入式的移植。本文利用C#語(yǔ)言和FreeMat開(kāi)發(fā),以增強(qiáng)算法的可移植性,使其能夠應(yīng)用于一些嵌入式平臺(tái),降低自動(dòng)焊接質(zhì)量檢測(cè)設(shè)備的價(jià)格。
焊縫的圖像識(shí)別主要經(jīng)過(guò)圖像的獲取、圖像的灰度變換、圖像二值化、圖像的縮放、圖像的細(xì)化、圖像的去除噪點(diǎn)、輸出焊縫路徑等處理步驟[3],如圖1所示。
圖1 圖像處理流程圖
圖像轉(zhuǎn)換主要是將真彩色圖像轉(zhuǎn)變?yōu)榛叶葓D像。其著名心理學(xué)公式[4]為
Gray=R×0.299+G×0.587+B×0.114。
(1)
對(duì)于程序的算法來(lái)說(shuō),式(1)涉及浮點(diǎn)運(yùn)算,所以編程的效率會(huì)非常低。在實(shí)際運(yùn)用中,應(yīng)盡量避免低速的浮點(diǎn)運(yùn)算而使用整數(shù)算法。
由于該算法需要32位運(yùn)算,所以式(1)可變?yōu)榱硪环N形式
Gray=(R×30+G×59+B×11+50)/100。
(2)
對(duì)于實(shí)際操作來(lái)說(shuō),式(2)會(huì)制約運(yùn)算速度,所以可以將系數(shù)縮放成 2的整數(shù)冪。習(xí)慣上使用16位精度,2的16次冪是65 536,所以系數(shù)的計(jì)算為:
0.299×65536=19595.264≈19595;
(3)
0.587×65536+(0.264)=38469.632+0.264=38469.896 38469;
(4)
0.114×65536-(0.896)=7471。
(5)
由于四舍五入會(huì)有較大的誤差,所以將以前計(jì)算結(jié)果的誤差一起計(jì)算進(jìn)去進(jìn)行舍入,其表達(dá)式為
Gray(R×19595+G×38469+B×7472)?16。
(6)
其中
Gray=(R×38+G×75+B×15)?7。
(7)
式(7)使用了16位的位運(yùn)算,其效率高,并且運(yùn)算精度高,超過(guò)了前面放大100倍的運(yùn)算精度。
同時(shí)式(8)也可以達(dá)到相似的效果,且運(yùn)算量大大減小,所以本文采用之。
Gray=(R×1+G×2+B×1)?2。
(8)
式(8)可以通過(guò)位運(yùn)算優(yōu)化為
Gray=(R+G?1+B)?2。
(9)
式(9)實(shí)現(xiàn)了無(wú)乘除法的完全移位運(yùn)算優(yōu)化。
在FreeMat中,由于不支持位運(yùn)算,所以計(jì)算方法依然和普通乘除法相同,在此省略FreeMat的代碼。C#支持位運(yùn)算,并且位運(yùn)算相對(duì)于乘除法運(yùn)算有很大的速度優(yōu)勢(shì),其代碼如下。
private static uint RGBtoGray(uint r,uint g,uint b)
{uint res=g<<1;
res+=r+b;
return res>>2;}
在數(shù)字圖像處理中,圖像二值化占有非常重要的地位。該方法是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,使整個(gè)圖像呈現(xiàn)明顯的黑白效果[3,5]。
要進(jìn)行二值圖像的處理與分析,必須把灰度圖像二值化。圖像的二值化使圖像變得簡(jiǎn)單,數(shù)據(jù)量減小,能凸顯出感興趣的目標(biāo)輪廓。
閾值分割不僅可以大量壓縮數(shù)據(jù),減少儲(chǔ)存容量,而且能夠大大簡(jiǎn)化其后的分析和處理步驟。
設(shè)原始圖像為f(x,y),在一定的準(zhǔn)則下找出一個(gè)合適的灰度值作為閾值,按照閾值進(jìn)行分割后的圖像是g(x,y),可表示為:
(10)
要實(shí)現(xiàn)圖像的二值化首先要選擇分割的閾值。常見(jiàn)的方法有雙峰法、迭代法、大津法(即OTSU法)、直接法、固定閾值法,本文使用的是固定閾值法[3]。
經(jīng)過(guò)圖像灰度轉(zhuǎn)換、二值化、圖像分割和膨脹腐蝕等預(yù)處理過(guò)程后,接下來(lái)將對(duì)圖像進(jìn)行快速并行細(xì)化處理。
圖2為二值紋理圖像中某一像素點(diǎn)P1的3×3鄰域。設(shè)P1為紋理上的一點(diǎn),其值為1,所有非紋理點(diǎn)取值0。細(xì)化過(guò)程為逐步迭代過(guò)程。在第n次迭代中P1的取值不但取決于P1本身的值,還取決于P1的鄰域點(diǎn)在第(n-1)次迭代后的值。在整個(gè)紋理圖像域內(nèi),所有滿(mǎn)足條件的像素點(diǎn)可以同時(shí)去掉,并行算法便由此得名[4-7]。
P9P2P3P8P1P4P7P6P5
圖2P1的3×3鄰域
為保證原紋理的連續(xù)性,每次迭代分成2個(gè)子迭代。第1次子迭代消去紋理的所有東、南邊界點(diǎn)和西北角的點(diǎn);第2次子迭代消去西、北邊界點(diǎn)和東南角的點(diǎn)。
在標(biāo)準(zhǔn)的計(jì)算過(guò)程中每次迭代會(huì)標(biāo)記相應(yīng)的點(diǎn),然后在迭代結(jié)束后刪除對(duì)應(yīng)的點(diǎn)。迭代條件如表1所示。
表1 細(xì)化算法迭代條件
其中A(P1)是按P2,P3,P4,…,P9的排列順序出現(xiàn)0 1(或 1 0)模式的個(gè)數(shù),即從P2到P9幾次出現(xiàn)0到1(或1到0)的變化。B(P1)是P1的8鄰接點(diǎn)中非零值的個(gè)數(shù)。
B(P1)=P2+P3+P4+…+P9。
(11)
對(duì)于條件1,B(P1)=1時(shí),只能出現(xiàn)8種情況之一[4]。顯然,P1是紋線(xiàn)的端點(diǎn)。為保證細(xì)化后線(xiàn)條不縮短,甚至被全部吞食,P1必須被保留。當(dāng)B(P1)=7或B(P1)=8時(shí),為保證消蝕是從外緣逐層向中心骨架進(jìn)行,并保證細(xì)化紋線(xiàn)的定中性和拓?fù)洳蛔冃?P1必須被保留。
條件2保證了細(xì)化紋線(xiàn)的連續(xù)性。原始紋線(xiàn)只要有1個(gè)像素相連,細(xì)化后就不會(huì)出現(xiàn)墳線(xiàn)斷裂。假設(shè)A(P1)=2,P1顯然是紋線(xiàn)上不能去掉的點(diǎn),否則將破壞紋線(xiàn)的連續(xù)性。類(lèi)似的,當(dāng)A(P1)=3,A(P1)=4時(shí),情況與A(P1)=2的相似,如果去掉P1點(diǎn)就會(huì)破壞紋線(xiàn)的連續(xù)性。
對(duì)于條件3和4,只有當(dāng)P4=0或P6=0或P2,P8同時(shí)等于0才能同時(shí)滿(mǎn)足條件。當(dāng)P4=0時(shí),則表示P1為紋線(xiàn)的東邊界點(diǎn),如果去掉P1點(diǎn),則可去掉整個(gè)圖像所有紋線(xiàn)的東邊界點(diǎn)。同理,當(dāng)P6=0時(shí),表示要去掉所有紋線(xiàn)的南邊界點(diǎn)。當(dāng)P2,P8同時(shí)等于0時(shí),表示要去掉所有紋線(xiàn)的西北角點(diǎn)。
以下為FreeMat實(shí)現(xiàn)并行圖像細(xì)化算法的過(guò)程.
首先需要判斷當(dāng)前點(diǎn)是否為前景點(diǎn),若為背景點(diǎn)則不需要處理,細(xì)化時(shí)只是細(xì)化前景點(diǎn)。
if( false == tempin.getxy( tx, ty ) )
continue.
接著將當(dāng)前點(diǎn)和8鄰域的各個(gè)點(diǎn)按照順序排列到數(shù)組中,用于存儲(chǔ)數(shù)據(jù)。通過(guò)對(duì)數(shù)據(jù)儲(chǔ)存,可以方便調(diào)試時(shí)觀察數(shù)據(jù)的正誤,以及后續(xù)的運(yùn)算過(guò)程的處理。
//初始化8個(gè)鄰域數(shù)據(jù)點(diǎn)
bool pt[9];
pt[0] = tempin.getxy( tx, ty );
pt[1] = tempin.getxy( tx, ty - 1 );
pt[2] = tempin.getxy( tx + 1, ty - 1 );
pt[3] = tempin.getxy( tx + 1, ty );
pt[4] = tempin.getxy( tx + 1, ty + 1 );
pt[5] = tempin.getxy( tx, ty + 1 );
pt[6] = tempin.getxy( tx - 1, ty + 1 );
pt[7] = tempin.getxy( tx - 1, ty );
pt[8] = tempin.getxy( tx - 1, ty - 1 ).
根據(jù)前文中對(duì)細(xì)化算法的說(shuō)明可知,對(duì)于這9個(gè)點(diǎn)的順序并不是任意分布,所以要按照順序排布這9個(gè)點(diǎn)。排布好以后,通過(guò)數(shù)組索引來(lái)代替直接使用坐標(biāo)讀取數(shù)據(jù)。
判斷這幾個(gè)領(lǐng)域點(diǎn)的狀況,如果8鄰域中的8個(gè)點(diǎn)有6個(gè)及以上的點(diǎn)為前景時(shí),視此點(diǎn)為內(nèi)部點(diǎn);如果僅有1個(gè)點(diǎn)是前景點(diǎn)時(shí),則此點(diǎn)為孤立點(diǎn)。通過(guò)計(jì)算鄰域點(diǎn)的數(shù)目,從而判斷原坐標(biāo)點(diǎn)為內(nèi)部點(diǎn)或孤立點(diǎn)的情況。
int tcount = 0;
for( int tt = 1; tt < 9; tt++ )
{if( true == pt[tt] )
tcount++;}
if( tcount < 2 || tcount > 6 )
continue.
經(jīng)過(guò)對(duì)內(nèi)部點(diǎn)和孤立點(diǎn)的判斷以后,如果不是內(nèi)部點(diǎn)和孤立點(diǎn)的話(huà),程序會(huì)繼續(xù)執(zhí)行,然后需要判斷8鄰域的分支數(shù)量,如果分支數(shù)量為1,則視此點(diǎn)在圖像內(nèi)容的邊界上,可以對(duì)此點(diǎn)進(jìn)行消除。
int tcount2 = 0;
for( int tt = 1; tt < 8; tt++ )
{if( true == pt[tt] && false == pt[tt+1] )
tcount2++;}
if( true == pt[8] && false == pt[1] )
tcount2++;
if( tcount2 != 1 )
continue.
接下來(lái)對(duì)右方和下方的像素點(diǎn)進(jìn)行判斷。如果滿(mǎn)足條件,則刪除此點(diǎn);否則跳過(guò)這個(gè)循環(huán)。
bool tempb1 = false; bool tempb2 = false;
tempb1 = pt[5] && pt [7] && pt[1];
tempb2 = pt[5] && pt [3] && pt[7];
if( true == tempb1 || true == tempb2 )
{continue;}
如果以上條件均滿(mǎn)足,則沒(méi)有跳出這循環(huán),直接進(jìn)行刪除點(diǎn)操作,并記錄標(biāo)記。
temp.setxy( tx, ty, true );
modified = true;
counter++.
以上過(guò)程完成了一個(gè)方向上的操作,在另外一個(gè)方向上,基本流程都一樣,大部分語(yǔ)句都是相似的,主要的區(qū)別在于對(duì)點(diǎn)的條件判斷進(jìn)行了修改,對(duì)圖2中P1點(diǎn)左方的像素點(diǎn)和上方像素點(diǎn)進(jìn)行判斷。
bool tempb1 = false; bool tempb2 = false;
tempb1 = pt[5] && pt [7] && pt[1];
tempb2 = pt[5] && pt [3] && pt[7];
if( true == tempb1 || true == tempb2 )
{continue;}
本文對(duì)焊縫圖像的2種情況進(jìn)行實(shí)驗(yàn):一種是直接采用焊縫圖像進(jìn)行處理如圖3所示;另一種是對(duì)圖像加上椒鹽噪點(diǎn)后再進(jìn)行處理,以檢查圖像的抗噪能力如圖4所示。首先讀取原始圖像,對(duì)圖像進(jìn)行灰度變換,通過(guò)位運(yùn)算優(yōu)化后,在C#中的執(zhí)行效率有一定的提升;然后對(duì)灰度圖像進(jìn)行縮小變化,其目的是固定處理圖像的大小,確定處理的時(shí)間。其算法過(guò)程為:讀入原圖,計(jì)算出該圖的尺寸大小,通過(guò)縮放比例得到目標(biāo)圖像尺寸大?。粧呙鑈軸和Y軸方向像素點(diǎn),對(duì)每個(gè)目標(biāo)圖像坐標(biāo)(u,v),利用近鄰取樣法在原圖中找到模塊中心位置(i,j);進(jìn)行雙線(xiàn)性插值,并對(duì)X方向和Y方向遞推實(shí)現(xiàn)圖像縮?。焕霉絫emp=temp+grayimg(u,v)進(jìn)行遞推,得到最終縮小的圖像scaleimg(i,j)。
(a)原始圖像
(b)灰度圖像
(c)縮小圖像
(d)二值化圖像
(e)細(xì)化后圖像
此方法相對(duì)于臨近取樣法有更好的圖像效果,但是運(yùn)算速度相對(duì)較低,適合一些小規(guī)模的數(shù)據(jù)。由于處理的是固定大小的圖像,這種縮放方法的運(yùn)算量是一常量,所以這種方法是合理的。
在圖像二值化后,圖4(d)中的焊縫占有幾個(gè)像素寬度,但通過(guò)細(xì)化處理以后都變成了一個(gè)像素寬度的點(diǎn),這說(shuō)明圖像細(xì)化方法有一定的缺點(diǎn),在有些特殊情況的地方會(huì)出現(xiàn)一個(gè)像素的斷點(diǎn)。解決這個(gè)問(wèn)題的方法是通過(guò)其他細(xì)化算法得到更加精確的沒(méi)有斷點(diǎn)的圖像;但是對(duì)于焊縫的軌跡來(lái)說(shuō),由于焊縫都是比較長(zhǎng)的直線(xiàn),若是出現(xiàn)了一個(gè)像素的斷點(diǎn),可以通過(guò)后期的軟件插補(bǔ)出對(duì)應(yīng)的直線(xiàn)軌跡,所以這種斷點(diǎn)對(duì)于實(shí)際應(yīng)用來(lái)說(shuō)幾乎是沒(méi)有影響的。在圖4焊縫加噪點(diǎn)處理過(guò)程中,原始圖像被人為添加了椒鹽噪點(diǎn),圖像本身受到很大影響,通過(guò)縮小方法后依然有許多噪點(diǎn),通過(guò)圖像二值化以后,噪點(diǎn)依然存在。
(a)加噪點(diǎn)圖像
(b)灰度圖像
(c)縮小圖像
(d)二值化圖像
(e)細(xì)化后圖像
圖4 情況2加噪點(diǎn)的處理過(guò)程
當(dāng)圖像細(xì)化和去噪點(diǎn)完成后,圖像的焊縫骨架非常完好地保存了下來(lái),噪點(diǎn)基本上被完全去除;但是在焊縫骨架線(xiàn)條上方依然有一個(gè)短線(xiàn)條沒(méi)有被去除,這是因?yàn)閳D像本身在骨架上方存在由于采集圖像時(shí)留下的一片黑色區(qū)域。這同樣可以通過(guò)后期路徑插補(bǔ)的運(yùn)算消除。
實(shí)驗(yàn)結(jié)果表明:本文的處理方法對(duì)圖像的焊縫骨架提取較為精確,并且能夠保持很好的拓?fù)浣Y(jié)構(gòu),執(zhí)行周期少,灰度變換的效率較高,程序執(zhí)行時(shí)間短;對(duì)加了椒鹽噪點(diǎn)圖像也能夠很好的處理,達(dá)到了較好的去除噪點(diǎn)的效果。由于程序代碼在C#語(yǔ)言和FreeMat語(yǔ)言環(huán)境中都測(cè)試通過(guò),所以該算法具有一定的可移植性。
[1]續(xù)晉華.用于石油鋼管螺旋焊機(jī)外焊縫自動(dòng)跟蹤的視覺(jué)系統(tǒng)[D].西安:西安交通大學(xué),1991.
[2]Rafael C Gonzalez,Richard E Woods.數(shù)字圖像處理[M].2版. 阮秋琦,譯.北京:電子工業(yè)出版社,2007:192-209.
[3]劉海波,沈晶,郭聳,等.Visual C++數(shù)字圖像處理技術(shù)詳解[M].北京:機(jī)械工業(yè)出版社,2010:158-172.
[4]嚴(yán)玉龍,王厚樞. 快速并行細(xì)化算法[J]. 南京航空學(xué)院學(xué)報(bào),1991(1):136-140.
[5]王云. 焊縫圖像處理的匹配算法研究[D]. 杭州:浙江工業(yè)大學(xué), 2012.
[6]曲興田,王濱,張雷,等. 焊縫磨拋圖像預(yù)處理技術(shù)[J]. Issue,2012 (6): 1421-1425 .
[7]俞博,陳守強(qiáng),王雙一,等.基于手指角度特征的靜態(tài)手勢(shì)識(shí)別算法[J].西華大學(xué)學(xué)報(bào):自然科學(xué)版,2014,33(1):69-71.
西華大學(xué)學(xué)報(bào)(自然科學(xué)版)2014年6期