TIFF CCITT T.6(Group 4)のデータ構造、圧縮アルゴリズムについて

JavaでTiffファイルを表示したい場合、
「Java Advanced Imaging(JAI)」をインストールしないといけません。

http://www.oracle.com/technetwork/java/current-142188.html


Tiffファイルを表示したい要件があったのですが、表示するTiffの圧縮形式は
「CCITT Bilevel Encodings G4 FAX T.6」固定です。

そのためだけにJAIをインストールするのもなんだかなと思ったので、
自力でTiffファイルを読み込んで表示できないものか調べてみます。

まずはTiffファイルの構造について。






Tiffファイルの内容



Tiffファイルの構造については、以下のURLが非常に参考になりました。

我楽多頓陳館 - 第5章 TIFFファイル
http://www.snap-tck.com/room03/c02/cg/cg05_01.html

Tiffファイルは0x4d4dまたは0x4949から始まります。
これが格納しているデータのバイトオーダーを表します。

その後、バージョン情報、IFDポインタと続きます。
IFDポインタで指定されているバイト数から、Tiffファイルの情報
(画像の横幅や縦幅、圧縮アルゴリズム等)が格納されています。

IFDの中に、画像データが格納されている開始バイトを指し示すもの(StripOffsets)が
あるので、ここで指定されているバイト数からデータを読み取り、
画像データを復元します。


試しに、こんなpngファイルを作成しました。

200_01.png


UbuntuでPNGファイルをTIFF CCITT T.6(Group 4)に変換する
ここで調べたコマンドで、tiffファイルに変換します。

変換したTiffファイルを「GHex」で表示してみました。

Ubuntuにバイナリエディタ「GHex」をインストールする


得られたバイナリデータを解析してみます。
こんな感じで、データの内容を読み取ることができました。

TIFFファイルの構造解析


ちなみに、Tiffのタグについては、こちらのURLで検索して調べています。
TIFF Tag Reference


これで画像データの横幅(0x0100:ImageWidth)が100px、縦幅(0x0101:ImageLength)が10pxであること。
画像データ(0x0111:StripOffsets)が8バイト目から始まることがわかりました。






Group 4の圧縮アルゴリズム



Group 4の圧縮方法がわからず、非常に苦労しました。
参考にしたのは、以下の資料です。

T.6 : Facsimile coding schemes and coding control functions for Group 4 facsimile apparatus
http://www.itu.int/rec/T-REC-T.6-198811-I/en

T.4 : Standardization of Group 3 facsimile terminals for document transmission
http://www.itu.int/rec/T-REC-T.4-200307-I/en

CCITT T.6 2-Dimensional Compression Standard
http://einstein.informatik.uni-oldenburg.de/rechnernetze/ccitt_t6.htm


これを読んでわかったことですが、png等の画像形式だと一行ごとの色情報を
個別に保持していますが、TiffのGroup 4は「前の行との差異」を保持していると言う事です。

比較に使用する行を「Reference line」、圧縮を行いたい行を「Coding line」と呼びます。

200_02.png

まず、色が変化する特異点を決定していきます。
a0:Reference line、もしくはCoding lineで色が変化する点。
a1:Coding lineで、a0と色が変わる点。
a2:Coding lineで、a1と色が変わる点。

b1:Reference lineにおいて、a0より右側でa0にある色から変化する点。
b2:Reference lineで、b1から色が変化する点。

上記5つのポイントを特定します。
特定したポイントの特徴により、3種類の圧縮形式のいずれかを選択します。




Pass Mode



b2 < a1となった場合、Pass Modeを選択します。
具体的には、こんな配置になった場合。

200_03.png


b2とa1が重なる、例えばこんなパターンの時はPass Modeを指定できません。

200_04.png


データとしては、「0001」を書き込みます。





Horizontal Mode



a1とb1の差が3より大きくなる場合は、Horizontal Modeを選択します。
例えばこんな感じの場合です。

