7

を使用せずに画像をフィルタリングしようとしていimfilterます。と同じ結果が得られるはずですが、異なる結果が得られimfilter続けます。誰かが私がどこで間違ったのか教えてもらえますか?

orignal=imread('obj6__17.png');
filter=1/9*[-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s=size(orignal);
r=zeros(s(1));
temp = zeros(3);

for i= 2: s(1)-1
for j = 2: s(2)-1

    for n= 1: 3
        for m= 1:3
            temp(n,m)=orignal(i+2-n,j+2-m)*filter(n,m);
        end
    end
    r(i,j)=sum(single(sum(temp)));
end
end
4

2 に答える 2

7

のサイズはrオリジナルと同じだと思います。また、を使用して単精度に変換する理由がわかりませんsingle。とにかく、私はあなたが次のことをしたいと思います:

%# Let's first create a small test image from the built-in peppers image
original = im2double(imread('peppers.png'));
original = original(1:5,1:8,1);

filter = 1/9 * [-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s = size(original);
r = zeros(s);

for i = 2:s(1)-1
    for j = 2:s(2)-1
        temp = original(i-1:i+1,j-1:j+1) .* filter;
        r(i,j) = sum(temp(:));
    end
end

結果は次のとおりです。

r =

         0         0         0         0         0         0         0         0
         0    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344         0
         0    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240         0
         0    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436         0
         0         0         0         0         0         0         0         0

そしてimfilter、それは次のとおりです。

r2 = imfilter(original, filter)

r2 =

    0.3778    0.3325    0.3307    0.3442    0.3516    0.3312    0.3163    0.3856
    0.3298    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344    0.3386
    0.3434    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240    0.3512
    0.3272    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436    0.3643
    0.3830    0.3181    0.3329    0.3403    0.3508    0.3272    0.3412    0.4035

ご覧のとおり、結果は境界線上の結果を除いて同じです。画像を境界線の外側にミラーリングする、同じ状態に保つなど、境界線上のものを計算するためのいくつかの戦略があります。のドキュメントを読んで、imfilter1つの戦略を選択してください。

filterフィルタは両方向に対称であるため、ここでは反転しなかったことに注意してください。そして、ループを避けることをお勧めします!コードには深さ4のネストされたループがあります!

最後に、2次元畳み込みを使用して、次と同じことを行うことができますimfilter

r3 = conv2(original, filter, 'same');

r3 =

    0.3778    0.3325    0.3307    0.3442    0.3516    0.3312    0.3163    0.3856
    0.3298    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344    0.3386
    0.3434    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240    0.3512
    0.3272    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436    0.3643
    0.3830    0.3181    0.3329    0.3403    0.3508    0.3272    0.3412    0.4035
于 2012-05-20T12:08:32.483 に答える
0

これはコードを変更し、imfilterとまったく同じ結果をもたらします。

%# Let's first create a small test image from the built-in peppers image
original = im2double(imread('peppers.png'));
original = original(1:5,1:8,1);

filter = 1/9 * [-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s = size(original);
r = zeros(s);
original=padarray(original,[1,1]);
for i = 2:s(1)
for j = 2:s(2)
    temp = original(i-1:i+1,j-1:j+1) .* filter;
    r(i-1,j-1) = sum(temp(:));
end
end

これにより、関数とまったく同じ結果行列が得られます。

于 2014-01-24T14:13:23.833 に答える