我的任务
1. 我有一个 haar 过滤器,例如 [1][-1]
2. 我有一个图像,例如
- - [a][b][c][d]
- - [e][f][g ][h]
3. 我想对图像进行小波变换,得到以下结果:
- - 第 1 步:
- - - [mean(a,b)][mean(c,d)][ab][ cd]
- - - [mean(e,f)][mean(g,h)][ef][gh]
- - 重命名:--- 只是为了清晰的呈现
- - - [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
这就是我正在做的,有没有更简单的方法?