0

イメージをぼかす関数を Matlab で作成しようとしています。私はMatlabsのデモ画像を使用していますpeppers.png

これが私の機能です:

    function g = myfilter(f, h)

    f = double(f); %convert to double
    g = zeros(size(f)); %new array (size of f)
    a = (size(h, 1) - 1) / 2; %padding on edges

    for row = (a + 1) : (size(f,1) - a)
        for col = (a + 1) : (size(f,2) - a)

            gxy = 0; %running sum

            for m = -a:a
                for n = -a:a

                    gxy = gxy + f(row - m, col - n) + h(m + a+1, n + a+1);
                end
            end

            g(row, col) = gxy;
        end
    end

    g = uint8(g); %convert back to int

ここに私のコマンドがあります:

    >> img = imread('peppers.png');
    >> imshow(img)
    >> imgGray = rgb2gray(img);
    >> imshow(imgGray)
    >> 
    >> filt1 = (1/9)*ones(3)

       filt1 =

        0.1111    0.1111    0.1111
        0.1111    0.1111    0.1111
        0.1111    0.1111    0.1111

   >> test = myfilter(imgGray, filt1);
   >> imshow(test)

カラー画像をグレーに正常に変換し、フィルターを適用します。

残念ながら、フィルターはほぼ完全な白い画像 (明るすぎる) を作成するだけです...理由がわかりません... 3x3 フィルターを使用して各ピクセルの平均を取得する必要があります...なぜこれが起こっているのですか?

4

2 に答える 2

2

MATLAB の conv2 関数を確認する必要があります。次の 2D 畳み込み関数は conv2 から抽出されたもので、特定のフィルターでうまく機能します。

function c = myfilter(a, b)
 [ma, na] = size(a);
 [mb, nb] = size(b);
c = zeros( ma+mb-1, na+nb-1 );
    for i = 1:mb
        for j = 1:nb
            r1 = i;
            r2 = r1 + ma - 1;
            c1 = j;
            c2 = c1 + na - 1;
            c(r1:r2,c1:c2) = c(r1:r2,c1:c2) + b(i,j) * a;
        end
    end
c = uint8(c)
于 2013-02-05T19:10:39.080 に答える
0

単純な算術タイプ。

gxy = gxy + f(row-m, col-n) + h(m+a+1, n+a+1);

する必要があります:gxy = gxy + f(row-m, col-n) * h(m+a+1, n+a+1);

正常に動作し、ぼやけた画像を作成します。

fとを乗算する代わりにh、2D畳み込みによって定義された空間ドメイン画像フィルターに準拠していない上記のコードで合計されていました。Matlabは関数を正しく実行していましたが、フィルターが別の算術演算子で正しく機能したにもかかわらず、異常(または予期しない結果)が発生しました。

問題が解決しました。

于 2013-02-05T19:58:00.623 に答える