Tiffファイルの扱い方

MATLABで画像ファイルを読み込むための関数として

imread関数があり、Tiffファイルにも対応しているが、

Tiffファイルに対してより複雑な操作をするために

Tiffクラスが用意されている。

ここではTiffクラスの使い方について説明する。

1.Tiffファイルの中身

Tiffファイルには画像情報だけではなく、タグとして文字列情報も含まれている。

例えば、ZDC顕微鏡を使ってMetamorphで撮影した時は、

Tiffファイル内に文字列情報として撮影時刻が格納されるので、

Tiffファイルから撮影時刻を取得することができる。

また、1つのファイル内に複数の画像を含めることができる。

複数の画像が入ったTiffファイルをMetamorphで開くと、

Stackとして開かれる。

Metamorphで、Stackを保存するときに、

「ファイルの種類」で「MetaSeries Single/Multi-plane TIFF(*.tif)」

を選択すると、Stackの画像すべてを一つのTiffファイルとして保存する。

「ファイルの種類」で「MetaMorph TIFF File Format(*.tif)」

を選択すると、Stackのplane数の分だけTiffファイルが作られ、

各Tiffファイルには各planeの画像一つが格納される。

2.Tiffファイルの読み込み

2-1.Tiffオブジェクト作成

Tiffクラスを使ってTiffファイルを読み込むには、まず以下のようなコードを書く。

tiff_obj = Tiff(path,'r');

pathはファイルのパス(例えば'my_image_file.tif')

'r'は読み込みモードにするための引数である。

このコードにより、指定したTiffファイル内に入っているすべての情報が

Tiffオブジェクトとして返り値の変数に格納される。

2-2.タグの取得

それぞれのタグは名前と値を持つ。

例えば、ZDC顕微鏡を使ってMetamorphで撮影したTiffファイルには

'DateTime'という名前のタグがあり、撮影時刻が値として格納されている。

Tiffファイル内にどんなタグがあるのか調べるには

getTagNamesメソッドを使う。

メソッドを使うときは

<オブジェクト名>.<メソッド名> または

<メソッド名>(<オブジェクト名>)と記述する

2-1のコードではtiff_obj変数にTiffオブジェクトを格納したので

tiff_obj.getTagNames または

getTagNames(tiff_obj) と書く。

一般的なプログラミング言語では<オブジェクト名>.<メソッド名>の表記が普通なので

以下ではこちらの表記を用いる。

getTagNamesの使い方は、

解析するTiffファイルにどんなタグがあるかわからないときに、

コマンドウィンドウでgetTagNamesを実行してタグ名を調べるのが基本的であり、

スクリプト内でgetTagNamesを使うことはあまりないと思われる。

タグの名前がわかったら、

getTagメソッドを使って、指定したタグの値を取得する。

tiff_obj変数に格納されているTiffオブジェクトにおいて、

'DateTime'タグの値を取得したい場合は、以下のように記述する。

tag_value = tiff_obj.getTag('DateTime');

タグの値は文字列なので、ここでtag_valueに格納された値は文字列である。

数値として扱いたい場合は文字列を数値に変換する操作が必要である。

(日付情報は様々なフォーマットがとられるので、

各種フォーマットに対応させるためにdatenum関数を用いる。)

2-3.画像の取得

一つのTiffファイルに一つだけ画像が入っている場合は、

以下のコードで画像を取得できる。

image = tiff_obj.read;

tiff_obj変数に格納されているTiffオブジェクトから画像を取得して

image変数に入れる。

一つのTiffファイルに複数の画像が入っている場合は、

イメージファイルディレクトリ(IFD)を指定する必要がある。

TIFFオブジェクトには、現在のIFDがいくつかという情報が入っている。

currentDirectoryメソッドで現在のIFDを取得できる。

readメソッドは現在のIFDの画像を読み込む。

現在のIFDを変更するにはsetDirectoryメソッドを使う。

あるいは、nextDirectoryメソッドを使うと次のIFDを現在のIFDに設定できる。

Tiffファイル内に画像が何枚入っているかわからないときは

以下のようにして枚数を調べる。

while tiff_obj.lastDirectory == false
    tiff_obj.nextDirectory;
end
number_of_images = tiff_obj.currentDirectory;

lastDirectoryメソッドは現在のIFDがファイルの最後かどうかを返す。

画像読み込みの手順をまとめると以下のようなコードになる。

サンプルコード。

MetamorphでStackを一つのTiffファイルとして保存したものをMatlabで読み込む。

% -------------------------------------------------------------------
% Tiffファイル読み込み
tiff_obj = Tiff('imagestack.tif','r');
% 画像サイズ、画像数取得、変数設定
image_height = tiff_obj.getTag('ImageLength');
image_width = tiff_obj.getTag('ImageWidth');
% イメージが何枚あるか調べる
while tiff_obj.lastDirectory == false
    tiff_obj.nextDirectory;
end
number_of_images = tiff_obj.currentDirectory;
% イメージ読み込み
images = uint16(zeros(image_height, image_width, number_of_images));
for i = 1:number_of_images
    tiff_obj.setDirectory(i);
    images(:,:,i) = uint16(tiff_obj.read);
end
% -------------------------------------------------------------------

画像を16ビット符号なし整数型(uint16)の行列として変数に格納している。

型変換をするときは元のデータの数値範囲に気を付ける。

例えば12ビット符号なし(0~4095)の数値が入った画像情報をそのまま

8ビット符号なし整数型(uint8)に変換すると

256以上の数値情報はすべて255になってしまう。