じじぃの「科学夜話・画像圧縮法・JPEGのしくみとは!すごい数学」

JPEG DCT, Discrete Cosine Transform (JPEG Pt2)- Computerphile

動画 YouTube
https://www.youtube.com/watch?v=Q2aEzeMDHMA

JPEG converts an image into chunks of 8x8 blocks of pixels


Understanding and Decoding a JPEG Image using Python

July 14, 2020 Yasoob Khalid
●Discrete Cosine Transform & Quantization
JPEG converts an image into chunks of 8x8 blocks of pixels (called MCUs or Minimum Coding Units), changes the range of values of the pixels so that they center on 0 and then applies Discrete Cosine Transformation to each block and then uses quantization to compress the resulting block. Let’s get a high-level understanding of what all of these terms mean.

We apply DCT to each component of a pixel separately. The output of applying DCT is an 8x8 coefficient matrix that tells us how much each cosine function (out of 64 total functions) contributes to the 8x8 input matrix.
https://yasoob.me/posts/understanding-and-writing-jpeg-decoder-in-python/

『世界を支えるすごい数学――CGから気候変動まで』

イアン・スチュアート/著、水谷淳/訳 河出書房新社 2022年発行

10章 はいチーズ! より

JPEGのしくみ

私は時代遅れの人間で、何と10年ほど前の写真技術を使っている。恥ずかしい限りだ! スマホをときどきカメラとして使うくらいには技術に強いが、反射的に使えるほどでもないので、インドの国立公園にトラを見に行くなど本格的観光旅行のときには小型の全自動デジタルカメラを持っていく。そのカメラはIMG_0209_JPGといった名前の画像ファイルを生成する。JPGという識別子は、このファイルがJPEG(Joint Photographic Experts Group(共同写真専門家グループ)の頭文字)形式であることを表していて、どのデータ圧縮システムが用いられているかを指定している。JPEGは工業規格の1つだが、何年にもわたって改良が重ねられてきて、いまでは何種類かの形式に分かれている。
JPEG形式では少なくとも5つのステップが用いられ、その多くで前のステップのデータ(ステップ1ではもとのRAWデータ)がさらに圧縮される。次の圧縮のために再コード化するステップもある。デジタル画像はピクセルと呼ばれる何百万個もの小さな正方形(画素)から構成されている。RAWデータではすべてのピクセルに色合いと明るさの両方を表すビット列が割り降られている。色合いと明るさは、赤・緑・青の3つの成分の比として一緒に表現されている。3つの成分がすべて小さいと薄い色に、大きいと濃い色になる。それらの数は、人間の脳による画像認識のしかたにもっと良く対応した3つの数に変換できる。1つめの数である輝度は全体的な明るさを表し、黒から灰色、白になるにつれて値が大きくなる。色の上方をそぎ落とせば、昔ながらの白黒写真(実際にはさまざまな濃さの灰色からなる写真)になる。あとの2つの数は色度と呼ばれ、輝度と青の光量との差、および赤の光量との差を表す。
赤をR、緑をG、青をBと記号で表せば、もとのR、G、Bの値が、輝度R+G+Bと2つの色度(R+G+B)-B=R+Gおよび(R+G+B)-R=G+Bに変換される。R+G+BとR+GとG+Bが分かればR、G、Bを計算できるので、このステップは無損失である。
次のステップ2は無損失ではない。ここでは色度のデータを、解像度を下げて小さな値に切り詰める。このステップだけでデータファイルの大きさが半分になる。このようにしてもかまわないのは、カメラの”視覚”に比べて人間の視覚系が明るさに対しては敏感だが、色の違いに対しては鈍感だからである。
ステップ3がもっとも数学的である。ここでは、第9章で医療用スキャナーとの関係で説明したフーリエ変換のデジタルバージョンを使って、輝度の情報を圧縮する。もともとのフーリエ変換は信号をその振動数成分に、あるいはその逆に変換するが、ここではそれに手を加えてグレースケールの画像を扱えるようにしている。グレースケール画像を単純なデジタル形式で表現し、その画像を8x8ピクセルの小さなブロックに分割する。1つ1つのピクセルは64通りの輝度の値を持つ。フーリエ変換のデジタルバージョンである離散コサイン変換では、この8x8のグレースケール画像を図(画像参照)に挙げた64種類の基本画像に係数を掛けて足し合わせたものとして表現する。その係数がそれぞれの基本画像の”振幅”となる。これらの基本画像はさまざまな幅の縞模様やチェス盤のように見える。8x8ピクセルのブロックは必ずこの方法で表現できるので、このステップも無損失である。それぞれの基本画像は、横軸x、縦軸yがそれぞれ0からまでの値を取るとして、さまざまな整数mとn対してcos mx cos nyをづ連続に表したものとなっている。
離散フーリエ変換は無損失だが、ステップ4の準備という意味合いがある。ステップ4も、人間の視覚の鈍感さに由来する冗長性を利用している。画像の中の大きい領域にわたって明るさや色合いが変化していると、我々はそれに気づく。しかし小さい領域の中で変化しているろ、視覚系がそれを均してしまって我々にはその平均しか見えない。印刷された画像は、白い紙の上に打った黒い点のパターンによってさまざまな濃さの灰色を表現しているが、それでも離れて見れば何が写っているか認識できる。人間の視覚系がこのような特徴を持っているために、きわめて細かい縞模様はあまり重要でなく、その振幅は低い精度で記録してもかまわない。

