以下の例では、画像の内側にあるピクセルのみを考慮する方法でエッジのピクセルを扱います。たとえば、プログラムがカーネル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