Main Content

ノイズ除去

デジタル イメージではさまざまなノイズが発生しがちです。ノイズはイメージの作成過程で発生したエラーの結果であり、実際の被写体の本当の強度を反映しないピクセル値です。イメージの作成方法によって異なりますが、イメージにノイズが混入される原因にはいくつかあります。次に例を示します。

  • イメージがフィルム上の写真からスキャンされる場合、フィルムの粒子がノイズ源になります。フィルムのキズもノイズの原因になります。スキャナ自身がノイズの発生源になる場合もあります。

  • イメージが直接デジタル形式で収録される場合、データの収集 (たとえば、CCD カメラ) 機能がノイズの発生源になります。

  • イメージ データの電気的な送信でもノイズが混入します。

また、上記の問題の影響をシミュレーションするために、ツールボックスには各種のノイズを "付加" できる関数 imnoise が含まれています。ここで紹介する例では、この関数が使用されます。

線形フィルター処理によるノイズの除去

線形フィルターを使用して除去できるノイズがあります。平均化フィルターまたはガウス フィルターのようなフィルターは、この目的に適しています。たとえば、平均化フィルターは、写真から粒子ノイズを除去するときに役立ちます。各々のピクセルが、その近傍の中のピクセルの平均で設定されているので、粒子が原因となる局所的な変動が減少します。

関数 imfilter を使用する線形フィルター処理方法の詳細については、空間領域でのイメージのフィルター処理とはを参照してください。

平均化フィルターとメディアン フィルターを使用したノイズの除去

この例では、比較のために平均化フィルターとメディアン フィルターを使用してイメージから「ごま塩ノイズ」を除去する方法を説明します。この 2 種類のフィルター処理はいずれも出力ピクセルの値を、対応する入力ピクセルの近傍の平均ピクセル値に設定します。しかし、メディアン フィルター処理を使うと、出力ピクセルの値は、平均ではなく、近傍の "中央値" になります。中央値は、平均に比べて "外れ値" にあまり敏感ではありません。メディアン フィルター処理は、イメージの鮮明さを劣化させないで、これらの外れ値を取り除くことができます。

メモ: メディアン フィルター処理は順序付き統計フィルター処理の特殊なケースで、ランク フィルター処理とも呼ばれます。順序付き統計フィルター処理の詳細については、関数 ordfilt2 のリファレンス ページを参照してください。

イメージをワークスペースに読み取って表示します。

I = imread('eight.tif');
figure
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

この例では、イメージにごま塩ノイズを付加します。この種のノイズは、黒と白 (そのデータ範囲での外れ値) がピクセルにランダムに設定されたものです。

J = imnoise(I,'salt & pepper',0.02);
figure
imshow(J)

Figure contains an axes object. The axes object contains an object of type image.

ノイズを含むイメージ J に平均化フィルターを適用し、結果を表示します。この例では 3 行 3 列の近傍を使用しています。

Kaverage = filter2(fspecial('average',3),J)/255;
figure
imshow(Kaverage)

Figure contains an axes object. The axes object contains an object of type image.

次は、メディアン フィルターを使用してノイズを含むイメージ J をフィルター処理します。この例でも 3 行 3 列の近傍を使用します。フィルター処理された 2 つのイメージを並べて表示し、比較します。medfilt2 の方が、コインのエッジのボケが少なく、ノイズの除去に優れています。

Kmedian = medfilt2(J);
imshowpair(Kaverage,Kmedian,'montage')

Figure contains an axes object. The axes object contains an object of type image.

適応フィルター処理によるノイズの除去

この例では、関数 wiener2 を使用して、ウィーナー フィルター (線形フィルターの 1 種) を適応的にイメージに適用します。ウィーナー フィルターはイメージの局所分散に適応します。分散が大きい部分では、wiener2 はあまり平滑化を行いません。分散が小さい部分では、wiener2 は、さらなる平滑化を行います。

この手法は、しばしば線形フィルター処理よりも良い結果を出します。適応フィルターは、同種の線形フィルターよりも選択的で、イメージのエッジやその他の高周波数部を維持できます。さらに、設計の手間がかかりません。関数 wiener2 は、すべての予備的な計算を実行して、入力イメージに対するフィルターを実装します。ただし、wiener2 は線形フィルターよりも計算に時間がかかります。

wiener2 は、ノイズがガウス ノイズのような一定パワー ("ホワイト") の加法性ノイズの場合、最も効率よく機能します。次の例では、ガウス ノイズを付加した土星のイメージに wiener2 を適用します。

イメージをワークスペースに読み取ります。

RGB = imread('saturn.png');

イメージをトゥルーカラーからグレースケールに変換します。

I = im2gray(RGB);

ガウス ノイズをイメージに付加します。

J = imnoise(I,'gaussian',0,0.025);

ノイズを含むイメージを表示します。イメージがかなり大きいので、イメージの一部のみを表示します。

imshow(J(600:1000,1:600));
title('Portion of the Image with Added Gaussian Noise');

Figure contains an axes object. The axes object with title Portion of the Image with Added Gaussian Noise contains an object of type image.

関数 wiener2 を使用してノイズを除去します。

K = wiener2(J,[5 5]);

処理後のイメージを表示します。イメージがかなり大きいので、イメージの一部のみを表示します。

figure
imshow(K(600:1000,1:600));
title('Portion of the Image with Noise Removed by Wiener Filter');

Figure contains an axes object. The axes object with title Portion of the Image with Noise Removed by Wiener Filter contains an object of type image.

参考

| | | | |

関連するトピック