2015年7月25日土曜日

第3回 いろいろな書式の画像データを理解しようで学ぶ!

前回は医療の中でよく登場する「DICOM」という画像ファイルフォーマットをImageJで表示する方法を簡単に述べました。今回はImageJで取り扱う事ができる画像ファイルフォーマットについて参考資料を元に解説を行います。

以下、画像ファイルフォーマットについて参考記事を援用して記述いたします。
この画像ファイルフォーマットとは、画像データをファイルに格納する方式(書式)のことです。
医用画像を使って実際に処理したり解析したりする場合、この画像ファイルフォーマットを理解していれば、その画像変換過程で使う処理の応用や、画素値の信頼性がより明確になり、目的に応じて画像ファイルフォーマットを操ることができます。


画像データの分類


画像データの分類は、大きく分けると「ラスタ型データ」か「ベクトル型データ」があります。
ラスタ型データは、一般的な画像に多いデータで、画像の上端から下端まで逐次走査されて、1つ1つの画素が配置されたデータです。
一方、ベクトル型データは、主にコンピュータグラフィックス系処理や、CAD(Computer Aided Design)データ処理、CAE(Computer Aided Engineering:コンピュータ支援による仮想空間シミュレーションや解析)などに使用されるデータ表現で、点・線・面の幾何学的位置や長さ、大きさの情報で表されます。

今回は医用画像で多用されるラスタ型データについて解説します。

ラスタ型データの代表的な画像には、胸部X線写真、MRI画像、CT画像などの白黒の濃淡(1つの色の濃淡)で形成されているモノクローム画像があります。
超音波カラードップラー画像、内視鏡画像、病理細胞画像などはカラー画像である場合が多く、各画素は赤・青・緑の3色に分解でき、この一つ一つの画像(モノクローム画像)はチャンネルと称され、カラーの場合は各画素3色に分解できる3チャンネル画像となります。
次の図は、ImageJのサンプル画像""を3チャンネルに分解した例です。




(Image>Color>Split Channelsで分解、元に戻す時は、同じくColor>Marge Channels)

ImageJでは、このラスタ型のデータを次のデータタイプで取り扱うことができます。

8-bit
256 (2の8乗)グレーレベル画像 

16-bit
65, 536 (2の16乗)グレーレベル画像 

32-bit
4, 294, 967, 296 (2の32乗)グレーレベル画像.

RGB Color 
それぞれ24ビットまたは32ビットの赤、緑、青のチャンネルを256階調で表示するカラー画像


ImageJを使って画像ファイルフォーマットを理解する


1. ImageJで対応可能な画像ファイルフォーマット

ImageJ(ver1.49)は、さまざまな画像ファイルフォーマットに対応しています。ここではその一部を紹介いたします。

・TIFF(Tagged Image File Format)

ImageJのデフォルトフォーマットです。

・GIF(Graphics Interchange Format ), 

元のデータを損ねず、最大256色の小さなファイルサイズに圧縮できる汎用的なフォーマットです。

・JPEG(Joint Photographic Experts Group ), 

いくつか圧縮の形式があります。
元のデータを元に戻すことのできない不可逆圧縮の形式もあるので、医用画像解析に利用する場合は取扱いに注意が必要です。

・DICOM(Digital Imaging and Communications in Medicine), 

医用画像でよく利用される画像ファイルフォーマットです。
ImageJはデフォルトでは非圧縮DICOM画像のみに対応しているため、圧縮されたDICOM画像を表示するためにはプラグインなどを利用します。

・BMP(Device Independent Bitmap, DIB),

圧縮なしのフルカラー画像を保存することができるフォーマットです。

・PGM(Portable BitMap )

ASCII形式のヘッダーをもつシンプルな画像ファイルフォーマットです。

・FITS(Flexible Image Transport System )

NASAなどの天文学の研究者間でデータ交換や記録の保存に用いられている画像ファイルフォーマットです。

・RAW

RAW画像は、未現像画像などを取扱うための画像ファイルフォーマットで、画像ファイルフォーマットに最終化する前の生データです。
多くの場合、画像データしか情報がないため、ImageJでRAWを表示するときは、画像データのみを表示する設定をして取り扱う仕組みになっています。そのため、ユーザー側であらかじめRAWデータのマトリックスサイズと濃淡値がわかっていなければなりません。(ImageJでRAWデータを表示する場合は、これらの情報を入力する必要があります。)

