スピードクエリに関しては、ソートを含まないため、疑似メディアンフィルターの方が高速であることを提案します。真の中央値フィルターでは、要素を並べ替えて中心値を見つける必要があり、これにはかなりの時間がかかります。
ごま塩ノイズが除去されない理由は、 and を使用するときに常に構造化要素内で最小値と最大値の両方を使用しているため、その効果を常に維持しているためimclose
ですimopen
。それぞれに半分の重みを付けているだけなので、白いピクセルがある場合、関数からの 0.5 係数の寄与max
によってピクセル値が上がり、黒いピクセルの場合はその逆になります。
編集:これは、疑似中央値が塩とコショウのノイズでもう少しうまく動作するのに役立つ簡単なデモです。大きな違いは、開いた画像と閉じた画像を戦わせるのではなく、それらの「最良の部分」を使用しようとすることです。例として使用したごま塩ノイズを除去するのに非常にうまく機能すると思います。
img = imread('cameraman.tif');
img = imnoise(img, 'salt & pepper', 0.01);
subplot(2,2,1); imshow(img);
b = strel('square', 3);
closed = double(imclose(img, b));
opened = double(imopen(img, b));
subplot(2,2,2); imshow(closed,[]);
subplot(2,2,3); imshow(opened,[]);
img = double(img);
img = img + (closed - img) + (opened - img);
subplot(2,2,4); imshow(img,[]);
編集:コードを実行した結果は次のとおりです。

編集 2:基礎となる理論は次のとおりです (過度に数学的ではなく、完全に直感に基づいています!)
ごま塩ノイズは、無作為に散在する純粋な白と純粋な黒のピクセルとして存在します。アイデアは、「閉じた」画像と「開いた」画像がそれぞれ半分の1 つ(白塩ノイズまたは黒コショウ ノイズ) を除去し、その位置のピクセル値を操作の 1 つによって修正する必要があるということです。どれかわかりません。だから私たちはそれを知っています'closed' と 'open' の両方からの画像のうちの 1 つは、そのピクセルに対して 'rect' です。これは、操作によって、そのピクセルが正しく 'median-ed' されているはずだからです。「正しくない」ものは、そのピクセル (白または黒) で元の画像とまったく同じ値を持つ必要があるため、その値を差し引いても元の画像には影響しません。「正しい」もの (画像を本来の正しい値に戻すのに必要な正確な量だけ異なる) だけが正しいので、そのピクセルの画像を対応する量だけ調整します。したがって、ノイズの多い元の画像を取り、それに両方の違いを追加すると、ノイズの多くが削減された画像が得られます。