JPEGの品質計算

いろいろあって、JPEGの品質を知る方法がないか調べることになった。
Info_JPEGというツールで調べられるのだが、同時に画像サイズと色数も知りたい。Info_JPEGではこれはできない。
あちこち検索してみるが、品質と圧縮率がごっちゃになっている(私もごっちゃに考えていた)せいか、あまり有用なネタに出会えない。
一つの方法として書かれていたのがこれ。

  1. ヘッダを解析して縦横サイズを取得し、さらにフルカラーか256カラーかを取得する。
  2. 画像サイズ×色数(フルカラーはRGBなので3bit)として元画像のデータサイズを計算する。つまりビットマップサイズにする。
  3. SOS(Start Of Scan)からEOI(End Of Image)までのJPEG画像データサイズを取得する。
  4. 100-(JPEG画像データサイズ/元画像データサイズ×100)で圧縮率を求める。
この方法で手持ちのJPEGを調べたら90%になってしまった。ファイルサイズがほぼ1/10になっているということ。しかし、この方法ではInfo_JPEGの値と全く違う。品質は80なのだ。
JPEGのヘッダには品質を明記していないので、何か計算方法があるのだろうとさらに検索するが、見つからない。
最終的にたどり着いたのがhttp://web.archive.org/web/20060716124317/www02.so-net.ne.jp/~koujin/jpeg/DCT2DQ.html 既にお亡くなりになっているサイトにこんな重要なことが…orz

あぁ、品質の計算式が書いてある。しかも品質を変えた時の量子化テーブルを表示してくれるアプレットまである。ネ申を見た。ヌミノースに触れた。
計算式だが、これを解読するだけの数学の素養は私にはない。とりあえず品質を変えて量子化テーブルを書き写し、表計算ソフトにぶち込んでみた。

表計算ソフトを見ていても何も分からないので、とりあえず全ての値の平均値を計算してみると、何となく品質に近い値が出る。ベースになるテーブルも同じようにしてみて、これらの値を計算式に当てはめてみた。
100-(量子化テーブルの平均値×50÷ベーステーブルの平均値)とすると、品質が100〜50まではほぼピッタリの値となる。これが正解?なんか安易。
でも、Info_JPEGだと品質を100にして保存したJPEGが品質99と表示されるが、これが再現できている。とりあえずこれでツールを作って色んな画像を解析して、Info_JPEGと同じ結果が出ればよし。としよう。

誰か正解を知っていたら教えて下さい m(_ _)m。