1. 程式人生 > >利用小波融合對由聚焦失敗導致的影象模糊進行修復

利用小波融合對由聚焦失敗導致的影象模糊進行修復

       影象的融合是將兩幅或多幅影象融合在一起,以獲取對同一場景的更為精確、更為全面、更為可靠的影象描述。融合演算法應該充分利用各原影象的互補資訊,使融合後的影象更適合人的視覺感受,適合進一步分析的需要。例如在實際攝影拍照時,由於焦距的緣故,近景或遠景總有一者可能處於模糊不清的狀態。此時運用影象融合技術就可以將兩張模糊的圖片(一張近景模糊,一張遠景模糊)進行融合。小波變換是影象的多尺度、多解析度分解,它可以聚焦到影象的任意細節。

       隨著小波理論及其應用的發展,將小波多解析度分解用於畫素級影象融合也已經得到廣泛的應用。具體實現時,首先對每一幅原影象分別進行小波變換,建立影象的小波塔型分解;然後對各分解層分別進行融合處理。各分解層上的不同頻率分量可採用不同的融合運算元進行融合處理,最終得到融合後的小波金字塔;最後對融合後所得的小波金字塔進行小波重構,所得到的重構影象即為融合影象。


圖1  用小波進行影象融合

在MATLAB中我們可以直接使用函式wfusimg()來實現影象的融合,下面給出它的常用語法形式:

XFUS = wfusimg(X1,X2,WNAME,LEVEL,AFUSMETH,DFUSMETH)

[XFUS,TXFUS,TX1,TX2] =wfusimg(X1,X2,WNAME,LEVEL,AFUSMETH,DFUSMETH)

       其中,X1和X2是待融合的兩幅原始影象。引數WNAME給出要採用哪種小波,而LEVEL則給出了小波分解的層數。需要特別說明的是引數AFUSMETH和DFUSMETH,它們分別指定了低頻(近似)資訊和高頻(細節)資訊的融合方法。具體的可選項有'max'、'min'、'mean'、'img1'、'img2'或者'rand',它們分別表示近似和細節資訊的融合方式為取X1和X2對應元素中的最大值、最下值、平均值、前者、後者或者隨機選擇。返回值XFUS是融合後的結果影象,而TXFUS、TX1和TX2則對應XFUS、X1和X2的小波分解樹。

      下面這段程式碼演示了利用小波工具箱中的函式wfusimg()來實現影象融合的方法。小波變換的絕對值大的小波係數,對應著顯著的亮度變化,也就是影象中的顯著特徵。於是選擇絕對值大的小波係數作為保留細節所需的小波係數。低頻部分系數可以選擇二者之間的最大值,也可以採用二者之間的平均值。最後重構出影象即可。

X1 = imread('cathe1.bmp');

X2 = imread('cathe2.bmp');

XFUS = wfusimg(X1,X2,'sym4',5,'mean','max');

imshow(XFUS,[]);

       該段程式的執行結果如圖1所示,第三幅影象就是將前兩幅影象進行融合後的結果。易見,融合處理後的結果成功去除了前兩幅影象中模糊不清的部分。

       當然,我們也可以不使用小波工具箱中給出的現成函式,而選擇自己動手實現基於小波的影象融合演算法。這對我們實際瞭解該演算法是如何進行的大有裨益。下面這段示例程式實現了與前面程式碼段相同的作用,請讀者留意註釋說明的部分。另需說明的是,下面這段程式僅僅是為了演示演算法實現而編寫的,因此並沒做異常處理的考慮,我們預設待處理的兩幅原始影象的尺寸是一樣的。

X1 = imread('cathe1.bmp');

X2 = imread('cathe2.bmp');

M1 = double(X1) / 256;

M2 = double(X2) / 256;

N = 4;

wtype = 'sym4';

[c0,s0] = wavedec2(M1, N, wtype);

[c1,s1] = wavedec2(M2, N, wtype);

length = size(c1);

Coef_Fusion = zeros(1,length(2));

%低頻係數的處理,取平均值

Coef_Fusion(1:s1(1,1)) = (c0(1:s1(1,1))+c1(1:s1(1,1)))/2;

%處理高頻係數,取絕對值大者,這裡用到了矩陣乘法

MM1 = c0(s1(1,1)+1:length(2));

MM2 = c1(s1(1,1)+1:length(2));

mm = (abs(MM1)) > (abs(MM2));

Y  = (mm.*MM1) + ((~mm).*MM2);

Coef_Fusion(s1(1,1)+1:length(2)) = Y;

%重構

Y = waverec2(Coef_Fusion,s0,wtype);

imshow(Y,[]);

       上面這段程式碼中用到了小波重構函式waverec2(),函式waverec2()其實就是wavedec2()的相反過程,該函式的常用語法形式如下:

X = waverec2(C,S,'wname')

X = waverec2(C,S,Lo_R,Hi_R)

       其中,引數C、S、N和'wname'的意義都與二維小波分解函式wavedec2()中定義的一樣,這裡不再贅言。Lo_R是重構低通濾波器,Hi_R是重構高通濾波器。

       影象融合在工業影象採集中具有非常重要的應用。通常,在不同的焦距下,由工業攝像頭拍攝的一組影象會因為景深的不同而產生區域性模糊的現象,為得到全域性的清晰影象,勢必要對整組影象進行融合,這時小波變換無疑是首選處理技術。

       在影象融合過程中,小波基的種類和小波分解的層數對融合效果有很大的影響,對特定的影象來說,哪一種小波基的融合效果最好,分解到哪一層最合適,則是演算法設計者需要研究的問題。