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

これまで勉強してきたPythonのスキルをベースに、画像処理についてやっていきたいと思います!

目次

概要

今まで、画像処理や画像解析については、Image JやRというツールが用いられてきました。
ただ、Pythonという比較的簡単な言語でも画像処理のプログラムを作ることが出来るので、おすすめです。

例えば、Open CVという画像処理のライブラリを使って、Pythonで以下のようなプログラムを書くことが出来ます。

実際に私も上のプログラムを自分で動かしたところ、同様に顔認識を行うことが出来ました!調べると他にも色々ありますので、試してみて下さい!

さて、今回はこちらのチュートリアルを活用します。http://www.ini.uzh.ch/~acardona/fiji-tutorial/
このチュートリアルは、チューリッヒ大学のニューロインフォマティクス研究所のHPから拝借しました。

PythonをFijiで利用する前に

今回は、FijiというImage Jの拡張版を使います。Image Jでは、Javaという言語でしか書けませんでしたが、Fijiでは、Pythonでもプログラムを書くことが出来ます。Pythonは統計的な処理が非常に得意な言語で、今後注目される言語の一つです。
まずはFijiを起動しましょう。そして、メニューバーから、Fiji->Plugin->New->Macroでマクロを起動して下さい。

使う言語をPythonに変更して、準備完了です!

試しに簡単な命令を書いてみよう

試しに、以下の簡単な命令を表示されているエディタに書き込んでみましょう!

このように書くと、3×123=369と出力されます。

1,2,3,4,5が縦に表示されます。

おさらいですが、ここでのforは、「iという要素が存在する限りずっと命令を繰り返す」というものです。
今回は1~5の整数が[ ]に存在していたので、それら全てをprint(表示)する命令を行いました。

うまくいけば、Runを押すと、出力されます。

実際に画像を扱ってみよう

さて、肩ならしが出来たところで、実際に画像を扱ってみましょう!Fijiチュートリアルの2.Your first Fiji scriptの、Grabbing an open imageを見てみて下さい。

①画像情報を取得する。

まずは、サンプル画像を開いてみましょう。
Fiji->File->Open Samples->Leaf(36K)を開いて下さい。

葉っぱの画像が出てきました。

それから、以下のコードを開いているマクロに書いてみて下さい!

すると、img[:leaf.jpg (507x446x1x1x1)]という情報が表示されます。これは、今開いている画像の情報なのです。縦が446px、横が507pxで、重なっている画像は1枚だということが分かります。

どうして、画像情報が表示されるのでしょうか?その鍵はijというモジュールにあります。ijとは、 ImageJ 機能をまとめたモジュールで、その中に IJ という機能群(正確にはクラス)があります。この、IJというクラスの中に、画像に関する情報を扱う内容が含まれており、画像情報を表示することが出来るのです。
from ij import IJというのは、ijという名前のついた道具箱から、IJという道具を使いますよ、と言っています。プログラムでは、最初にこのように宣言をすることがあります。

そして、imp = IJ.getImage()という呪文で、画像の情報を取得しています。このgetImageもIJ クラス(機能群)の中にある 関数の一つです。このgetImageを使うと、画像の情報を取得して、=によって、代入することが出来ます。

impとは、ImageJ 上で開いている画像を示すローカル関数(その場でしか使えない関数)のことです。print impと書いて、impの中身を表示する命令を実行すると、先程impに代入された画像の情報が表示されます。

impとはImagePlusの略称で、画像を代入する箱、画像を抽象化する単位です。


②直接画像を保存

それでは、次にPCに画像を保存してみましょう!

チュートリアルでは、Saving an image directly to a fileという項目をご覧下さい。
チュートリアルの右側に紹介されている以下のコードをコピーしてエディタの中に貼付けて下さい。

上のコードは、パス(ファイルのある場所)を指定して画像を保存する命令になります。

folder = "/home/albert/Desktop/t2/fiji-tutorial"となっているところが、保存するフォルダの場所です。
folderが予め、指定されていて、そこに保存するようになっています。もしフォルダが無ければ、
もちろんエラーになってしまいます。

それぞれのPCで作っているフォルダが違うと思いますので、自分で適宜設定してみて下さい!

from ij.io import FileSaverという新しい表記がありますが、
画像ファイルを保存する際にio:入出力(input/output)を宣言しています。
今回は、画像を保存する為に、ファイルを出力するので、ioという表記が書かれています。
そして、上書き保存の方法を示しているのが、FileSaverというクラスです。

ただ、この場合、予め指定した場所が無いと、エラーになって、画像が保存されません。

そこでもう少し改良したコードがこちらです。

改良したコードでは、そもそもファイルが存在するかどうかをチェックしています。

まず、フォルダ名のチェック(if path.exists(folder))、それがフォルダなのかどうか(path.isdir(folder))をチェックします。もし、どちらもOKだったら、「フォルダは存在しますよ〜」と表示します。

次に、指定したファイルの場所(パス)が存在する=同じ名前のファイルが既に存在する時は、

「ファイルは存在するので、上書きすることになりますよ」と表示します。

もしファイルがまだ存在しなければ、所定の場所(パス)に、「ファイルが保存されましたよ〜」と表示してくれます。

elifでチェックした時にimp(ファイルパスの中身)は保存されます。

ここで、新たに"from os import path "という言葉が、最初の宣言に加わりました。ここでのosとはos自体の能力のこと。pythonにもともと備わっている処理能力のことを指します。from os import pathと書くことで、ファイルのパス(場所)を指定することが出来るようになります。

さて、今回の講座はいかがだったでしょうか?

次回、より高度なPythonの画像処理について見ていきます!