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

前回は、画素値を足した画像から最小値を減算する画像処理を行いました。今回はあるしきい値以上の画素がどれくらいの数あるのかを調べていきたいと思います。

前回は、画素値を足した画像から最小値を減算する画像処理を行いました。左が減算処理前の画像、右が減算処理後の画像です。

因みに元画像はこちらです。

減算処理した画像と比べてみて下さい。真っ白なところが無いのが分かりますか?
画素値が上限をオーバーしてしまったところは元には戻らないのです。

ヒストグラムはどうなっているでしょうか?

画素値の範囲は左が127~255、右が0~128となっており、画素値の幅自体は変わらないのが分かります。
ただし、減算処理をしたことで、最小値は127から0になっています。
また、分かり辛いですが、実はビット数も変化しているのです。

実際に画像処理を施す前に、その処理が本当に適切かどうかを調べる為に輝度のヒストグラムを確認することがあります。

ところで、ある値以上の画素の割合が分かると、全体の画素のばらつきが分かりますよね!

そこで、今回はあるしきい値以上の画素がどれくらいの数あるのかを調べていきたいと思います。

Fijiチュートリアルの"Reduce a pixel array to a single value: count pixels above a threshold"をご覧下さい!

最初の6行目まではこれまでと同様です。現在開いている画像情報をimp(ImagePlus)として取得し、2次元画像としてipを取得。
画素情報を1次元情報として取得します。

因みにa > meanのmeanの部分を他の任意の値にしてもプログラムは動作しますが、その場合は、指定した
値を越えるピクセル数の割合が表示されます。

そして、画素のリストの値を全部足したもの[sum(pixels)]を、画素数[len(pixels)]で割ると、平均値が得られます。

平均値の計算=全体の合計(sum(pixels))÷要素の数(len(pixels))
平均値より高い値を持つ画素がどれだけの数あるのかを調べる為にreduceを用いているのですが、書き方がかなり複雑な為、今回は割愛します。ピクセル数だけ平均値を越えているかカウントを行い、全てのカウントが終ったら結果を返すという命令が書いてあります。

実際に、マクロで動かしてみましょう。

こちらは、Bridge画像とそのヒストグラムです。特定の画素値(value)のピクセルがどれだけ存在するのかをcountで示しています。また、平均値(mean)は141.198となっています。やや中心から偏っていますね。

そこで、先程のマクロを動かしてみましょう。

平均値はヒストグラムと同じ結果が出ました。平均値を越えるピクセルは全体の56%でした。「それにしては、画像全体が暗い」と思ったのですが、どうもInverting LUTとの表示があり、黒い画素=高信号(high value)という設定になってしまっている様です。何故かは分かりませんでした。

ヒストグラム分析など、これまでやってきた画像処理はOpenCVを使ったりやPhotoshopなどでも可能であると思います。

Fiji以外ではPython×OpenCVで調べたり、Photoshopでヒストグラムを調べることも出来ます。

ただ、画像処理のソフトウェアの中で汎用性が高く研究に最もよく用いられるのがImage Jです。


また、PythonはSciPyやMatLabと同様のことをPythonでも処理出来るSciLabといった統計処理のライブラリやソフトを扱うことが出来、計算処理が得意な言語でもあります。Javaはあまりそういったライブラリが豊富ではなく、C言語で書かれたものをJavaに変換する一手間が必要になることもあるのです。

計算処理の得意な言語PythonとImage Jの機能を拡張したFijiを組み合わせることで、画像処理がより自動化し易くなるかも知れません。

もちろんImage Jにも画像処理を自動で記録し再現する機能もありますが、たまに再現が出来ないことがあり、自分で書き直そうとすると手間がかかることもあります。

正直言うと、Python×Fijiを今すぐ使うことはそれほど無いかも知れませんが、これまでの講座をきっかけにPythonやImage Jといった統計処理、画像処理のツールに慣れてもらえたらと思います。

今後も主にPythonやImage Jなどを応用した画像解析の方法を紹介していきたいと思いますので、今後もご期待下さい!