李海玲, 張昊
(西安航空學(xué)院 計(jì)算機(jī)學(xué)院, 西安 710077)
卷積[1-2]一詞最開始出現(xiàn)在信號(hào)與線性系統(tǒng)中,信號(hào)與線性系統(tǒng)中討論的就是信號(hào)經(jīng)過一個(gè)線性系統(tǒng)以后發(fā)生的變化。而現(xiàn)實(shí)情況常常是一個(gè)信號(hào)前一時(shí)刻的輸出影響著這一時(shí)刻的輸出,所以一般利用系統(tǒng)的單位響應(yīng)與系統(tǒng)的輸入求卷積,以得到系統(tǒng)的輸出信號(hào)。卷積定義為兩個(gè)變量在某范圍內(nèi)相乘后求和的結(jié)果,如果卷積的變量是序列x(n)和h(n),則卷積的結(jié)果y(n)由式(1)得到式(1)。
*h(n)
(1)
其中星號(hào)*表示卷積。在數(shù)字圖像處理[3]和卷積神經(jīng)網(wǎng)絡(luò)[4](Convolutional Neural Networks,簡稱CNN)等方面,卷積應(yīng)用也非常廣泛,利用卷積運(yùn)算可以對圖像進(jìn)行空域增強(qiáng),在卷積神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,首當(dāng)其沖的操作便是卷積。
數(shù)字圖像是一個(gè)二維的離散信號(hào),對數(shù)字圖像做卷積操作就是利用卷積核(卷積模板)在圖像上滑動(dòng),將圖像點(diǎn)上的像素灰度值與對應(yīng)的卷積核上的數(shù)值相乘,然后將所有相乘后的值相加作為卷積核中間像素對應(yīng)的圖像上像素的灰度值,并最終滑動(dòng)完所有圖像的過程,輸出結(jié)果仍然是一副圖像[5]。卷積具體過程,如圖1所示。
(a)*(b)=(c)
圖1 數(shù)字圖像卷積過程
其中圖1(a)為卷積前的圖像點(diǎn)上的像素灰度值,圖1(b)為卷積核,圖1(c)為卷積結(jié)果。
從圖像卷積過程可以看出,卷積操作會(huì)導(dǎo)致圖像變小,如圖1所示。原始圖像尺寸為5×5,卷積核尺寸為3×3,一次卷積結(jié)束卷積核移動(dòng)步長為1個(gè)像素,卷積結(jié)果尺寸變?yōu)?×3。這是因?yàn)樵诰矸e運(yùn)算過程中要用到輸入圖像中與卷積核中心的鄰域所對應(yīng)的像素,當(dāng)卷積核滑到圖像邊界,比如圖像底部的像素,而它的下面已經(jīng)沒有像素了,卷積核一部分?jǐn)?shù)據(jù)則恰好落在了處理圖像的外圍,這樣就失去了與之相對應(yīng)計(jì)算的數(shù)據(jù)。
解決這個(gè)問題有兩種辦法[5]:一種是忽略這些邊界處的像素,只考慮圖像內(nèi)部與邊界距離小于等于卷積核半徑的像素。另一種是將輸入圖像進(jìn)行擴(kuò)展,使得卷積結(jié)果得到的圖像尺寸和輸入圖像尺寸一致。第一種辦法在原始圖像尺寸比較大且感興趣目標(biāo)在圖像內(nèi)部時(shí)??梢越邮埽?yàn)榇藭r(shí)圖像邊界損失不影響整體效果。然而如果卷積核移動(dòng)步長增大或是卷積核變大,圖像邊界損失將愈加嚴(yán)重。所以經(jīng)常的一種做法是人為的在卷積操作之前對圖像邊界進(jìn)行擴(kuò)展。
如前所述,當(dāng)卷積核到達(dá)圖像邊界,為了得到和原始圖像大小相同的結(jié)果,降低圖像邊界損失,需要先對原始圖像做邊界擴(kuò)展填充處理。邊界擴(kuò)展填充處理需要解決兩個(gè)問題,第一,邊界擴(kuò)展多少個(gè)像素;第二,擴(kuò)展的邊界用什么值填充。
從圖(1)可知,邊界填充數(shù)量跟原始圖像尺寸、卷積核尺寸、移動(dòng)步長均有關(guān)系。假設(shè)原始圖像尺寸為M×M,卷積核大小為N×N,邊緣填充像素個(gè)數(shù)為pad,移動(dòng)步長為step。則卷積后圖像的尺寸m為式(2)。
m=(M-N+2×pad)/step+1
(2)
要得到m=M,即卷積前后的圖像尺寸不變,根據(jù)式(2),當(dāng)給定卷積核移動(dòng)步長,便可計(jì)算出邊界填充像素的個(gè)數(shù)。
確定好邊界填充的像素?cái)?shù)目后,新增行或列中像素值可用不同的方法來確定。最簡單的方法就是全用0填充,缺點(diǎn)是有可能導(dǎo)致圖像邊界處有明顯的不連貫;或者用其在原圖像中4-鄰域像素的值填充,4個(gè)角上新增像素的值用其在原圖像中8-鄰域像素的值填充;或者將圖像在水平和垂直方向看作是周期循環(huán)的,最后一行(或列)之后是圖像的第一行(或列),從而用相應(yīng)的行(或列)填充;或者利用外插技術(shù),根據(jù)一定的規(guī)則進(jìn)行邊界像素值填充[5]。
在卷積神經(jīng)網(wǎng)絡(luò)中,邊界擴(kuò)展的方法主要有邊界補(bǔ)0、邊界復(fù)制、邊界鏡像、邊界對稱和邊界塊復(fù)制等[6]。OpenCV的幫助文檔中提供了幾種不同的邊界擴(kuò)展策略,如表1所示。
表1 OpenCV中邊界擴(kuò)展類型及含義
其中“|”表示的是圖像的邊界,兩個(gè)“|”中間是圖像的內(nèi)容,最后一個(gè)邊界拓展策略還要額外給定一個(gè)i值,表示用i值對邊界進(jìn)行填充。
其中BORDER_REPLICATE體現(xiàn)的就是邊界復(fù)制的意思,BORDER_REFLECT表示用邊界鏡像方式填充,BORDER_REFLECT_101表示對稱填充,BORDER_WRAP表示邊界以塊復(fù)制填充,BORDER_CONSTANT表示用指定的常量i填充,當(dāng)i=0時(shí)即為邊界補(bǔ)0的含義。
在OpenCV中,邊界擴(kuò)展以原圖為基準(zhǔn),逐行處理,先擴(kuò)展左邊界,再擴(kuò)展右邊界,最后擴(kuò)展上邊界和下邊界,以圖1(a)為例,邊界擴(kuò)展2個(gè)像素,各種擴(kuò)展后的圖像如圖2所示。
(a)
(b)
(c)
(d)
(e)
其中圖2(a)為邊界補(bǔ)0結(jié)果,圖2(b)為邊界復(fù)制結(jié)果,圖2(c)為邊界鏡像結(jié)果,圖2(d)為邊界對稱結(jié)果,圖2(e)為邊界塊復(fù)制結(jié)果。
如果邊界填充的像素?cái)?shù)為1,則邊界復(fù)制和邊界鏡像的結(jié)果是相同的,為了區(qū)分每一種邊界擴(kuò)展方法,在OpenCV中,選用高斯-拉普拉斯算子(Laplacian of Gaussian,簡稱LoG算子)作為卷積核,對圖像進(jìn)行了邊界擴(kuò)展測試和實(shí)現(xiàn)。LoG算子常用于數(shù)字圖像的邊緣提取和二值化,它把Gauss平滑濾波器和Laplacian銳化濾波器結(jié)合起來,先平滑掉噪聲,再進(jìn)行邊緣檢測,所以效果會(huì)更好[7-9]。
OpenCV中用函數(shù)filter2D來實(shí)現(xiàn)對圖像或矩陣的卷積操作。這個(gè)函數(shù)本質(zhì)上做的是協(xié)相關(guān)操作,但是當(dāng)核算子是對稱的,則協(xié)相關(guān)操作也是卷積操作。copyMakeBorder函數(shù)的功能是設(shè)置邊界擴(kuò)展的方式及填充值的數(shù)量。在對圖片進(jìn)行卷積處理之前,先調(diào)用copyMakeBorder函數(shù)進(jìn)行圖像邊界擴(kuò)充,然后調(diào)用函數(shù)filter2D實(shí)現(xiàn)圖片卷積,最后再對卷積結(jié)果進(jìn)行剪切,從而得到和原始圖片相同尺寸的對應(yīng)卷積結(jié)果[10]。
實(shí)驗(yàn)中選用標(biāo)準(zhǔn)原始圖像尺寸為512×512,卷積核為LoG算子,大小為5×5的模板,如圖3所示。
圖3 常用的高斯-拉普拉斯算子
移動(dòng)步長設(shè)置為1,根據(jù)式(2),要得到原始圖像的尺寸,邊界填充像素個(gè)數(shù)為2。實(shí)驗(yàn)結(jié)果,如圖4所示。
其中圖4(a)為邊界補(bǔ)0后的卷積結(jié)果,圖4(b)為邊界復(fù)制后的卷積結(jié)果,圖4(c)為邊界鏡像填充后的卷積結(jié)果,圖4(d)為邊界對稱填充后的卷積結(jié)果,圖4(e)為塊復(fù)制填充后的卷積結(jié)果,圖4(f)為原始圖像。
(a)
(b)
(c)
(d)
(e)
(f)
由于圖像邊緣只填充了2個(gè)像素,不同邊界填充的卷積結(jié)果肉眼不易區(qū)分,實(shí)驗(yàn)結(jié)果數(shù)據(jù),如圖5所示。
圖5 不同邊界擴(kuò)充結(jié)果和卷積結(jié)果數(shù)據(jù)
為了說明情況,圖中只列出了圖像最前面的36個(gè)數(shù)據(jù)。其中6 × 6(前)表示原始圖像的前36個(gè)數(shù)據(jù),6 × 6(后)表示原始圖像前6行、倒數(shù)6列的36個(gè)數(shù)據(jù)。實(shí)驗(yàn)數(shù)據(jù)給出了五種不同邊界擴(kuò)充方法的結(jié)果以及每一種方法擴(kuò)充后的卷積結(jié)果。
卷積是數(shù)字圖像處理和卷積神經(jīng)網(wǎng)絡(luò)中常用的一個(gè)技術(shù),卷積操作會(huì)導(dǎo)致圖像變小從而損失圖像邊界。為得到和原始圖像尺寸相同的卷積結(jié)果,本文研究了各種邊界擴(kuò)展方法及填充方式,并在OpenCV中以高斯-拉普拉斯算子為卷積核,對標(biāo)準(zhǔn)圖像進(jìn)行了各種邊界填充的實(shí)現(xiàn)以及對應(yīng)的卷積實(shí)現(xiàn)和裁剪,為進(jìn)一步開展卷積神經(jīng)網(wǎng)絡(luò)研究和深度學(xué)習(xí)奠定基礎(chǔ)。