(3)
其中,a為閾值。若不滿足條件則繼續(xù)過渡。
1.2 空洞填補
圖像中的空洞點可以認為是受損的像素點,該位置的像素點與其周圍的像素點存在較大的關(guān)聯(lián),因此,可利用周圍像素點與空洞點的關(guān)系來進行填補。本文提出一種改進的鄰域像素空洞填補方法。由于空洞點多為縱向連續(xù)分布,即空洞點的上方和下方大概率也存在空洞點,如果只是使用空洞像素的8個鄰域像素點,將無法充分利用其周圍信息,故在橫向上額外增加A2、E22個像素作為空洞填補的參考像素??紤]到離空洞越近的像素點與空洞的相關(guān)性越強,因此賦予離空洞像素點位置遠的填補像素較小的權(quán)值,對離空洞近的填補像素點賦予大權(quán)值以保證填補的效果。由2D圖像通過DIBR方法轉(zhuǎn)換生成的左視圖與右視圖僅僅是視差不同,空洞填補的方式一致。空洞與鄰域填補像素的關(guān)系如圖1所示。

圖1 空洞與鄰域填補像素的關(guān)系
若C2為空洞點,使用B1、C1、D1、B2、D2、B3、C3、D3、A2、E2這10個像素進行空洞填補。但填補像素中依然可能存在空洞點,且通常這10個像素不會都是空洞點,則需要對填補像素中的空洞點數(shù)量進行討論,根據(jù)填補像素中空洞點的數(shù)量不同,給出不同的填補方法。若填補過程中這10個像素點中無空洞,則填補公式為:
C2=(B1+C1+D1+B2+D2+B3+
C3+D3)w1+(A2+E2)w2
(4)
記C2的8像素鄰域中的空洞數(shù)目為m,A2、E22個像素中空洞數(shù)目為n,考慮到填補像素中空洞點數(shù)量對填補效果的影響,若m<8且n<2,則空洞填補公式為:
D2+B3+C3+D3)+
(5)
若m=8且n<2,則空洞填補公式為:
(6)
若m<8且n=2,則空洞填補公式為:
D2+B3+C3+D3)
(7)
根據(jù)以上方法可以對圖像中的空洞點進行有效填補,彌補了鄰域像素空洞填補方法中沒有考慮鄰域填補像素存在空洞點的問題。
2 軟件算法的硬件FPGA實現(xiàn)
本算法的硬件實現(xiàn)是基于FPGA平臺,使用Altera的Cyclone IV EP4CE15開發(fā)板,該開發(fā)板具有15×103個邏輯單元、4 Mibit的SRAM、256 Mibit的SDRAM以及時鐘管理單元等資源。算法的硬件設(shè)計包括3×5窗口模板生成模塊、空洞判斷與填補模塊,最后進行了VGA的顯示。原理結(jié)構(gòu)如圖2所示。

圖2 空洞填補FPGA原理結(jié)構(gòu)
輸入圖像數(shù)據(jù)流為灰度圖,其灰度值范圍在0~255之間,通過移位寄存器生成3×5的窗口模板,利用窗口模板對空洞進行判斷和填補,最后通過VGA顯示輸出實驗結(jié)果。
2.1 3×5窗口生成模塊
因為與在軟件中對圖像進行處理的方式不同,硬件中的圖像信息是以數(shù)據(jù)流的方式進行傳輸?shù)?與時鐘周期有關(guān),1個時鐘周期只能發(fā)送或者接收1個像素數(shù)據(jù),從而無法一次性對整幅圖片進行處理,所以需要設(shè)計窗口模板來進行相應(yīng)的像素處理,并通過窗口模板的滑動來實現(xiàn)對整幅圖片的空洞填補操作。為了得到3×5窗口模板,使用先進先出(First-In- First-Out,FIFO)隊列來作為圖像數(shù)據(jù)的緩沖器。實驗中通過調(diào)用Quartus II軟件中的基于RAM的移位寄存器宏模塊altshift-taps實現(xiàn)行延遲以生成 3×5窗口模板。進行緩存的深度設(shè)置為輸入圖像的行像素總數(shù)。這樣1個時鐘周期里通過3個移位寄存器可以輸出3個像素數(shù)據(jù),通過5個時鐘周期可以輸出15個像素數(shù)據(jù),滿足了生成3×5的窗口模板,在模板中可以對這些像素進行空洞判斷和填補。
2.2 空洞填補模塊
3×5窗口模板可以取到15個像素數(shù)據(jù),如果像素是空洞就利用這模板中的10個像素數(shù)據(jù)進行空洞填補。圖像的空洞填補運算需要利用卷積與求和的計算方法,通??梢酝ㄟ^觸發(fā)器、加法器和乘法器的硬件設(shè)計來進行相應(yīng)的數(shù)學(xué)運算,但該方法比較繁瑣,本文采用可編程乘加法器和可編程多路并行加法器等來實現(xiàn)空洞填補需要的數(shù)學(xué)計算??斩刺钛a的移位寄存器像素運算結(jié)構(gòu)如圖3所示。

