※この画面での入力する数値と大きさを変えることによって最適なフィルタを探します。
【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文を開始します。
図のようにある画像に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文を開始します。
最終的には下図にように青い領域がフィルタ処理されることになります。
<スクリプト>
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); } }
ノイズ軽減
左側が上記スクリプトを実行した画像です。右側のフィルタ処理をする前の原画像と比べるとフィルタがかかっていることがわかると思います。
ここで上下左右の端1ピクセルの輝度値が本当に変わっていないかピクセルの四角が見えるまで拡大して確認します。
赤枠の中はフィルタを書けたので原画像の輝度値とは変化しています。一方、赤枠の外にある端の輝度値は原画像と同じです。
赤枠の中はフィルタを書けたので原画像の輝度値とは変化しています。一方、赤枠の外にある端の輝度値は原画像と同じです。
したがって今回の処理では周囲の端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個のピクセルの平均輝度値が他の画像内のピクセルのみで計算された輝度値と比較して低くなります。
しかし、(-1,-1)、(-1,0)、(0, -1)など負の値をとる座標が出てきます。試しに(-1,-1)に対応する輝度値をgetPixel(-1,-1)で取得し出力すると0と出てきます。
これはImageJが画像にはない負の値をとる座標に対応する輝度値を0として処理していることを意味します。つまり下図のように上下左右の周囲1ピクセルに対応する輝度値をすべて0として処理しているのでこれらのピクセルを含む3x3の9個のピクセルの平均輝度値が他の画像内のピクセルのみで計算された輝度値と比較して低くなります。