關於小波變換我只是有一個很朴素了理解。不過小波變換可以和傅里葉變換結合起來理解。
傅里葉變換是用一系列不同頻率的正余弦函數去分解原函數,變換后得到是原函數在正余弦不同頻率下的系數。
小波變換使用一系列的不同尺度的小波去分解原函數,變換后得到的是原函數在不同尺度小波下的系數。
不同的小波通過平移與尺度變換分解,平移是為了得到原函數的時間特性,尺度變換是為了得到原函數的頻率特性。
小波變換步驟:
1.把小波w(t)和原函數f(t)的開始部分進行比較,計算系數C。系數C表示該部分函數與小波的相似程度。
2.把小波向右移k單位,得到小波w(t-k),重復1。重復該部知道函數f結束.
3.擴展小波w(t),得到小波w(t/2),重復步驟1,2.
4.不斷擴展小波,重復1,2,3.
我這里使用的haar小波,縮放函數是[1 1],小波函數是[1 -1]。是最簡單的小波了。
先看看分解的效果,這次我選用了大圖:
尺度為2的全分解小波包:
下面是matlab代碼:
main.m
clear all; close all; clc; img=double(imread('Lena (2).jpg')); [m n]=size(img); [LL LH HL HH]=haar_dwt2D(img); %當然dwt2(img,'haar')是一樣的,我只是想明白細節 img=[LL LH;HL HH]; %一層分解 imgn=zeros(m,n); for i=0:m/2:m/2 for j=0:n/2:n/2 [LL LH HL HH]=haar_dwt2D(img(i+1:i+m/2,j+1:j+n/2)); %對一層分解后的四個圖像分別再分解 imgn(i+1:i+m/2,j+1:j+n/2)=[LL LH;HL HH]; end end imshow(imgn)
haar_dwt2D.m
function [LL LH HL HH]=haar_dwt2D(img) [m n]=size(img); for i=1:m %每一行進行分解 [L H]=haar_dwt(img(i,:)); img(i,:)=[L H]; end for j=1:n %每一列進行分解 [L H]=haar_dwt(img(:,j)); img(:,j)=[L H]; end %本來分解不應該加mat2gray的,不過為了有好的顯示效果就加上了 LL=mat2gray(img(1:m/2,1:n/2)); %行列都是低頻 LH=mat2gray(img(1:m/2,n/2+1:n)); %行低頻列高頻 HL=mat2gray(img(m/2+1:m,1:n/2)); %行高頻列低頻 HH=mat2gray(img(m/2+1:m,n/2+1:n)); %行列都是高頻 end
haar_dwt.m
function [L H]=haar_dwt(f) %顯然,我沒有做邊界處理,圖片最好是2^n*2^n型的 n=length(f); n=n/2; L=zeros(1,n); %低頻分量 H=zeros(1,n); %高頻分量 for i=1:n L(i)=(f(2*i-1)+f(2*i))/sqrt(2); H(i)=(f(2*i-1)-f(2*i))/sqrt(2); end end
參考:
http://amath.colorado.edu/courses/5720/2000Spr/Labs/Haar/haar.html