白東陽,劉健,王曉曼,景文博
(1.長春理工大學 電子信息工程學院,長春 130022;2.長春理工大學 光電工程學院,長春 130022)
隨著科技的發(fā)展,焊接技術(shù)已在我國國民經(jīng)濟中占據(jù)著越來越重要的地位[1]。如今計算機機器視覺的飛速發(fā)展,使得該技術(shù)越來越多的應(yīng)用到焊縫檢測領(lǐng)域,通過圖像處理對工業(yè)中的焊縫實體進行數(shù)字化的分析計算,利用視覺傳感器獲取圖像數(shù)據(jù),運用圖像處理算法快速準確的提取焊縫的特征,得到焊縫的間距等信息。
在工業(yè)焊接中,獲取焊縫間距是進行后續(xù)焊接操作的重要參考,而準確快速地檢測出焊縫邊緣又對計算焊縫間距至關(guān)重要,所以如何檢測出焊縫的邊緣信息顯得尤為重要[2]。而焊縫圖像往往存在大量的噪聲信號,并且焊件的表面材質(zhì)復(fù)雜、光照不均勻等因素都會對圖像處理結(jié)果造成較大的影響,經(jīng)過大量的圖像處理工程經(jīng)驗的Canny算子可以有效的應(yīng)用于焊縫的邊緣檢測中,其精度高、靈活性大的優(yōu)點作為本算法的首選[3]。但是Canny算子也具有明顯的缺點,由于采用高斯濾波、非極大值抑制、邊緣連接的計算流程,存在算法復(fù)雜度高、運算速度緩慢,與實際工程中快速準確的應(yīng)用原則相悖,極大的制約了算法的工程實用性。同時,單一的CPU處理和OpenCV處理執(zhí)行效率也不高,不能用于快速場景檢測以及工程項目開發(fā)中。
為了提高Canny算子的計算速度,利用GPU并行化處理是一種很好的選擇[4]。GPU擁有多個線程,可以對低耦合、高并行的大型數(shù)據(jù)進行快速計算;同時,近年來GPU的并行計算日臻成熟,其友好的編程操作、親民的價格也為使用GPU并行處理Canny算子檢測焊縫提供了可能。要想使用GPU并行處理Canny算子檢測焊縫必須對Canny算子的處理過程優(yōu)化和并行化改造,以此契合GPU的并行化處理要求。通過對Canny算子的優(yōu)化改造,運行GPU+CPU的處理模式使得一幅1280×960的圖像邊緣檢測時間縮短到10ms以內(nèi),大大提高了算法執(zhí)行效率,為實際工業(yè)使用奠定了基礎(chǔ)。
在對焊縫的采像過程中,由電子器件產(chǎn)生的高斯噪聲是主要的噪聲因素,在對焊縫圖像的處理中,經(jīng)常采用3×3或5×5的卷積模板進行高斯濾波,以便消除高斯噪聲。濾除高斯噪聲是準確獲得焊縫邊緣檢測結(jié)果的基礎(chǔ)。
通過公式(1)對焊縫圖像每個像素進行卷積運算。經(jīng)過高斯濾波處理,焊縫圖像較之原圖像會顯得模糊,但是焊縫圖像中的高斯噪聲得到了有效抑制。
公式(2)為Canny算子x方向和y方向所采用的卷積算子:
Canny算子的梯度幅值和梯度方向的計算為:
非極大值抑制(NMS)主要是為了更精確的定位焊縫邊緣特征,用梯度變化表征邊緣時,梯度變化較大的區(qū)域通常比較寬,所以利用x和y方向的梯度確定一個法向arctan(y/x),然后在法向上判斷當前梯度測量是否是一個峰值(或局部極大值),如果是就保留,不是極大值就抑制,如圖1所示。
圖1 非極大值抑制示意圖
在Canny算子檢測焊縫中進行非極大值抑制步驟必不可少,目的就是通過梯度變化確定出圖像中的局部最大值,同時將非極大值的像素值置為0,通過這種處理可以將大量的偽邊緣點剔除,使得邊緣檢測準確可靠。
Canny算法不使用單一閾值濾波,而是使用一種雙閾值法的連通分量分析技術(shù)[5]。此步驟使用兩個閾值,T1和T2,其中T1>T2,將像素劃分為邊緣和非邊緣像素。梯度值高于T1的像素被歸類為邊緣像素,像素值處于T1和T2之間的被歸類為潛在的邊緣像素,T2下的像素被歸類為非邊緣像素,所有靠近確定邊緣的潛在邊緣像素也會被標記為確定邊緣像素。通過判斷較強的邊緣像素和相對較弱的邊緣像素,可以把焊縫圖像中的邊緣輪廓完整提取出來,在輪廓末端會在當前像素鄰域內(nèi)進行判斷,找出大于T1值的像素,并確定為邊緣像素,使得檢測出圖像邊緣并完全閉合。
表1是對不同尺寸的圖像完成整個Canny算子邊緣檢測的執(zhí)行時間;圖2是在CPU執(zhí)行Canny算子的整個過程中各個步驟的所耗時間比例,Canny算子在高斯濾波和邊緣搜索環(huán)節(jié)最為耗時,高斯濾波通過卷積操作對圖像的每個像素進行運算,如果不進行加速,此步驟耗時嚴重,不過該操作很容易進行GPU并行化加速改造;同時邊緣搜索是對已經(jīng)被標記的8鄰域點進行搜索,如果是有效點,則標記處理,該單一線程搜索模式速度緩慢,利用GPU優(yōu)化也相當合適。
表1 CPU實現(xiàn)不同圖像尺寸Canny算法的執(zhí)行時間
圖2 Canny算法各步驟執(zhí)行時間比例圖
高斯濾波通過公式(4)對焊縫圖像進行濾波操作:
其中,I(i,j)為濾波后的像素值,A(i,j+t)為原像素值。由公式(1)和公式(2)可知高斯卷積核呈中心對稱分布,可以將高斯濾波分為x方向和y方向兩次濾波,各個方向均為一維高斯濾波[6]。
其中,公式(5)和公式(6)分別是是焊縫圖像在x方向上和y方向上的一維高斯濾波。之前對焊縫圖像像素采用二維高斯濾波改造為兩次相垂直方向的兩次濾波,具有兩個明顯的好處:首先,運算復(fù)雜度降低,對于分辨率為M×N大小的焊縫圖像,原有的復(fù)雜度O((2a+1)×(2a+1)×M×N)降為O((2a+1)×M×N×2);還符合GPU并行處理模式,將單一線程操作擴展為多線程并行操作,利用GPU的多線程并行處理優(yōu)勢極大縮短了焊縫圖像的高斯濾波時間,GPU加速原理如圖3所示。
圖3 GPU加速原理圖
非極大值抑制在Canny算子整個算法流程中所用時間最少,該步驟和雙閾值圖像分割過程一樣均屬于大數(shù)據(jù)量簡單計算操作,根據(jù)尋找搜索方向和梯度大小,判斷所尋找到的像素點是否為局部最大值,決定該處灰度值是否置為0。利用圖3所示的GPU并行加速方法,只要得到搜索方向和梯度大小就可以進行快速的迭代比較,完成非極大值抑制和雙閾值圖像分割[7-9]。
GPU線程通信有線程同步、共享存儲器和原子操作三種方式,對于同一個Block中的線程才可以直接實現(xiàn)通信,而不同Block中的線程不能通過共享內(nèi)存、同步的方式進行通信,所以即使在GPU上完成邊緣連接的操作,還需要將GPU顯存中的數(shù)據(jù)傳回內(nèi)存以完成各個線程的同步,這個數(shù)據(jù)傳輸過程是極其耗時的,甚至大于邊緣連接的時間;如果采用原子或主機介入的方式,會出現(xiàn)邊緣像素位置不連續(xù)的問題,同時數(shù)據(jù)也會出現(xiàn)明顯的延遲,非常不利于速度的提升[10-12]。
因此,考慮使用先進先出(FIFO)來完成強邊緣圖像S(i,j)中所有像素邊緣的連接[13]。在強邊緣圖像S(i,j)中,第一像素P被推入隊列中,并且同時以P點作為起點,弱邊緣圖像W(i,j)搜索P點的八鄰域,如果弱邊緣像素存在,它們被添加到強邊緣圖像S(i,j)中,同時也被壓入到隊列的尾部,從隊列的頭部提取已被分類為強邊緣Q點,再以Q點為起點,繼續(xù)搜索弱邊緣圖像W(i,j)中Q點的8鄰域像素,如果周圍沒有弱邊緣像素,則直接從隊列中刪除,并對其他像素重復(fù)上述過程,直到隊列為空。然后將S(i,j)中的第二個像素壓入隊列,重復(fù)上述過程,直到S(i,j)的每個像素都被搜索到為止。圖4顯示了起點P(3 ,2)的邊緣連接。
圖4 邊緣連接示意圖
實驗環(huán)境如表2所示,對于1280×960像素大小的圖片,不同方式的邊緣檢測結(jié)果如圖5所示,圖5(b)為CPU邊緣檢測效果圖,圖5(c)為OpenCV處理效果圖,圖5(d)為GPU+CPU的效果圖與上述兩種處理方式結(jié)果基本一致。
表2 實驗環(huán)境
圖5 不同處理方法的效果對比圖
由圖5看出原始Canny算法和優(yōu)化加速后的算法效果基本一致,焊縫輪廓已經(jīng)能夠很好地與背景分割開,不影響焊縫圖像后續(xù)的霍夫檢測等處理,上述實驗說明本文算法可行。
圖6 不同實現(xiàn)方法速度對比圖
針對不同版本的Canny檢測算法的實驗結(jié)果如圖6。圖6是GPU加速實現(xiàn)、OpenCV實現(xiàn)、單一CPU實現(xiàn)的檢測結(jié)果。從圖中可以看出,對于不同尺寸的圖像,使用GPU并行計算的執(zhí)行速度較其他算法有明顯提高。通過表3數(shù)據(jù)可以看出:由于Canny算子使用了GPU多線程并行處理的方法,相比單一CPU實現(xiàn)和OpenCV實現(xiàn)速度都有明顯的提升,并且對于像素數(shù)越大的圖像這種加速效果越明顯。因此,在實際的焊縫圖像檢測中,可以選擇CPU+GPU的計算模式進行更高效率的焊縫檢測。
表3 不同像素尺寸焊縫圖像各種實現(xiàn)方法速度對比
本論文對Canny算法流程的各個步驟都進行了GPU并行化改造優(yōu)化,使得Canny算子對焊縫邊緣檢測的速度大幅度提升,可以將1280×960像素大小的焊縫圖像邊緣檢測時間縮短到10ms以內(nèi),既滿足了快速的工程實用性要求,檢測結(jié)果也滿足焊縫圖像的后期處理要求。此外,GPU擁有強大的計算能力,適宜大數(shù)據(jù)量并行化處理,同時價格親民、性價比突出,對Canny算法具有較好的靈活性和較快的計算速度,對焊縫邊緣快速檢測具有重要意義。