2017年2月17日 更新

シリーズ6.マクロ言語を使った画像処理の応用編~ノイズ軽減① 空間フィルタ処理~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。 今回の記事から応用編としてさらに詳しく画像処理を学んでいきます。最初のテーマはノイズ軽減です。

9,093 view お気に入り 0
※この画面での入力する数値と大きさを変えることによって最適なフィルタを探します。

【ImageJ マクロ言語で記述してみましょう】

ここではMeanでフィルタ処理を行うスクリプトをマクロで記述することを考えてみます。画像の原点(左上)から右下に向かって3x3のカーネルを使って9ピクセルずつ輝度値を読み込みその平均値で中央の輝度値を置き換えればよいことになります。
 図のようにある画像に3x3のカーネルを設計しフィルタをかけるとします。本来は画像の端を複製するなどの対策をとる必要がありますが、ここでは上下左右の端1ピクセルについてはフィルタをかけないとします。最初は(0,0)、(0,1)、(0,2)、(1,0)、(1,1)、(1,2)、(2,0)、(2,1)、(2,2)の9個の座標に対応する輝度値を読み込みその平均値を計算します。そしてその平均値が図の青い四角で示した中央の輝度値と置き換えられます。この操作をx座標とy座標を1ずつ増やしていくことにより右下に向かってfor文を用いて繰り返します。図に示した位置から計算が始まるようにx=1、y=1でfor文を開始します。
 (3213)

最終的には下図にように青い領域がフィルタ処理されることになります。
 (3215)

<スクリプト>

width=getWidth();
height=getHeight();
N=2*1+1;//カーネルの大きさN=2n+1, nは任意の数値に変更可。この場合は3x3のカーネル
intensity=0;

run("32-bit");
for(y=1;y<height;y++){
        for(x=1; x<width;x++){ 
                        
intensity=(getPixel(x-1,y-1)
+getPixel(x,y-1)
+getPixel(x+1,y)
+getPixel(x-1,y)
+getPixel(x,y)
+getPixel(x+1,y)
+getPixel(x+1,y+1)
+getPixel(x, y+1)
+getPixel(x+1, y+1))
/(N*N);                
                        setPixel (x,y, intensity); 
                        
                }
        }
ノイズ軽減
左側が上記スクリプトを実行した画像です。右側のフィルタ処理をする前の原画像と比べるとフィルタがかかっていることがわかると思います。
 (3219)

ここで上下左右の端1ピクセルの輝度値が本当に変わっていないかピクセルの四角が見えるまで拡大して確認します。
赤枠の中はフィルタを書けたので原画像の輝度値とは変化しています。一方、赤枠の外にある端の輝度値は原画像と同じです。
 (3221)

したがって今回の処理では周囲の端1ピクセル分はフィルタ処理がかかっていないことが確認できました。
 ではここでもしx=0、y=0として上記のスクリプトを実行すると結果がどうなるのか考えてみましょう。x=0、y=0でfor文を書きなしてもスクリプトは動きます。

 しかし、(-1,-1)、(-1,0)、(0, -1)など負の値をとる座標が出てきます。試しに(-1,-1)に対応する輝度値をgetPixel(-1,-1)で取得し出力すると0と出てきます。
これはImageJが画像にはない負の値をとる座標に対応する輝度値を0として処理していることを意味します。つまり下図のように上下左右の周囲1ピクセルに対応する輝度値をすべて0として処理しているのでこれらのピクセルを含む3x3の9個のピクセルの平均輝度値が他の画像内のピクセルのみで計算された輝度値と比較して低くなります。
 (3224)

48 件

関連する記事 こんな記事も人気です♪

シリーズ5.ImageJマクロ言語を用いた画像解析~マクロ言語のまとめ2~

シリーズ5.ImageJマクロ言語を用いた画像解析~マクロ言語のまとめ2~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。 今回の記事ではImageJのユーザー定義関数について学んでいきます。
シリーズ4.ImageJマクロ言語を用いた画像解析~②二値化処理-3~

シリーズ4.ImageJマクロ言語を用いた画像解析~②二値化処理-3~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。
ImageJ まとめ

ImageJ まとめ

「このページを見れば,ImageJ のこと全てが解決する」をモットーに,日々更新を行っています.
シリーズ5.ImageJマクロ言語を用いた画像解析~マクロ言語のまとめ~

シリーズ5.ImageJマクロ言語を用いた画像解析~マクロ言語のまとめ~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。
画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換の最終回として、pythonによるフィルタ設定についてご紹介します。

この記事のキーワード

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部