JPEG 画像データ形式について

概要

  1. YCbCr 表色系に変換
  2. サブサンプリング (不可逆的・しない場合もあり)
  3. 離散コサイン変換
  4. 量子化 (不可逆的)
  5. ハフマン符号化

解析

[夜景] この画像を例として解析してみる。 JPEG ファイルの作成には ImageMagick を用いる。 ImageMagick は Independent JPEG Group のライブラリを用いている。

JPEG ファイルの作成においては quality を指定することができる。 これは量子化の過程に影響する。 実際にどのような影響があるのかを調べてみる。

まず、デフォルトの quality = 75 の場合。 od -c してみると次のように見える。

0000000 377 330 377 340  \0 020   J   F   I   F  \0 001 001 001  \0   H
0000020  \0   H  \0  \0 377 341   1 253   E   x   i   f  \0  \0   I   I

このように、 JFIF や Exif といった文字が見える。 Exif のところは拡張されたセグメントなのだろう。 この後にデジタルカメラの情報などが続いている。 この部分は od -Ax -tx1 で 16進数にすると次のように見える。

000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48
000010 00 48 00 00 ff e1 31 ab 45 78 69 66 00 00 49 49

ff とその後 1バイトとでセグメントの始まりを表すマーカとなっている。 ff d8 は画像の開始を表し、 ff e0 はヘッダ情報を含むセグメントである。 多くのセグメントはマーカの後に 2バイト (ビッグエンディアン) で長さが来る。 Exif のセグメントは 31ab(H) (= 12715) バイト続くということなので、 その後を見てみる。 しかし、 12715 バイトも何が書かれているのかは謎だ。

0031c0 00 ff db 00 43 00 08 06 06 07 06 05 08 07 07 07
0031d0 09 09 08 0a 0c 14 0d 0c 0b 0b 0c 19 12 13 0f 14
0031e0 1d 1a 1f 1e 1d 1a 1c 1c 20 24 2e 27 20 22 2c 23
0031f0 1c 1c 28 37 29 2c 30 31 34 34 34 1f 27 39 3d 38
003200 32 3c 2e 33 34 32 ff db 00 43 01 09 09 09 0c 0b
003210 0c 18 0d 0d 18 32 21 1c 21 32 32 32 32 32 32 32
003220 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
*
003240 32 32 32 32 32 32 32 32 32 32 32 ff c0 00 11 08
003250 00 f0 01 40 03 01 11 00 02 11 01 03 11 01 ff c4

ff db で始まるのは量子化表である。2つある。輝度成分用と色差成分用である。 その後の ff c0 で始まるのはいよいよこれからデータが始まるということを 表すセグメントで、画像の大きさなどが書かれている。 解読すると次のようになる。

0800f0014003011100021101031101
8 ビット240 行320 列3 要素1(1, 1)02(1, 1)13(1, 1)1
Y 成分Cb 成分Cr 成分

このうち、各成分の 3バイト目は量子化表の識別子となっている。 Cb 成分と Cr 成分は同じ表を使い、 Y 成分は異るということがわかる。 2バイト目は水平・垂直方向のサンプリング比率である。 この場合はサブサンプリングは行わないということがわかる。

そこで、2つの量子化表を見てみる。 8×8 の 64 個の値を左上 (低周波成分) から右下 (高周波成分) へ ジグザグに辿った順に並べてある。 Perl スクリプトで一列に並んだものを表形式に戻す。 なお、スクリプトには 10進数に変換したものを入力する。

輝度量子化表色差量子化表
865812202631
6671013293028
7781220293528
79111526444031
911192834555239
1218283241525746
2532394452616051
3646484956505250
99122450505050
911133350505050
1213285050505050
2433505050505050
5050505050505050
5050505050505050
5050505050505050
5050505050505050

このように、左上は小さく右下は大きい値になっている。 特に色差成分用は、半分以上が最大値になっている。

quality の値を変えてみて量子化因子がどうなるかを見てみる。 併せてファイルサイズも調べる。

quality量子化因子ファイルサイズ
輝度・直流輝度・最小色差・最大
025525525514148
25322019816649
5016109918939
601387919969
75855022831
80644024827
85533027863
88432430758
90322033214
92321636106
94211241647
95211045273
9611851418
9811471444
9911293794
100111111579

これを見ると、 50 より上の quality では、 量子化因子はほぼ線形になっているようだ。 quality 100 では量子化因子は全て 1 で、これは量子化しないことを意味している。 逆に quality 0 では全て 255 になっていた。 ファイルサイズは quality が 95 を超えるくらいから急激に増えている。 なお、 ImageMagick では、 quality の値に小数点以下を指定しても 切り捨てられるようだ。

