これはモードフィルタと呼ばれ、各ピクセルを隣接ピクセルのモード(または最も一般的な値)で置き換えるためです。
イメージ処理ツールボックスをお持ちの場合は、colfilt
を使用してこのタイプのフィルタリングを簡単に実行できます。指定されたサイズの近傍に、指定された関数が適用されます。
output = colfilt(data, [5 5], 'sliding', @mode)
更新
あなたが縁でゼロパディングのすべてに対処しないようにしたい場合は、フィルタリングを実行し、その後、それぞれの側にパディングの3つのピクセルを適用するためにpadarray
を使用することができ、すべてのエッジから余分な3ピクセルを削除します。
% Pad with replicates of the data
data = padarray(data, [3 3], 'replicate', 'both');
% Perform the filtering
new = colfilt(data, [5 5], 'sliding', @mode);
% Crop out the padding part
new = new(4:end-3,4:end-3);
あなたは次の関数を使用することができn
サイズのカーネルにこれを一般化したい場合:
function out = mode_filter(data, n)
pad_size = ceil(n/2);
% Pad with replicates of the data
data = padarray(data, [pad_size, pad_size], 'replicate', 'both');
% Perform the filtering
out = colfilt(data, [n n], 'sliding', @mode);
% Crop out the padded part
out = out((pad_size + 1):(end - pad_size), (pad_size + 1):(end - pad_size));
end
これはほぼ完璧です。私がこのソリューションで抱える唯一の問題は、 'colfilt'の実装がエッジを0パッドで埋めて、その結果として場所の画像を壊すということです。私はMatlabの経験は限られていますが、画像の境界線を埋める方法を知っていますが、元の境界線を処理するだけで、0パディングの影響を避けることができますか? – sherrellbc
@ sherrellbc私は、パディングを追加して削除してより良い結果を得る方法を追加しました。 – Suever