我個人在完成作業的時候,走了許多彎路,最後,反覆讀老師的第3章講義的第3--5節,明白了小波變換的一些非常基礎性的知識,正是如此,我主要是按照第三章的例子,做出使用MATLAB進行Haar變換的執行個體,這至少對完成非標準Haar小波的3級分解與合成沒有任何問題,而且計算速度遠遠比使用一維變換快,甚至超過dwt2和wavedec2。再者,是通過這些簡短的例子的學習,也能從實踐的角度理解小波變換的基礎知識和道理,我覺得掌握小波的知識要比簡單使用dwt2直接分析出結果更重要。為了讓使用一維變換或打算採用卷積完成分解重構程式的同學有所參考,也給出了我以前寫的代碼和設想供有興趣者參考。在映像壓縮的任務中,我個人建議採用wdencmp,原因是簡單可靠,能夠產生老師要求小波壓縮與重構的示範及PNG檔案。在最後部分著重對使用小波壓縮之後重構映像的PNG檔案會變大問題進行了簡單的猜測性的解釋和討論,希望感興趣的同學能深入研究。
- 使用
Haar和Db9小波編寫影像檔的標準和非標準分解重構程式
實質上,任務書中規定首先要編寫4種程式之一:哈爾(haar)小波的標準分解重構程式;Daubechies 9小波的標準分解重構程式;哈爾(haar)小波的非標準分解重構程式;Daubechies 9小波的非標準分解重構程式。如果採用標準方法,需要產生圖3-25的系列映像。如果採用非標準方法則需要產生圖3-26的系列映像。
我個人編寫了非標準的分解重構程式,並總結網上同學們公開的方法,認為可以有3種方法實現。但前提是必須仔細閱讀林老師推薦的補充教材第三章“小波與小波變換”的3.3、3.4和3.5節(14-27頁)。如果能使用MATLAB簡單地實踐一下教材的例子,至少完成哈爾小波的標準與非標準程式相當簡單。為此我主要介紹如何?老師教材給我們的例子是如何在MATLAB中實現的。然後,再引申到使用MATLAB的函數實現方法。為了描述問題簡便,使用黑體表示需在MATLAB的命令視窗(command window)的輸入部分。如果不熟悉下面出現的函數功能和使用方法,請再命令視窗中使用 help 函數名,如help dwt2,能夠得到英文的功能和用法說明。
- 哈爾小波變換的
MATLAB執行個體
先介紹MATLAB的矩陣(Matrix)和向量(Vector)的賦值方法:在command window的>>符號下輸入:
一維向量: I = [ 9 7 3 5]
F = [2, 5, 8, 9, 7, 4, -1, 1]
二維矩陣: A = [
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1
]
I和F現在就是[例3.1][例3.2]一維向量, A就是3.5.1中的映像矩陣。在進行Haar小波的一維與二維變換(分解)之前,首先介紹一下MATLAB的矩陣運算。
MATLAB是Matrix Laboratory
的合寫,它對矩陣運算之功能堪稱一流。由於使用矩陣描述問題更象數學運算式,所以編寫的程式不僅高效,更易讀。所以MATLAB程式應該盡量使用矩陣直接
描述。 如 M是一4X4的矩陣,則B=I*M就完成了使用兩個for迴圈編寫乘法的程式。
分析老師的[例3.1],那麼可以得到如下結果:
[(9+7)*1/2 (3+5)* 1/2 (9-7)*1/2 (3-5)* 1/2]
如果把其看作矩陣方式的乘法,那麼令 M為其表述求取平均和差值的係數矩陣,則輸入:
M = [
1/2 0 1/2 0
1/2 0 -1/2 0
0 1/2 0 1/2
0 1/2 0 -1/2
]
把上述的M輸入到MATLAB中,然後使用:
C=I*M
得到的結果就是 [ 8 4 1
-1]。這就是非正常化Haar小波的第一級分解係數。注意C的前兩項[ 8 4 ] 就是近似係數(Approximation
Coefficients), 後兩項[1 _1]就是細節係數(Detail Coefficients).
M就是Haar小波的非正常化(non-normalization)係數矩陣。如果我們執行 :
M*M_
(M_代表的是M的轉置矩陣),你會發現得到對角線為0.5其它為0的4X4矩陣,所以如果讓它變成單位矩陣(對角線為1),必須把原來的1/2增大,變為1/sqrt(2), 所以執行:
N=M*sqrt(2)
後得到新的係數矩陣
[ 0.7071 0 0.7071 0
0.7071 0 -0.7071 0
0 0.7071 0 0.7071
0 0.7071 0 -0.7071
]
再執行
N * N_
就會得到單位矩陣。N就是Haar小波的正常化(normalization)係數矩陣。現在執行:
C*M_
將得到 [4.5 3.5 1.5 2.5],顯然是因為M*M_的對角矩陣的值為0.5。現在使用
Cn=I*N
得到 [11.3137 5.6569 1.4142 -1.4142 ] 正常化的一維Haar小波一級分解係數。
I1=Cn*N_
得到 [9 3 7 7] 正常化的一維Haar小波逆變換(重構)結果。可見得到這樣正常化矩陣的好處是為了逆變換時不需要額外的運算,只是需要分解係數矩陣乘以正常化係數矩陣的轉置。
。
如果需要對分解係數矩陣進行第2級分解,那麼此時只對C或Cn的前2項的低頻係數進行,此時的Haar的非正常化與正常化係數矩陣M1和N1分別為:
M1=[
1/2 1/2
1/2