圖3 空洞填補運算結(jié)構(gòu)
空洞填補運算結(jié)構(gòu)由3個基于移位寄存器的Line Buffer、10個可編程乘法器及4組并行加法器構(gòu)成。Line Buffer0、Line Buffer1和Line Buffer2對輸入圖像數(shù)據(jù)中相鄰的3行像素分別進行緩存,模板中鄰域像素值與w1相乘,非鄰域像素值與w2相乘,通過可編程多路并行加法器處理數(shù)據(jù)后即可得到空洞的填補值。具體地,當圖像數(shù)據(jù)輸入時,圖像數(shù)據(jù)在時鐘控制下并行傳遞到后續(xù)的寄存器,持續(xù)5個時鐘周期后生成3×5的窗口模板,此時Line Buffer0中B1、C1、D1的輸出與w1并行相乘,相乘得到的數(shù)據(jù)再并行相加,并行相加的輸出為S1,為空洞填補結(jié)果的一部分。同理Line Buffer1和Line Buffer2也經(jīng)過乘加運算分別得到S2、S3,最終S1、S2、S3通過并行加法器運算得到空洞填補的結(jié)果。
3 實驗結(jié)果與分析
3.1 軟件實驗結(jié)果及分析
3.1.1 深度梯度過渡結(jié)果
為了驗證算法深度梯度過渡的效果,在Matlab軟件平臺上對圖片進行了實驗。實驗選取的圖片是在2D轉(zhuǎn)3D過程中生成的左視圖,目標視圖中存在空洞。圖片的名稱為Ding,分辨率為1 024×768。深度梯度過渡后局部對比如圖4所示。從圖4可以看出,通過深度梯度過渡處理減少了位于雕像左側(cè)前景與后景邊界的空洞數(shù)量,同時提高了視覺效果。

圖4 深度梯度過渡后局部對比
3.1.2 空洞填補
由空洞填補公式知,因為空洞填補使用10個像素作為填補像素,所以填補參數(shù)w1、w2應(yīng)滿足8w1+2w2=1的條件,由填補時像素與空洞遠近關(guān)系知w1>w2,w1的范圍在0.100~0.125之間,w2的范圍在0~0.1之間,w1的值分別選取0.105、0.110、0.115、0.120進行試驗,以獲得最佳的參數(shù)。使用峰值信噪比(peak signal-to-noise ratio,PSNR)對填補后的圖像進行評估,當w1取0.115時,得到較好的PSNR值。對圖片Ding進行空洞填補前后的實驗結(jié)果如圖5所示。

圖5 Ding圖片實驗結(jié)果
對比圖5a、圖5b可知,通過算法能有效地去除圖像中的空洞。對Ding實驗結(jié)果與加權(quán)均值濾波算法[5]、整體變分算法[6]及基于樣本的填補算法[7]的結(jié)果進行了比較,結(jié)果見表1所列。

表1 空洞填補參數(shù)比較
因為濾波會導(dǎo)致圖片模糊而丟失圖片的部分細節(jié),使用這種方法進行空洞填補將會導(dǎo)致填補后的目標視圖視覺效果不理想,所以使用濾波方法來處理圖片中的空洞并不合適。本文算法只針對空洞進行處理,能很好地保存圖片細節(jié)部分。由表1可知,本文算法的PSNR為38.64 dB,高于其他算法,均方誤差(mean square error,MSE)為8.90,低于其他算法,本文算法的PSNR與MSE性能指標優(yōu)于其他3種算法。
3.2 硬件實現(xiàn)及測試
硬件實現(xiàn)及測試實驗使用Altera的Cyclone IV EP4CE15 FPGA開發(fā)板。SD讀卡模塊、異步FIFO讀寫模塊與SDRAM讀寫模塊、空洞填補算法模塊、VGA顯示模塊共同構(gòu)成完整的實驗系統(tǒng)。聯(lián)機調(diào)試前,先對代碼進行了波形仿真,使用ModelSim軟件對算法仿真的結(jié)果如圖6所示。

圖6 空洞填補仿真波形
從空洞填補仿真波形可以看出,在輸入完整的15個像素窗口模板數(shù)據(jù)后,對空洞像素C2進行填補,填補前的像素值為二進制數(shù),值為00000000(十進制為0),填補后該位置的像素二進制數(shù)值為10011111(十進制為159),不再是空洞像素。同時,將填補后的像素值與其上、下、左、右4個像素值進行比較,觀察填補后的像素與其周圍的像素是否差異過大。若差異過大則可能造成填補后位置的像素視覺效果差??斩瓷稀⑾?、左、右4個位置如下:B2為10101001(十進制169);C1為10101001(十進制169);D2為10101111(十進制175);C3為10100011(十進制163),因此填補后的像素值C22與周圍像素在梯度變化上差異小,不會造成不良的視覺效果。為了測試空洞在硬件上的填補效果,將代碼用Quartus 軟件下載到FPGA開發(fā)板進行測試,填補前與填補后的結(jié)果如圖7所示。從圖7可以看出,在FPGA硬件平臺上能有效地填補圖片中的空洞,沒有視覺不適的現(xiàn)象,效果良好,同時,空洞去除后,對圖片中的其他細節(jié)并沒有造成影響。因此,設(shè)計的空洞填補算法在FPGA硬件平臺上也能針對圖片空洞進行有效的填補。


圖7 FPGA空洞填補前后結(jié)果
4 結(jié) 論
本文針對DIBR方法繪制后的目標視圖存在空洞的問題,提出了一種對目標圖像空洞有效填補的算法,先對深度圖前景與后景邊界中存在的空洞進行深度梯度過渡預(yù)處理,然后利用空洞點與周圍像素關(guān)系,即根據(jù)與空洞像素距離設(shè)置不同的權(quán)值w1、w2,并且考慮填補像素中的空洞數(shù)量,給出不同填補方法。最后將該算法在Matlab軟件平臺上和FPGA硬件平臺上分別進行了驗證,實驗結(jié)果表明填補效果良好。