小波圖像分解與重構程序存在的問題與解決辦法

(思遠老師的好文章留着)

去年11月發佈了一系列有關小波變換和圖像處理的文章,把學習小波過程中的心得體會和編寫的程序放在網上和大家共享交流。半年來,感謝大家的關注和幫助,在相互的討論交流中,我不斷地從大家提出的問題中拓展自己的知識面,對小波的理論及其應用有了更深入的瞭解和掌握。的確,分享,纔是知識永恆之道!

接下來有新的課題,並且要準備考博,研學征途馬上要展開新的探索。在此之前,得先整理下博客文章,根據和大家討論交流中發現的問題,對博客中的程序進行修正。今天發佈的文章,就是對小波圖像分解和重構程序作出重要的修正,這個程序是瞭解小波、使用小波最根本的,希望對大家學習小波有所幫助。

首先指出我原來發布的小波圖像分解重構的文章中存在的問題。相關的文章有:

1、自己動手編寫小波信號分解與重構的Matlab程序
http://blog.csdn.net/chenyusiyuan/archive/2007/11/13/1881781.aspx

2、用自編的程序實現小波圖像分解與重構
http://blog.csdn.net/chenyusiyuan/archive/2007/11/13/1881940.aspx

其存在的問題有:

(1)程序所用的小波函數只有非標準的Haar小波,其濾波器組爲 Lo_D=[1/2 1/2], Hi_D=[-1/2 1/2],是固化在 mydwt2.m 的程序中的,不能選擇其他的小波函數

(2)非標準的Haar小波,其分解出來的係數矩陣中,高頻係數的細節內容(輪廓、邊緣等特徵)不明顯

(3)函數 mydwt2 中列變換的矩陣對象爲輸入矩陣,這是錯誤的,其矩陣對象應該是行變換後的緩存矩陣;

(4)函數 mydwt2 的輸出用[LL,HL,LH,HH]表示,不是很規範,應改爲[cA,cV,cH,cD]來表示,即一級小波變換輸出的係數矩陣有4個部分:平均部分、垂直細節部分、水平細節部分和對角線細節部分。

(5)函數 mydwt2 的輸出[LL,HL,LH,HH]中,HL 取的是小波行變換和列變換後所得矩陣的左下角部分,即垂直細節部分,但在最終的顯示結果中 HL 是在右上角的位置的;類似地,LH 取行、列變換所得矩陣的右上角部分,即水平細節部分,但最終顯示位置是在左下角,當時這樣定義,是我從教材中看到小波一級分解後所得矩陣的平均、細節部分分佈從上到下、從左到右依次爲:平均部分、水平細節部分、垂直細節部分、對角線細節部分。但通過編程實現和仔細分析,我發現其分佈次序應該是平均部分、垂直細節部分、水平細節部分、對角線細節部分纔對,即水平和細節的位置對調,具體過程下文會給出圖示,希望能和大家討論下哪個次序纔是正確的。

(5)函數 mywavedec2 的輸出 y 是與輸入矩陣 x 相同大小的矩陣,並且已將N級分解後所有的平均、細節係數組合成一體的。實際上,這種定義只對Haar小波有效。因爲對於Haar小波來說,其濾波器長度僅爲2,輸入序列與濾波器係數卷積後,輸出序列與輸入序列長度是相同的(在Matlab中,若信號長度爲n,濾波器長度爲2N,則小波分解後cA、cD的長度均爲:lnf = floor((n-1)/2)+N,若2N=2,則 lnf*2 = n),從而使小波係數矩陣與圖像矩陣的大小相同。若使用其它類型的小波,由於 2N > 2,lnf*2 > n,這樣函數 mydwt2 輸出的係數矩陣將比輸入矩陣大,那麼 mywavedec2 的輸出 y 將會顯示出平均與細節部分邊界重疊的問題。這說明了試圖把平均和細節係數組合成一體,以顯示小波分解的塔式結構,理論上是不可行的,至少對於Matlab來說是不可行的。當然,由公式 lnf = floor((n-1)/2)+N ,我們可以對卷積後的序列進行截取,使卷積輸出序列與輸入序列長度相同,但通過編程實現發現,截取會找出下一級分解錯誤,所以函數 mywavedec2 的輸出 y 的格式要作適當調整。

(6)原程序中要調用 modmat 函數對圖像矩陣進行修剪,使之能被 2 的 N 次方整除,主要是爲了生成塔式結構圖像而設的,對上述問題修正後,這個 modmat 函數已不需使用了。

針對上述問題,我對程序作了以下幾點修正:

(1)函數 mywavedec2 / mywaverec2 的輸入參數增加了小波函數'wname',可以選擇任意類型的小波函數來對圖像進行小波分解和重構。相應地,調用Matlab函數 wfilters 來求取小波函數的分解濾波器組係數[Lo_D,Hi_D]和重構濾波器組係數[Lo_R,Hi_R]。

(2)函數 mydwt2 的輸出應改爲[cA,cV,cH,cD]來表示,注意這4個部分的位置分佈:cA 在係數矩陣的左上角,cV 在右上角,cH 在左下角,cD 在右下角。

(3)函數 mydwt2 的列變換,其處理對象由輸入矩陣 x 改爲 行變換後的緩存矩陣 x1,列變換後得到緩存矩陣 x2。輸出 cA 取 x2 的左上角1/4部分,cV 取 x2 的右上角1/4部分,cH 取 x2 的左下角1/4部分,cD 取 x2 的右下角1/4部分。

(4)函數 mywavedec2 的輸出 y 格式改爲與Matlab的 wavedec2 類似,但我的是以“細胞矩陣”的格式,而 wavedec2 是以“向量序列”的格式輸出小波係數。小波分解的結果顯示方式不再使用塔式結構方式,而是用 subplot 函數把各級平均、細節係數顯示出來

(5)重構函數 mywaverec2 根據分解函數 mywavedec2 的輸出格式做了相應的修改,程序更簡潔、易懂和合理。並且 mywaverec2 的重構級數可以與分解級數不同,能夠實現不同級別的小波重構


(6)函數 myidwt2 的行、列變換中,卷積後要對卷積輸出序列進行裁剪,消除分解濾波器和重構濾波器對序列長度的影響,使重構矩陣的大小與上一分解級的係數矩陣大小一致。

以上是主要的修正點,更詳細的修改信息請看下一篇文章給出的程序及其註釋。


發佈了59 篇原創文章 · 獲贊 13 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章