2

始める前に、画像をフィルタリングするためにカーネルと conv2() 関数を使用する方法を理解していることを明確にしたいと思いますが、各ピクセルを呼び出して手動でこれを行う必要があります。

ここでの私の目標は、カーネルや conv2() を使用せずに、各ピクセルを呼び出し、その近傍を見つけて平均化し、以前の値を取得した平均値に置き換えることです。私はこれまで、各ピクセルの隣人を見つけようとしました

for
   I = 1:512;
     for
        J = 1:683;
A = myimage;
neighbor_offsets = [-1, A, 1, -A, A + 1, -A + 1, -A-1, A - 1];
idx = [I J];
neighbors = bsxfun(@plus,idx,neighbor_offsets);

しかし、うまくいかないようで、修正しようとして少し迷っています。のようなものを使用して隣人を取得できれば、仕事を終えることができたと思います

sum(neighbors) / 9

次に、以前の値をその回答に置き換えますが、そうであれば修正してください。私は、お粗末な質問をする傾向がありますので、不明な点があればお知らせください。ありがとう

4

1 に答える 1

1

以下の例では、画像の内側にあるピクセルのみを考慮する方法でエッジのピクセルを扱います。たとえば、プログラムがカーネルdy = (-1:1)dx = (-1:1)左上隅で平均を計算している場合、左上隅とそのすぐ隣の 3 つのピクセル (右、右下、右) のみを考慮し、それら 4 つのピクセルの平均を計算します。

Matlab のコマンド ウィンドウですべての行を個別にテストして、その動作を確認することを強くお勧めします。

% find image size
imsz = size( myimage );

% initialize output image
imavg = zeros( imsz );

% iterate over pixels
for yy = 1 : imsz(1)
    for xx = 1 : imsz(2)

        % define rectangle-kernel width
        dy = (-1:1);    % 1 up, to 1 down and ...
        dx = (-1:1);    % 1 left, to 1 right from current pixel

        % get indexes of image
        indy = yy + dy;
        indx = xx + dx;

        % [!!!] keep indexes that are inside image
        indy = indy( indy>0 & indy<=imsz(1) );
        indx = indx( indx>0 & indx<=imsz(2) );

        % create all the pairings of chosen indexes
        [ IY, IX ] = meshgrid( indy, indx );

        % take all values of chosen pixels
        pixs = myimage( sub2ind(imsz,IY(:),IX(:)) );

        % save mean of chosen pixels to the given location
        imavg(yy,xx) = mean( pixs );
    end
end

mean_filter.m次の内容のファイルを作成して、上記のコードから関数を作成できます。

function imagv = mean_filter( myimage )

    % code from above ...

コマンド ウィンドウから関数を呼び出すには、その関数があるディレクトリに移動して を実行しfiltered = mean_filter( myimage );ます。


次の方法で、同じ画像を繰り返しフィルタリングできます。

filtered_3_times = myimage;
for ii = 1 : 3
    filtered_3_times = mean_filter( filtered_3_times );
end
于 2013-06-14T15:06:10.220 に答える