200_05.png

データは、Horizontal Modeを示す「001」を書き込み、
その後、a0からa1の色が何ピクセル続くか、a1からa2の色が何ピクセル続くかを
次の表を用いてコードにします。

Horizontal Modeで使用するコード


例の場合、白が3ピクセルなので「1000」、続いて黒が8ピクセルなので「000101」を書き込みます。
最終的に、モード指定+白ピクセル数+黒ピクセル数を書きこむので
「001」「1000」「000101」
というデータを出力することになります。


ピクセル数が63を超える場合、例えば白が65ピクセル続く場合は、
まず、白64ピクセルを示す「11011」を、続いて白1ピクセルを示す「000111」を
出力し、その後黒のピクセル数を出力することになります。





Vertical Mode



a1とb1の差が3以下の場合は、Vertical Modeを選択します。
例えばこんな感じの場合です。

200_06.png


a1とb1の差により、さらに7つのモードに分岐します。

a1とb1がちょうど重なっている場合、「V(0)」となります。データは「1」を出力します。

200_07.png


a1がb1より右側にある場合、「VR」となります。
差により「VR(1)」、「VR(2)」、「VR(3)」に分類され、データは各々
「011」、「000011」、「0000011」を出力します。

200_08.png


a1がb1より左側にある場合、「VL」となります。
差により「VL(1)」、「VL(2)」、「VL(3)」に分類され、データは各々
「010」、「000010」、「0000010」を出力します。

200_09.png






その他の規則



基本的なルールはこれだけです。その他の規則として・・・


・一番最初の行を符号化するときのReference lineは何にするか。
全て白のピクセルで埋まった行を仮想的に用意し、それをReference lineとして用います。

・行の一番左より更に左の画面外の色は何として扱うか。
白として扱います。

・一つの符号化が終わった後、次のa0はどこにするか。
モードによりわかれます。
Pass Mode:b2の位置にあるCoding lineの座標をa0として、続きの処理を行います。
Horizonal Mode:a2をa0として、続きの処理を行います。
Vertical Mode:a1をa0として、続きの処理を行います。

T.6 : Facsimile coding schemes and coding control functions for Group 4 facsimile apparatus
http://www.itu.int/rec/T-REC-T.6-198811-I/en

この資料の7ページにあるフローチャートがわかりやすいです。




・行の先頭、末尾についての取り扱い。
これが一番悩みました。

T.4 : Standardization of Group 3 facsimile terminals for document transmission
http://www.itu.int/rec/T-REC-T.4-200307-I/en

この資料の15ページに記載されています。
一応、転記しておきます。

行の先頭の扱いについて。

200_10.png


行の末尾の扱いについて。

200_11.png


悩んだ例として、例えば最初の行が黒一色。
次の行も黒一色の場合は、V(0) + V(0)で一行を表します。

最初の行が白一色、次の行も白一色の場合は、V(0)のみで一行を
表すことになります。

200_12.png


この資料がイメージをつかみやすいかと思います。

CCITT T.6 2-Dimensional Compression Standard
http://einstein.informatik.uni-oldenburg.de/rechnernetze/ccitt_t6.htm







【参考URL】

我楽多頓陳館 - 第5章 TIFFファイル
http://www.snap-tck.com/room03/c02/cg/cg05_01.html

TIFF Tag Reference
http://www.awaresystems.be/imaging/tiff/tifftags.html

T.6 : Facsimile coding schemes and coding control functions for Group 4 facsimile apparatus
http://www.itu.int/rec/T-REC-T.6-198811-I/en

T.4 : Standardization of Group 3 facsimile terminals for document transmission
http://www.itu.int/rec/T-REC-T.4-200307-I/en

CCITT T.6 2-Dimensional Compression Standard
http://einstein.informatik.uni-oldenburg.de/rechnernetze/ccitt_t6.htm

関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