上に載せた画像は、結局 quality = 92 で作った。

000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48
000010 00 48 00 00 ff db 00 43 00 01 01 01 01 01 01 01
000020 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
*
000050 01 01 01 01 01 01 01 01 01 ff db 00 43 01 01 01
000060 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
*
000090 01 01 01 01 01 01 01 01 01 01 01 01 01 01 ff c0
0000a0 00 11 08 00 08 00 08 03 01 11 00 02 11 01 03 11
0000b0 01 ff c4 00 14 00 01 00 00 00 00 00 00 00 00 00
0000c0 00 00 00 00 00 00 0a ff c4 00 1b 10 00 03 01 01
0000d0 00 03 00 00 00 00 00 00 00 00 00 00 04 05 06 03
0000e0 02 01 11 15 ff c4 00 15 01 01 01 00 00 00 00 00
0000f0 00 00 00 00 00 00 00 00 00 02 06 ff c4 00 1a 11
000100 00 03 01 01 01 01 00 00 00 00 00 00 00 00 00 00
000110 01 02 03 04 11 13 12 ff da 00 0c 03 01 00 02 11
000120 03 11 00 3f 00 29 b3 11 44 3e 48 ea 9f 43 d0 f4
000130 aa 71 80 43 3d 47 8d 64 b2 fb ce 02 65 97 a1 1f
000140 a5 8b a0 6a b9 c5 5c e0 2c 3b c8 07 8c 26 30 7a
000150 4a 5d f5 f3 f5 97 82 2e b8 31 ee 3b 2e 6c d4 ba
000160 0d 17 f1 cf 56 f2 7d 28 56 b6 5a 38 0a 96 a4 cf
000170 98 aa 29 25 99 01 46 60 9f 3f 40 12 42 c7 b2 0b
000180 59 26 f8 6a 7c e2 8d 4d 12 c6 89 3d 0d 25 9b 90
000190 99 69 72 f0 16 e8 45 2d 45 a4 ca 92 19 7b c6 1f
0001a0 ff d9
0001a2
DCT 係数
Y 成分Cb 成分Cr 成分
-690-39-272616-13-50
-533039-35-918-13
84-2129-13-1116-5
152-28-331-14-155
-30-660-26-352871
44-16-524316-2605
-413224-39922-10-7
21-17-729-16-14173
-49-107-320-1-1
-94-15-53-21
-98-834-311
7-69-26-22-3
0-364-32-10
15-45-32-21
-21-1-120-11
0-41-32-11-1
2-125-542-43
12-2-3-14-21-1
-715-88-5-11-3
-73-52-30-21
10-128-1061-21
-3-44-121-10
-37-74-421-1
13-24-202-1
 -690
 -39 -53 8 30 -27 26 39 4 15 -30 2 -21 -35 16 -13 -9 29 -28 -6 44 -41 -16 60 -3 -13 18 -5 0 -1 -11 31 -26 -52 32 21 -17 24 43 -35 -14 16 3 -5 -15 28 16 -39 -7 29 9 -26 7 5 1 0 22 -16 -14 -10 5 -7 17 3
 -49
 -10 -9 -9 4 7 -3 -1 8 7 0 -6 -8 5 2 0 -5 3 9 -3 1 -2 5 6 -2 4 3 -1 -1 -2 -3 6 4 -4 1 0 -4 -1 5 -3 -2 1 1 1 2 2 -3 -1 1 -3 2 2 -1 -3 0 -2 0 2 -1 -1 1 1 1 -1
 2
 -12 12 -7 -2 5 -5 -3 15 -7 10 3 -8 -1 4 2 4 8 -5 -12 -3 -3 -4 8 2 -5 -2 -4 3 1 -1 -3 -10 4 7 1 3 -7 -1 6 0 1 -1 -3 -2 1 2 4 -2 4 -4 1 -2 1 1 -1 2 -2 0 1 0 -1 2 -1

参考情報

杉本典夫さん
詳しくてわかりやすい
しいしせねっと
コンパクトにまとまっている
和田浩さん
量が多い
Crazy☆Planet
実例の画像を使って説明していてわかりやすい

規格

JISC-日本工業標準調査会
規格書が閲覧 (のみ) できる。 JPEG の規格は X 4301。

特許問題

奥村先生
ニュース記事などがまとめてある


西村 大介 <nishi@graco.c.u-tokyo.ac.jp>