0

私のタスク

1. [1][-1] のような haar フィルタがあります
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:
- - - [平均(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

これは私がやっていることですが、もっと簡単な方法はありますか?

4

1 に答える 1

0

あなたが言ったように、1Dおよび2Dウェーブレット変換を実行するための組み込みのmatlabコードがあります。たとえば、2D Haarウェーブレットの場合、[cA、cH、cV、cD] = dwt2(I、'db1')です。これはまさにあなたが望むものです.また、ウェーブレット分解ブロック図に基づいて独自の関数を書くこともできます.小さなサイズのベクトルの出力は同じでなければならないことに注意してください.

于 2015-04-10T08:16:06.187 に答える