Matlab Haar Wavelet

时间:2013-07-24 06:15:51

标签: matlab haar-wavelet

我的任务

我有一个haar过滤器,如[1] [ - 1]
我有像这样的图像   - - [a] [b] [c] [d]
  - - [e] [f] [g] [h]
3.我想对图像进行小波变换,结果如下:
  - - 步骤1:
  - - - [mean(a,b)] [mean(c,d)] [a-b] [c-d]
  - - - [mean(e,f)] [mean(g,h)] [e-f] [g-h]
  - - 重命名:---只是为了一个清晰的介绍
  - - - [a'] [b'] [c'] [d']
  - - - [e'] [f'] [g'] [h']
  - - 步骤2:
  - [ - [mean(a',b')] [a'-b'] [c'] [d']
  - - - [mean(e',f')] [e'-f'] [g'] [h']
4.步骤2的结果是我想要的。

问题
我发现Matlab中有一个关于小波应用的工具箱 我使用了这个命令[cA,cH,cV,cD] = dwt2(I,'haar');输出cV接近但不是我想要的 所以我想问一下,如何在Matlab中以简单的方式执行我的任务,这意味着我可以使用一些内置工具来执行此任务。

我的方式

function haar_wavelet(input_im)
I = imread(input_im);
I = rgb2gray(I);
I = imresize(I,[512 512]);
[I_row,I_col]=size(I);

if(mod(I_col,2))
    I_col=I_col-1;
end

haar_mask = make_haar(I_row,I_col);

I=double(I);

new_M = I(:,1:I_col);

j=2;
i=I_col;
while(I_col/j ~= 2)
    i = [i I_col/j];
    j = j*2;
end

for k = i
    new_M(:,1:k) = my_haar_trans(new_M(:,1:k),haar_mask(:,1:k));
end
figure
imshow(new_M)


end


function [output_haar] = make_haar(row,col)
    output_haar=ones(row,col)*2;
    for i = 2:2:col
        output_haar(:,i)=output_haar(:,i)*0;
    end
    output_haar=output_haar-1;
end

function [output_M] = my_haar_trans(target_M,mask)
    temp_diff=target_M.*mask;
    [diff_row,diff_col]=size(temp_diff);

    diff_M=zeros(diff_row,diff_col/2);
    for i = 1:diff_col/2
        diff_M(:,i)=temp_diff(:,2*i-1)+temp_diff(:,2*i);
    end

    mean_M=zeros(diff_row,diff_col/2);
    for i = 1:diff_col/2
        mean_M(:,i)=target_M(:,2*i-1)+target_M(:,2*i);
    end

    output_M=[mean_M diff_M];
end

这就是我在做什么,有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

如你所说,有一个内置的matlab代码来执行1D和2D小波变换。例如在2D Haar小波情况下,它是[cA,cH,cV,cD] = dwt2(I,'db1')。这正是你想要的。你也可以根据小波分解框图编写自己的函数。要注意,对于小尺寸的矢量,输出必须相同,但对于像图像这样的大尺寸矢量可能有一些残差。