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

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

先ほど示した rice.tif の画像のピクセルの値の大きさを三次元的にプロットするとこのようになります(Analyze -> Surface Plot)。

f:id:shatoshi:20171110152801j:plain

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

 

カラー画像

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

f:id:shatoshi:20170612212448j:plain

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

また、カラー画像にも光の三原色であるRGBで表す形式以外にも、CMYKなどがありますが割愛します。

画像データの種類

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

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

一方で JPEG は画像データの圧縮をするため、他の画像形式と比較して非常に容量が小さいです。

JPEG の仕組み : kei@sodan

ザックリ説明すると、人の目で認識する上では重要ではない情報を間引くような方法でデータの容量を圧縮してます。データ容量の小ささいというメリットがあるために、皆さんの持っているスマホで撮影した写真データは JPEG で保存されます。しかし、圧縮の際に非可逆的な圧縮を行うために画像の元々の情報が失われてしまう上にアーティファクトなノイズを発生させます。なので、研究・科学の用途で使うべきではありません。

BMPは画像のピクセルの輝度値がそのまま保存されています。JPEGよりはましですが、対応していない形式も多いのでTIFFがいいですよ。

PNGは、BMPと同じくピクセルの輝度値がそのまま保存された状態で、可逆的に圧縮されます。なので、BMPに比べてデータの容量が少なくて済みます。また、16-bitのグレースケールにも対応しているのでメリットは多いです。ただし、動画などのスタックに対応しているTIFFがいいですよ。

 

 

*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通りのピクセル値で表現される)の画像もあります。