今回骨の材料試験を行うために,下の写真のように骨を樹脂で固定して試験片を作成し,CT撮影しました.そしてCT画像データを編集しやすいようにバイナリデータに変換しようとしたところ・・・
先輩方の作られたTIFFファイルをバイナリファイルに変換するC言語ソースファイルは8bitのTIFFにしか対応していないことが判明しました.8bitでもいいかな・・・と思いましたが,8bitでは256階調,16bitでは65536階調の輝度値を表現できるという大きな差があるので,TIFFのファイル構造の勉強をかねて16bitのTIFFに対応したバイナリファイル変換ソフト(C言語)を作成しようと思いました.
でもこれば結構難しい・・・
TIFFファイルをtextエディタのバイナリモードで開いてみました.(stirlingというフリーソフトで開くととてもわかりやすいです!!←おすすめです)
すると数字の羅列(16進数表記)を確認することができます.
その数字の上8バイトはImage FIile Header(IFH)と呼ばれるものです.
IFHの上2バイトは4D 4Dまたは4949となっており,4D4Dの場合はビッグエンディアン,4949の場合はリトルエンディアンであることを示しています.
次の2バイトは002A(ビッグエンディアンの場合)または,2A00(リトルエンディアンの場合)となっており,これはTIFFファイルであることを示しています.
最後の4バイトはImage File Directory(IFD)の位置を示してくれています.(エンディアン変換についてはまた調べてみてください!!)
今回私が開いたTIFFファイルの場合のIFHは
4D 4D 00 2A 00 08 02 08
となっており,これを解読すると,ビッグエンディアンのTIFFファイルで512バイト目からIFDが格納されていることを示しています.
そのあとから512バイト目までは輝度値が格納されています.
それ以降はIFDが格納されており,
IFDの先頭の2バイトはタグの長さを示しており,私の場合 00 0B となっています.これは11個のタグが存在していることを示しています.
その次からはTag ID(2バイト),Data Tayp(2バイト),Data Count(4バイト),Data Offeset(4バイト)が収められています.
つまり今回は(Tag ID,Data Tayp,Data Count,Data Offeset)×11個存在しているということになります.
そしてこの部分には,画像サイズ,データ型などが格納されています.
今回特に大切だったのは画像サイズです.
tagID 01 00 には縦の画像サイズ,01 01には横の画像サイズ情報がData Offsetの上2バイトに格納されています.
私の場合両方 02 00 なので縦サイズ512×512の画像サイズであることがわかります.
ようやくここまで理解できた(;^_^A
TIFFファイルを単純なバイナリデータに変換するにはヘッダファイル以降の輝度情報を読み込み,書き出していけばできるようです.
画像ファイルを操れるようになるとちょっと面白そうですね!!
また勉強してみようと思います!!
さて,これからC言語ソースファイルを作成します.