X
ノイズの影響を受けた画像を表すマトリックスがあります。M
また、ノイズの影響を受けたピクセルを表すブール行列もあります。私がやりたいことは、すべての「破損した」ピクセルをその8つの隣接ピクセルの平均に設定することです。
破損したピクセルは常に破損していないピクセルに囲まれていることが保証されており、画像の境界のピクセルも破損していません。これのベクトル化されたバージョンを作成するには、どの関数を使用できますか?
あなたの状況では、これは非常に高速に実行されるはずです
fixed = conv2 (image, [1 1 1; 1 0 1; 1 1 1]/8, "same")
# mask is a logical matrix for the corrupted pixels
image(mask) = fixed(mask)
説明:関数で平均フィルターが実行されconv2
ます。ピクセルとその近傍の平均を計算するために使用されるカーネルはones (3) / 9
、各ピクセル値の 1/9 を使用して新しい値を計算することを意味します。中央のピクセルを平均にカウントしたくないので、その値を (カーネルで) 0 にし、その他の値を 1/8 にします。
これはおそらく最も効果的な解決策ではありませんが、うまくいくはずです。
N = size(M, 1);
target_ind = find(M);
offset = [-N-1, -N, -N+1, -1, 0, 1, N-1, N, N+1];
area_ind = bsxfun(@plus, offset, target_ind);
X(target_ind) = median(X(area_ind), 2);
破損したピクセルはすべてピクセルに囲まれていることが保証されているため、破損した各ピクセルの隣接ピクセルの線形インデックスを簡単に計算できます。ここでX
は、グレースケール画像であると想定しています。
I
複数のチャネルがある
場合は、各チャネルをループしてtarget_ind
、area_ind
毎回オフセットを追加できます。
for i = 1:size(X, 3)
chan_offset = (i - 1)*size(X, 1)*size(X, 2) % Add the number of elements in previous channels to get indices in the current channel
X(target_ind + chan_offset) = median(X(area_ind + chan_offset), 2);
end