ステップ5では、64通りの基本画像をより効率的に記録するための、”ハフマン符号”と呼ばれる技術的な手法を用いる。1951年にデイヴィッド・ハフマンがまだ学生のときに考案した手法である。ハフマンはもっとも効率の良い二進コードに関する期末レポートを書こうとしていたが、既存のどんなコードについてもそれが最適であることを証明できなかった。そしてあきらめかけたそのとき、新たなコード化の方法を考えついて、それが最適であることを証明したのだ。おおざっぱに言うと、一連の記号を二進列で表し、それを辞書としてメッセージをコード化する。このとき、コード化したメッセージの長さができるだけ短くなるようにしなければならない。
例としてアルファベットの各文字を考えよう。アルファベットは26文字なので、A=00001、B=00010というように長さ5のビット列を割り当てることができる。5ビット必要なのは、4ビット列が16種類しかないからだ。しかしこれでは、Zのように稀にしか現れない文字がEのように頻出する文字と同じ個数のビットを使うことになるため非効率である。それよりも、Eには0や1のような短いビット列を割り当てて、出現頻度の低い文字になるにつれて徐々にビット列を長くしていったほうがいい。しかしそれだとコード列の長さがまちまちになるため、ビット列をどこで区切って文字ごとに分けるかを受け手に知らせるための情報がさらに必要となる。各コード列の先頭に接頭符号(プリフィックス)を付け加えてもいいが、ハフマン符号では接頭符号は必要ない。各コード列がもっと長いいずれかのコード列の先頭には現れないようになっているからだ。もしそうでないと、そのコード列がどこで終わるかが分からなくなってしまう。Zのような稀な文字を表すのに必要なビット数は増えてしまうが、それは稀にしか現れないため、Eを表すビット列が短くなる分でそれを十二分に補える、そして典型的なメッセージの全体の長さは短くなる。
    ・
カメラがJPEGファイルを生成するときには、撮影するやいなや内臓の電子回路がこれらの計算をすべて瞬時におこなう。この圧縮プロセスは無損失ではないが、ほとんどの人はけっして気づかない。そもそもコンピュータの画面やプリントアウトした紙は、念入りに調整しない限り完全に正確な色あいや明るさにはならない。もとの画像と圧縮後の画像を直接見比べればもっと違いが分かるが、ファイルサイズをもとの10%に圧縮しただけでは専門家ではないと気づかない。一般の人だと約3%にまで圧縮してようやく気づく。そのためJPEGでは同じメモリーカードにRAWデータの10倍の画像を保存できる。舞台裏で瞬時におこなわれているこの複雑な5ステップの手順がその魔法の秘訣で、そこには少なくとも5つの異なる数学分野が用いられているのだ。

                  • -

どうでもいい、じじぃの日記。
私の家のテレビには、画像再生用の機器が取り付けている。

「もとの画像と圧縮後の画像を直接見比べればもっと違いが分かるが、ファイルサイズをもとの10%に圧縮しただけでは専門家ではないと気づかない。一般の人だと約3%にまで圧縮してようやく気づく。そのためJPEGでは同じメモリーカードにRAWデータの10倍の画像を保存できる」

たとえば、圧縮後の画像を完全に元に戻せるか、というとかなり欠落した画像なのだそうだ。
画像圧縮技術は、人間の視覚の限界をうまく利用しているんだろうなあ。
まあ、スマートフォンのように、便利になったものが世の中にはたくさんある。