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

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

画像データの基本

目次

 

そもそも画像データってなんなのさ?

 とりあえず下の絵を見てください。

f:id:shatoshi:20170609122144j:plain

左のウィンドウがお米の写真(EMBL の Sample 画像、EMBL > Samples > rice.tiff で開ける)で、右のウィンドウがお米の写真の青い枠で囲ったところを拡大したものになります。この右の拡大した図をみればわかるように、画像データは小さな四角ピクセル・pixel と言います)から成ります。

ImgeJ のメインウィンドウの下を見ると、x = 2, y = 3, Value = 118と表示されています。これは、一番左上のピクセル(0,0)から数えて右に2番目、下に3つ目のピクセル(カーソルの示す場所)の値が118であることを表しています。

 

 

ImageJ で同じ画像を開いて(EMBL > Samples > rice.tiff)色んな所にカーソルを合わせてもらえれば分かりますが、明るいところがピクセルの値が高いことが分かると思います。このピクセルの値の大きさはは、この画像だと0~255の範囲になります。*1

つまり、画像データというのは、ある値を持ったピクセルの集まりであると言えます。

以下のようなイメージです(画像の英語はイメージなので、イメージのイメージということになる)

f:id:shatoshi:20170612205306j:plain

ピクセルの値や座標の情報を定量的に扱うこと、それが画像解析の第一歩になります。また、画像データは、見てのとおり縦と横に値が並んでいるデータなので、実は行列計算と相性が良いです。行列を使うと、複雑な計算をシンプルに書くことができたりするメリットがあるため、画像処理プログラムの内部では行列計算をやっていることけっこうあります。

 

カラー画像

皆さんの身近な画像データはスマホやデジカメで撮った写真のようなカラー画像になるかと思います。カラー画像は、一つのピクセルに光の三原色である赤・青・緑に対応する値が記録されていて、それで色を表現することができます。スマホで撮った写真などをImageJで開くとお米の白黒画像とは違って一つのピクセルに三つの値が表示されると思います。以下の画像は、EMBL のサンプル画像の RGB_Cell.tif です。

f:id:shatoshi:20170612212448j:plain

 画像の十字で示した部分、x = 257、y = 169、の座標の値が、赤 = 051、緑 = 088、青 = 022、であることが分かります。

画像データの種類

JPEGPNGBMP、GIF、TIFFといった種類の画像ファイルがあることは知っているかもしれませんが、それぞれに特徴があります。ここではそれぞれの画像ファイルの形式について詳しく述べません(気になればググりましょう)が研究用途には、TIFF を使いましょう。そして JPEG は絶対に使ってはいけません!

 TIFF は様々な種類の画像形式(8-bit、16-bit、RGBのカラー、幾つかの画像をまとめたスタック)を扱えます。上に示したお米の画像も TIFF 形式の画像です。

一方で JPEG は画像データの圧縮をするため、他の画像形式と比較して非常に容量が小さいです。 それゆえに、皆さんの持っているスマホのデータは JPEG で保存されます。しかし、圧縮の際に非可逆的な圧縮を行うために、画像の元々の情報が失われてしまいます。なので、研究・科学の用途で使うべきではありません。

*1:

0~255の範囲なのは、画像の形式が8-bit画像だからです。コンピュータは見た目高度なことをやっていますが、実は内部での計算は0か1かという二進数で処理されています。この0か1をbitといい、一つのbitで表される数というのは0か1かの二通りですが、それを8こ集めると2の8乗通りの256通り表すことができます。つまり、8-bit画像とは一つピクセルが8-bitで表現されている画像になります。8-bit以外にも、16-bit や 32-bit の(つまり2の16乗通りや2の32通りのピクセル値で表現される)の画像もあります。