CR2ファイルのRawデータを読み取ってみる その7 Lossless JPEGのデコード1- DHT

since:2014-5-18
last update:2014-8-31
前のページへ   次のページへ


トップ 写真・カメラ関連 CR2ファイルのRawデータを読み取ってみる その1 その7 Lossless JPEGのデコード1 - DHT

4、Lossless JPEGデコード

4.1 CR2形式内のLossless JPEGの構造

 ここからはCR2形式内部のLossless JPEG(ロスレスJPEG)を読み解いていきます。
 理解を簡略化するために、CR2形式からLossless JPEG部分を抜き出したファイルで説明をします。
(IMG_2026_IFD3_JPEG.jpg 参照)

 CR2形式内のLossless JPEGは開始終了マーカーを除くと、大きく3つのセクションに分けることができます。

Marker名称説明
0xFFD8Start Of Image (SOI)圧縮画像の始まり
0xFFC4Define Huffman Tables (DHT)ハフマンテーブル定義
0xFFC3Start Of Frame :Lossless (sequential) (SOF3)フレームの開始 Lossless 非differential, Huffman coding
0xFFDAStart Of Scan (SOS)スキャン画像の始まり
0xFFD9End Of Image (EOI)圧縮画像の終わり

4.2 DHT - ハフマンテーブル定義



アドレス0x0000 0002 から2byte(0xFF 0xC4)は、DHTのMarkerです。
アドレス0x0000 0004 から2byte(0x00 0x42)は自身を含むセグメント長さ(Lh)です。このセグメント長さは66byteになります。
アドレス0x0000 0006 から1byte(0x00)のうち上位4bitはDC/ACいずれかに用いるテーブルかを示します。Lossless JpegではDC成分しかありませんので常に0です。(Tc)
下位4bitはハフマンテーブルのindexになります(Th)。サンプルは0ですので、今から記述するものはindex 0番のハフマンテーブルになります。
アドレス0x0000 0007から16byteは各bit長で表されるシンボルの数になります。

シンボルのbit長12345678 910111213141516
シンボルの個数0x000x010x040x020x030x01 0x010x010x010x010x000x000x000x00 0x000x00

 つまり1bit長のシンボルは0個、2bit長のシンボルは1個、3bit長のシンボルは4個のようになります。

ここから具体的なハフマンツリーを構成していきます。
1bit長のシンボルは0個ですので、考慮不要です。
2bit長のシンボルは1個です。
ここで2bit長のシンボルは 00 01 10 11の4種類があります。この中で最も小さく、かつ今までの選択したものと重複しないものを選んでいきます。
よって 00 を選択します。
3bit長のシンボルは4個です。
ここで3bit長さのシンボルは 000 001 010 011 100 101 110 111 です。この中で 000 001 については、2bit長で選択した 00 と重複するため除外します。
結果として残りから4個を選びますので、010 011 100 101 になります。

これは木構造で簡単に表現できます。



頂点のRの丸を根、白色の丸が接点、黄色の丸を葉と呼びます。根から順にたどっていき、葉にたどり着いたらそこでその値を確定させます。
結果としてサンプルでは以下のようになります。

シンボル
00
010
011
100
101
1100
1101
11100
11101
11110
111110
1111110
11111110
111111110
1111111110

アドレス0x0000 0017からシンボルの個数byte分はハフマンツリーの葉に割り当てられる値を意味しています。
サンプルはシンボル数が15ですので、順に0x06,0x04,0x08....0x0Eと15byte分を、先ほどの表に割り当てます。

シンボル
000x06
0100x04
0110x08
1000x05
1010x07
11000x03
11010x09
1110 00x00
1110 10x0A
1111 00x02
1111 100x01
1111 1100x0C
1111 11100x0B
1111 1111 00x0D
1111 1111 100x0E

アドレス0x0000 0026は0x0000 0006と同様にTcおよびThが格納されています。
値は0x01ですので、これから記述するものはindex 1番のハフマンテーブルになります。
サンプルでは0番のハフマンテーブルとまったく同じ値ですので、同じテーブルが算定されることになります。


次ページ:Lossless JPEGのデコード2 - SOF3とSOS

前のページ  [1] [2] [3] [4] [5] [6] [7] [8] [9]  次のページ