バイオ系だけどプログラミング始めました

ImageJ (Fiji)の使い方や Python でのプログラミングなどを、主にバイオ系の研究者・大学院生向けに書いていこうと思います。

ImageJ Fiji + Python で画像解析プログラムを書こう(前編)

目次

ImageJ と Python

ImageJ Fiji には画像解析のためのプラグインのほかに、スクリプトを書くためのエディターと実行するための機能が付属しています。ImageJ のスクリプトは幾つかのプログラミング言語や元々の ImageJ のマクロを用いて記述でき、その中に Python (厳密に言うと Java 上で実装された Python なので Jython になります)が含まれています。ImageJ 上での Python のエディターと実行のための機能は元々の ImageJ は付属していないため、Python を ImageJ で動かすためには Fiji をインストールする必要があります。Fiji のインストールはこちら。 satoshithermophilus.hatenablog.com

例えば、別の記事で書いた米粒のカウントを、自動で行うプログラムをこんな感じに書くことができます。米粒画像がたくさんあっても一瞬で解析を完了できます。

satoshithermophilus.hatenablog.com

Python は初心者向けの言語で、行いたい処理を短い行数で書くことができ、読みやすいコードが書けるのが特徴です。プログラミングをしたことのない人でもとっつきやすい言語です。Python でプログラムが書けるようになると、画像処理の他にも様々な計算や統計処理、機械学習なども気軽に試すことができるようになります。一石二鳥です。

バイオ系だけど Python を始めよう - バイオ系だけどプログラミング始めました

ImageJ で動かす Python の特徴(この項目は意味が分からなければ読み飛ばしてもかまいません)

一言で Python といった時には、基本的に CPython を指します。CPython とはC言語で書かれた Pythonを意味し、CPython のライブラリの多くはC言語で書かれています。一方、ImageJ で動かす PythonJava という言語で作られていて、Jython と言います。

この Jython の特徴としては、

  • 文法は CPython と一緒で、Python の標準ライブラリ(os、csvなど)が使用できる。

  • ImageJ の機能(クラス)など、Java で書かれたプログラム・クラス・ライブラリを使用できる。

  • CPython のライブラリ(numpy、scipy、matplotlibなど)が使用できない。

  • 開発があまり活発でなく、現在 CPython の v2.5 相当である。

になります。

なので、僕は画像解析・インターフェース周りを ImageJ + Jython であつかい、解析した情報をcsvファイル等に出力 -> CPython で csvファイルを読み込んで、統計的な解析・グラフのプロット・フィッティングなどを行っています。

ImageJ で Python を動かそう

まず、ImageJ のメニューウィンドウから、File > New > Text Window (もしくは、Ctrl + Shift +「N」)で Text Window を開きます。 f:id:shatoshi:20170612184120j:plain

Text Window を開いたら、 Language > Python で言語を指定します。 f:id:shatoshi:20170612184334p:plain では早速、動かしてみましょう。

1. Hello World!

print("Hello World!")

と打って Run を押してください。 f:id:shatoshi:20170612184851j:plain

ウインドウの下の部分に、Hello World!と表示されましたね。 このプログラムは、Hello World!と文字を表示させるプログラムになります。 print()は括弧の中に入れた値を画面に出力する関数になります。関数とはあるインプットに対して、何がしかの出力をしたり計算結果等を返したりする機能のことになります*1。今の時点では関数というものがよくわからないかもしれませんが、プログラムを書いていくうちに分かっていく部分もあると思います。それに後で詳しく説明したいと思ってます。 Run を書かれているているプログラムが実行されます(Ctrl(Mac の場合は Command) +「R」のショートカットでも実行できます)。

では次に、

print("Hello World!")
# print("Good Morning World!")

を実行してみましょう。 先ほどと結果は一緒だと思います。実は#の後に書かれた部分は実行されません。プログラムに関するコメント#の後に書きます。コメントは日本語で書くこともできますが、日本語がインストールされていないPCで実行しようとするとエラーが出る場合があります。なるべく英語で書きましょう。

2. 計算

では、次に、

x = 2
y = 3
z = x + y
print(z)

と打って実行しましょう。 f:id:shatoshi:20170612190655j:plain

実行すると、5 と表示されましたね。

このプログラムは、

  1. x という変数(プログラムにおける数字の入れ物)に 2 を代入する。
  2. y という変数に 3 を代入する。
  3. z という変数に x + y (2 + 3 なので答えは 5)を計算して代入する。
  4. z を表示する。

という計算をするプログラムになります。 プログラムは基本的に上から下に順番に実行されます。

基本的な四則演算などは、

print(5 + 2)  # 加算
print(5 - 2)  # 減算
print(5*2)  # 乗算
print(5/2)  # 除算
print(5.0/2.0)  # 除算
print(5 % 2)  # 余り
print(5**2)  # 指数

f:id:shatoshi:20170628150417j:plain

になります。基本的には Excel と同じように記述できますが、指数の計算は ^ じゃなくて ** になります。そこだけ注意してください。

そして、この 5/2 と 5.0/2.0 の計算結果が違うのに注目してください。Python は整数同士の計算に対して、整数を返すようになっているので、5/2 に対して 2 という結果を返してしまいます。どちらかの値が、小数点のついた値であれば小数点付きの値(浮動小数点、float 型)を返します。なので、割り算の時は気を付けましょう*2

長くなりそうなので、一旦ここで切ります。 続きはこちら。

satoshithermophilus.hatenablog.com

*1:実はPython2系においてprintは関数ではないのですが、3系では関数になっています。ややこしい。厳密な正しさはおいといて、「説明のシンプルさ」と「2系と 3系どちらでも動くコードを書けるようになること」を重視して上記のように記述しました。以下のリンクを参照のこと。 Python 2.7.x と 3.x の決定的な違いを例とともに | プログラミング | POSTD

*2:ただし、この Python の挙動は2系のみで、3系だと 5/2 は小数点の計算をしてくれて、2.5 を返すのです。ややこしい