matlab練習程序(圖像Haar小波變換)


關於小波變換我只是有一個很朴素了理解。不過小波變換可以和傅里葉變換結合起來理解。

傅里葉變換是用一系列不同頻率的正余弦函數去分解原函數,變換后得到是原函數在正余弦不同頻率下的系數。

小波變換使用一系列的不同尺度的小波去分解原函數,變換后得到的是原函數在不同尺度小波下的系數。

不同的小波通過平移與尺度變換分解,平移是為了得到原函數的時間特性,尺度變換是為了得到原函數的頻率特性。

小波變換步驟:

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

http://www.cs.ucf.edu/~mali/haar/

http://wenku.baidu.com/view/7839b821aaea998fcc220eed.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM