C言語による画像処理入門:ノイズ除去処理

1.画像のノイズ除去

入力された画像のノイズを除去するために、画像にフィルタ処理を行います。フィルタ処理とは、画像の中に含まれている不要なものを取り除き、 必要な情報だけ取り出す処理のことです。

下図のノイズ無の画像とノイズ有の画像を見比べてください。ノイズの特徴としては、全体的に見た色に比べてその画素が外れた値を取っていると言えます。そのため、ノイズを除去するためには、注目画素だけでなくその周囲の画素を参照することが重要になります。

図1 元画像(ノイズ無)
図2 元画像(ノイズ有)

ノイズを除去する方法として、ここでは移動平均フィルタとメディアンフィルタを例に挙げます。

移動平均フィルタ(別名:平均化フィルタ、平滑化フィルタ)では、注目画素の周辺画素の強度値を用いて、強度値を平均し、処理後画像の注目画素の強度値とする手法です。

移動平均フィルタはローパスフィルターで、画像の前処理手法としてよく使われています。移動平均フィルタでは、ノイズを除去しているが、画像の輪郭もボケてしまう欠点があります。

一方、ノイズ除去に良く使われている手法として、メディアンフィルタが挙げられます。メディアンフィルタは、注目画素の周辺画素の強度値の大きさを順に並べ、メディアン(中央値)を注目画素の強度値に置き換える手法です。中央値には、各画素の強度を並び替え(ソート)して最も順位が中間にある強度をそのままの数値で用います。

移動平均フィルタに比べ、メディアンフィルタでは、画像の輪郭のボケが少ない利点があります。

図3 処理結果 (移動平均3×3)
図4 処理結果 (移動平均5×5)
図5 処理結果 (移動平均7×7)

図6 処理結果 (メディアン3×3)
図7 処理結果 (メディアン5×5)

2.原理方法(移動平均フィルタ)

(1)main.c の適当なところに下記を追加
    printf("11. 移動平均フィルタ\n");

(2)main.c の switch(select) 関数に下記を追加
 // 移動平均フィルタ
 case 11 :
   printf("入力画像を移動平均フィルタ処理します。\n");
   moving_average(image); // 画像をフィルタサイズ1で移動平均する
   break;

(3)image.c に void moving_average( Image image) 関数を追加
    void moving_average()

(4)サンプル画像 ダウンロード:  towerf_noise.bmp  

3.原理方法(メディアンフィルタ)

(1)main.c の適当なところに下記を追加
    printf("12. メディアンフィルタ\n");

(2)main.c の switch(select) 関数に下記を追加
 // メディアンフィルタ
 case 12 :
   printf("入力画像をメディアンフィルタ処理します。\n");
   median(image); // 画像をフィルタサイズ1でメディアンフィルタする
   break;

 (3)image.c に void median( Image image) 関数を追加
     void median()

課題:

(1)フィルタサイズ1(3×3画素)の移動平均フィルタおよびメディアンフィルタを1回ではなく複数回(2回、3回等)処理し、その結果を比較してください。

(2)フィルタサイズを(3×3画素)から(5×5画素)、(7×7画素)に拡張して処理し、結果を比較してください。
   要求:
   (a)「//フィルタ内の強度値の合計を計算」および「//値をソート用バッファにコピー」の際に、for()ループを使用すること。
   (b)フィルタサイズが外部入力により変更できること。
   (b)出力ファイル名にフィルタサイズを反映すること。

(3)画像の最初及び最後などの行と列のフィルタ処理を行うこと。

(4)デジタル信号処理で勉強したフィルタの知識を用いて、上記の問題を考察してください。