JPEG
画像を JPEG(ベースライン)に符号化する過程を、色の変換と色差の間引き、8×8 のブロックの DCT と量子化、ジグザグ走査とランレングス、ハフマン符号のビット列まで順に見せます。画像の上でブロックを選ぶと、そのブロックの途中の値が並びます。符号化した画像の画質と大きさを比べ、JPEG ファイルとして保存もできます。
PNG・JPEG・WebP など。この枠か画像の枠へ落としても読み込める。長い辺が 1024 画素を超える画像は縮小し、透明な所は白にする
まだ選んでいません
IJG(libjpeg)の品質。量子化テーブルは 50 で基準の表のまま、下げるほど粗く、100 ですべて 1 になる。cjpeg の既定は 75
Cb・Cr の標本を減らす割合。人の目は色の細かさに鈍いので、色差を間引いても見た目は変わりにくい
周波数ごとの量子化の粗さの基準。品質で拡大縮小して使う
記号に割り当てる符号の表。画質は変わらず、大きさだけが変わる
復号するときに、間引いた色差を画素の数に戻す方法。符号化したファイルは変わらない
- ファイルの大きさ
- —
- 1 画素あたり
- —
- 圧縮率
- —
- PSNR(Y)
- —
- PSNR(RGB)
- —
- 0 になった係数
- —
- DC の符号
- —
- AC の符号
- —
- ヘッダ
- —
- MCU
- —
選んだブロックのまわりを最近傍で拡大する。格子は 8×8 のブロックの境目
差の表示で、元との差を何倍にして描くか
1画素(RGB)
2YCbCr と色差の間引き
38×8 のブロック
4DCT 係数
5量子化テーブル
6量子化した係数
7復号した画素
8DCT の基底
64 個の模様の重みが DCT 係数。左上が直流、右・下ほど細かい
9ジグザグ走査
10記号とハフマン符号
| 位置 | 種類 | 値 | ラン/大きさ | 符号 | ビット |
|---|
ファイルの構成
| マーカー | 位置 | 長さ | 内容 | 先頭のバイト |
|---|
動作原理と式
符号化の手順
JPEG のベースライン方式は、画像を色の成分に分け、8×8 画素のブロックごとに周波数の成分に変え、細かい情報を捨ててから、残った値をハフマン符号で詰めます。
- 色の変換RGB から輝度と色差へ
- 色差の間引き4:2:2・4:2:0
- DCT8×8 画素のブロックごと
- 量子化周波数ごとの刻みで丸める
- 記号化ジグザグ順、DC の差分、AC のランレングス
- ハフマン符号記号を詰める
情報が失われるのは、色差の間引きと量子化、それに途中の丸めだけです。そのあとの記号化とハフマン符号は可逆です。
色の変換と間引き
色は JFIF の式で、RGB から輝度 と色差 ・ に変えます[1]。人の目は明るさに比べて色の細かさに鈍いため、色差の標本は次のどちらかで 1/2 に間引きます。
- 4:2:2: 横に 1/2
- 4:2:0: 縦横に 1/2
間引いた標本は受け持つ画素の平均で、その中心にあるとみなします[1]。
輝度のブロックと、同じ範囲の色差のブロックをまとめたものを MCU(最小符号化単位)といいます。画像の端は、MCU の大きさまで端の画素を繰り返して埋めます。
DCT
DCT(離散コサイン変換)は、ブロックの 64 個の標本を、64 個の基底の模様の重み に置き換えます[2]。
- DC 係数: 左上の係数。平均の明るさから 128 を引いたものの 8 倍
- AC 係数: ほかの係数
なめらかな画像では、エネルギーが低い周波数の少数の係数に集まります。DCT と逆 DCT は、丸めを除けば元に戻る変換です。
量子化
量子化は、係数を量子化テーブルの値 で割って丸めます[2]。高い周波数ほど が大きく、細かい模様の小さな係数の多くが 0 になります。
品質は IJG(libjpeg)の決め方で、基準の表[2]を倍率 [%] で拡大縮小し、1〜255 に収めます[3]。品質 50 で基準の表のまま、100 ですべて 1 です。
量子化テーブルはファイルに入れて送るため、復号器は同じ値を掛けて係数を戻せます。
記号化
量子化した係数は、低い周波数から高い周波数へジグザグに並べます[2]。
DC 係数
走査の順で 1 つ前の同じ成分のブロックとの差分を、次の 2 つで表します。
- 大きさの区分 の符号
- ビットの付加ビット。負の値は 1 を引いた値の下位ビット
AC 係数
0 の続く数 と、次の 0 でない係数の を 1 バイトの記号 にまとめ、付加ビットを続けます。
- ZRL(F/0): 16 個以上続く 0 を 16 個ずつ送る
- EOB(0/0): 最後の 0 でない係数の後を打ち切る
ハフマン符号
記号はハフマン符号にします。輝度と色差に別の表を使います[2]。
符号化したデータの中に 0xFF のバイトが現れたら、マーカーと区別するため後に 0x00 を挟みます。最後のバイトの余りは 1 で埋めます。
ファイルの構成
- SOI始まり
- APP0JFIF
- DQT量子化テーブル、ジグザグ順
- SOF0画像の大きさと成分
- DHTハフマン表
- SOSスキャンの開始
- データ符号化したデータ
- EOI終わり
このツールはこの並びのファイルを自前の符号器で作り、自前の復号器で画素に戻して表示します。復号では、色差を最近傍か線形の補間で画素の数に戻します[5]。
PSNR
PSNR は、元の画像と復号した画像の平均二乗誤差 から求めます[6]。 は、両方の画像の RGB から JFIF の式で求めた輝度で比べます。
出典
- 色の変換、色差の標本の位置、APP0E. Hamilton, JPEG File Interchange Format, Version 1.02, C-Cube Microsystems, 1992
- DCT・逆 DCT・量子化・ジグザグ順・DC の差分と AC のランレングス・ハフマン符号・マーカー(A.3.3・A.3.4・図 A.6・F.1.2・Annex B・Annex C)、量子化テーブルとハフマン表の標準(Annex K の表 K.1〜K.6)、最適なハフマン表の作り方(K.2)ITU-T Recommendation T.81 | ISO/IEC 10918-1, Digital compression and coding of continuous-tone still images – Requirements and guidelines, 1992
- 品質の式Independent JPEG Group, libjpeg, jcparam.c の jpeg_quality_scaling と jpeg_add_quant_table
- 最適なハフマン表Independent JPEG Group, libjpeg 版 6b, jchuff.c の jpeg_gen_optimal_table
- 色差の線形補間Independent JPEG Group, libjpeg 版 6b, jdsample.c の fancy upsampling。版 7 で DCT による拡大に替わった
- PSNRQ. Huynh-Thu, M. Ghanbari, “Scope of validity of PSNR in image/video quality assessment,” Electronics Letters, vol. 44, no. 13, pp. 800–801, 2008
このツールで決めたこと
- 浮動小数点で行列の積として計算する DCT
- 色差の間引きの丸め
- ビット数の地図の配分