Haar小波(代码)

来源:互联网 发布:大数据技术入门 编辑:程序博客网 时间:2024/05/16 01:36

Haar wavelet Code

包括Haar小波变换以及其逆变换

clear all;clc;%prepare imageoriginalimage = imread('lena.bmp');grayimage = rgb2gray(originalimage);image = double(grayimage);[n,m] = size(image);%lena 512*512max = log2(n);cycle = 2;%进行变换的次数.for count1=1:1:cycle    a = [];%average    d = [];%detail    temp_a = [];    temp_d = [];    for count2=1:1:n/2^count1        %column        %因为正交归一,有1/sqrt(2)        temp_a = (image(1:1:n/2^(count1-1),(count2-1)*2 + 1) + image(1:1:n/2^(count1-1),2*count2))/sqrt(2);         temp_d = (image(1:1:n/2^(count1-1),(count2-1)*2 + 1) - image(1:1:n/2^(count1-1),2*count2))/sqrt(2);         a = [a temp_a];        d = [d temp_d];    end    image(1:1:n/2^(count1-1),1:1:n/2^(count1-1)) = [a d];%改变低频部分,当count1 = 1时,改变所有    a = [];    d = [];    temp_a = [];    temp_d = [];    for count2=1:1:n/2^count1        %row        %因为有正交归一,有1/sqrt(2)        temp_a = (image((count2-1)*2 + 1,1:1:n/2^(count1-1)) + image(count2*2,1:1:n/2^(count1-1)))/sqrt(2);        temp_d = (image((count2-1)*2 + 1,1:1:n/2^(count1-1)) - image(count2*2,1:1:n/2^(count1-1)))/sqrt(2);        a = [a;temp_a];        d = [d;temp_d];    end    image(1:1:n/2^(count1-1),1:1:n/2^(count1-1)) = [a;d];endfigure;imshow(image,[]);title('Haar tranformation')%逆变换 故先行后列for count1 = cycle:-1:1    temp_a0 = [];%V1(2x)    temp_a1 = [];%V1(2x-1)    temp = [];    for count2 = 1:1:n/2^count1        %column        %因为有正交归一,有1/sqrt(2)        temp_a0 = (image(count2,1:1:n/2^(count1-1))+image(count2+n/2^count1,1:1:n/2^(count1-1)))/sqrt(2);        temp_a1 = (image(count2,1:1:n/2^(count1-1))-image(count2+n/2^count1,1:1:n/2^(count1-1)))/sqrt(2);        temp = [temp;temp_a0;temp_a1];    end    image(1:1:n/2^(count1-1),1:1:n/2^(count1-1)) = temp;    temp_a0 = [];%V1(2x)    temp_a1 = [];%V1(2x-1)    temp = [];    for count2 = 1:1:n/2^count1        %column        %因为有正交归一,有1/sqrt(2)        temp_a0 = (image(1:1:n/2^(count1-1),count2)+image(1:1:n/2^(count1-1),count2+n/2^count1))/sqrt(2);        temp_a1 = (image(1:1:n/2^(count1-1),count2)-image(1:1:n/2^(count1-1),count2+n/2^count1))/sqrt(2);        temp = [temp temp_a0 temp_a1];    end    image(1:1:n/2^(count1-1),1:1:n/2^(count1-1)) = temp;endfigure;imshow(image,[]);title('Haar inverse')

效果图

分解两次

这里写图片描述

还原

这里写图片描述

0 0
原创粉丝点击