【Python講座9】 Pythonで画像処理

Pythonは分かり易い形式で書くことが出来るので、プログラミングが初めてな方でもとっつき易いと言われていて、最近では統計処理のような分野でも注目されてきています。

目次

これまでは、調べる画像がどんな特徴を持っているかを調べ、その特徴量を調べてきました。

今回は、Pythonで最小値を画像全体から減算するという処理を行います。例えば、最小値が5で、最大値が120だったとすると、全体から5を引くので、最大値が115となります。値の大きさが明るさに対応している場合は、やや暗くなりますね。

今回はチュートリアルの中のSubtract min valueを中心に見ていきます。

まず、 1行目から順番に見ていきます。

IJ.getImage()でImageJの中でアクティブになっている画像情報を取得します。
これをimp(image plus)に代入(=)します。
impの段階では、まだ2次元の画像が何枚も積まれている状態なので、impの中から現在表示している1枚の平面画像を取得し、これをip(image processor)とします。

積まれている画像データ(imp)の中から扱う一枚のデータ(ip)を取り出すイメージ
getProcessorで表示している画像情報の取得、convertToFloatとは、全ての画像を32bitの浮動小数点画像に変換する処理です。
これによって、ipに代入された情報は実数のピクセル値をもった2次元の画像情報であると言えます。

この画像情報の中で全ての画素を最小値になるまで減らしていくのが以下の書き方です。

これで、最小値(minimum)が取得出来ました!さて、全体からこの最小値を引き算していきましょう。

①xy平面のピクセルを1次元に直して処理を行う

pixels[i]とは、i番目の画素のことです。25×25ならi=0~624まであることになりますね。
1つ1つの画素からminimum(最小値)を減算し、得られたip情報をもとに、減算された新しい画像(imp2)を
作ります。

ここで、以下の書き方は、最小値を引き算(-)して画素に代入し直す(=)というものです。

②最小値を引き算した画素のリストを新しく作る

lambdaは、どんな計算を実行するかを定義(def)しなくても、関数として計算が実行される書き方です。

例えば、定義すると以下のようになるところが、

lambdaで関数を書くと、このようになります。

これを、map(lambda関数,データ)という書き方に当てはめると、データをlambda関数で処理して、新しいデータリストが返されます。

実際にコードで見てみると、

lambda x:x -minimumで、画素値(x)から最小値を引き算する関数がpixelsデータに実行され、map(,)により新しいデータリストが生成されます。
これがpixels3に代入され、縦横の幅を設定して、2次元の画像情報としてip3に、そしてスタックとしてimp3にデータが渡されるということになります。

①②どちらの方法でも、同じ結果が得られます。実際に試してみましょう。

こちらは、ImageJのサンプル画像である橋(Bridge)の8bit画像に、全画素に対して127を足したもの(あるいは引き算したもの)になります。8bitは256階調なので、元の画素が129以上あると、サチってしまいます。この画像に最小値減算処理を行ってみましょう。

左が処理前の画像、右が処理後の画像になります。
ところで、元々の画像の最小値はいくつだったのでしょうか。

前回のコードで調べてみると、、

元の画像の最小値は0、127を加算した後の最小値は127だと分かりました。つまり、最小値を減算すれば、元の画像に戻るという訳ですね。

さて、いかがだったでしょうか?次回でPython×Fijiは一旦区切りになります!