あらかじめ、マトリックスサイズと濃淡値がわかっていれば、画像データ量が計算できます。
もしRAWデータがヘッダー情報を持っていれば、画像ファイル容量からこの画像データ量を差し引いた分がヘッダー情報量だとわかります。
例えば、DICOM画像がRAWデータであったと仮定すると(RAWデータ読み込み練習と解釈してください)、この画像が256×256の2Byte(16bit)画像であるとわかっていれば、画像データ量は256×256×2Byte=131072Byteとわかります。ここで、ファイル自体のサイズを確認(ファイルのプロパティから確認)してみると、134472Byteとわかり、これを差し引いた分の3400Byteが、DICOMヘッダー情報のデータサイズであることがわかります。


(RAWデータのファイルサイズを確認)

これがわかれば、DICOM画像をRAWデータとして読み込むとき、「Offset to First Image」にこの3400を入力すると、3400Byte分(ヘッダー分)スキップして画像が正しく表示されます。




これを行わない場合、ヘッダーを画像データとして誤認識するため、画像は正しく表示されません。


(ヘッダーを画素として誤認識、うまく表示できない)

また、表示の時、Little-Endian Byte Orderにチェックをしています。これは、画像データでもCPUによってデータが格納されるバイト順が異なり、その方式を選択してあげる必要があるためです。上位バイトが先に格納されている場合をビックエンディアン、下位バイトが先に格納されている場合をリトルエンディアンといいます。Intel系ではリトルエンディアン、Motorola系ではビックエンディアンです。
この選択が間違っていると、一部の画素の濃淡値が反転してしまいます。



その他のデータフォーマット


その他、ImageJは、ASCII、一般的なPNG、NIfTIのAnalyzeに加え、HandleExtraFileTypes プラグインなどを利用することで、SPE、PICT、Targa、顕微鏡画像として、Biorad PIC、Gatan DM3, IPLab、Leica multi-TIFF seriesの入力、動画では、Quick Time、AVI、JMF Movieなどの編集・入出力など、多彩なデータに対応しています。

詳細はImageJのInput/Outputプラグインのリストをご参照ください。

また、ここでは説明を割愛していますが、二次元画像を重ね合わせて複数画像を1データとして取り扱うスタックやハイパースタックなどの操作も可能です。このスタックは、動画の作成や、3次元座標系情報を保持させた3次元画像、ピクセルデータに時間情報を保持さた4次元画像処理が可能です。

次回は、ImageJを用いて画像の性質を表す諸量について解説します。


Visionary Imaging Services, Inc.は、イメージング技術サポートを通じて、創薬研究や医療機器開発など、臨床研究(臨床試験)サポートサービスを展開しております。
お問い合わせはこちらまでお願いいたします。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(20・2) 2005, p94-96

3 件のコメント:

  1. ImageJについて教えて頂きたいです。
    複数のDICOM画像を開いた場合、同じピクセル値であるはずなのに
    スライスによって大きくピクセル値が変わってしまいます

    そのスライス内で輝度を調節しているからだと思うのですが
    もともとのDICOMデータの値をそのまま表示してくれる方法は無いのでしょうか?

    返信削除
  2. ご質問ありがとうございます。VISブログ担当です。

    質問者の方のImageJの操作環境や解析対象とされているDICOMデータの詳細を理解していない上でのご回答になることをあらかじめご了承ください。

    ・ピクセル値(画素値)について

    例えば、超音波画像など、輝度をモダリティ側で調整してからDICOM画像(グレースケールと仮定しますね)を作成する場合、おっしゃる通り、輝度によって画素値が変わります。一般的に、この輝度を変化させた画素値が、DICOM画像のデフォルトの画素値になります。

    ・DICOMデータのピクセル値をそのまま表示する方法について

    基本的には、何か操作をしない限り、ImageJはDICOM画像を純粋に表示します。的を射た回答になっていないかもわかりませんが、ImageJは元々のDICOMデータの値(画素値)をそのまま表示していると考えられます。

    より詳細な情報交換が必要な場合は、以下まで気軽にご連絡ください。
    ボランティアで解析支援や情報提供など行っております。
    http://www.vis-ionary.com/inquiry

    それでは良い1日を。

    返信削除
  3. さっそくのコメントありがとうございます。
    対処法がわかりました。16bit(多分)のグレースケールのPET画像だったのですが、open as a 32bit floatにチェックを入れて開けばちゃんと表示されました

    また、有益な情報ありがとうございました。
    このブログの更新を楽しみにしています。

    返信削除