画像圧縮を理解する

Julius Uy
Julius Uy

フォロー
4月19日。 2019 – 7 min read

1980年代に、Microsoftはビットマップのデバイスに依存しない画像レンディション ソリューションを開発しました。 BMP ファイル フォーマットです。以前 Microsoft Paint を使用していた人は、単純なストロークとカラー塗りつぶしから生成される巨大なファイル サイズを楽しんでいたことでしょう。 したがって、1600 万色 (24 ビット) をサポートする 480×360 のビットマップがある場合、ビットマップのサイズは 4MB 以上になります。

図 1 – ビットマップ画像ファイルの構造 (https://en.wikipedia.org/wiki/BMP_file_format)

複数の高品質画像をレンダーしたい場合はもちろん理想ではありません。 それゆえ、質問がなされなければならない。 画像の視覚的な完全性を維持しながら、使用するリソースを少なくするようなビットマップ表現を最適化する方法はあるか」

その答えは「イエス」です。 ほとんどの場合、ユーザーは徹底性よりも視覚的な補助としての画像に関心があることがわかります。 たとえば、次のようなゴールデン ゲート ブリッジの画像が提供されたとします。

Figure 2 – Golden Gate Bridge

実際の橋ははるかに詳細であるが、ここで見たもので、その目的のためには十分であることを知っている。 ですから、ほとんどの人は、トレードオフが許容できる限り、視覚的な完全性とスピードをトレードオフしても構わないと思っています。 たとえば、主観的な視覚的品質の劣化が 1% であるにもかかわらず、ユーザーが 90% の容量削減を享受できる場合、ほとんどの場合、それは歓迎される取引です。

したがって、ビットマップを圧縮する際の重要な考慮点の 1 つは、視覚的区別のなさを最適化することです。 つまり、肉眼で違いを識別できないようなイメージの特定の要素を削除することです。 これは非可逆圧縮と呼ばれ、オンライン画像のビデオストリーミングで見られるほとんどのタイプの圧縮を構成しています。 これは、H.264、HEVC、HEIF、および JPEG コーデックが機能する方法です。

Figure 3 – Image Compression optimizes for visual indiscishability

PNG など他のタイプの画像はロスレス圧縮されます。 これは、元の画像の視覚的な完全性を維持しながら、同じものを表現するために消費するバイト数を少なくするという考え方です。 また、WebP など、非可逆圧縮と可逆圧縮の両方をサポートするファイル形式もあります。 なぜロスレス圧縮をするのでしょうか? 上記のように、画像に対して何を実現したいかに基づいています。 たとえば、アプリケーションのアイコンは一般に PNG (最近では、ベクター グラフィック形式) です。

Lossless 画像圧縮は、Lossy 圧縮とは対照的に、ファイル サイズが大きくなる傾向があります。 主な理由は、前者は後者よりも圧縮するための手段が少ないからです。 このブログでは、非可逆圧縮について説明します。

図 4 – JPEG 圧縮の概要
JPEG 圧縮で行われる一般的な手順は、ビデオ圧縮で今日まで行われています。 長年にわたり、アルゴリズムは改良されてきましたが、一般的な概念は変わりません。

STEP 1. 色空間の変換

画像の変換は、生の RGB 画像形式をそのクロマ (r および b) およびルミナンス (Y) 値に変換することから始まります。 これは、私たちの目は、色よりも輝度の変化に敏感であるという考え方です。 したがって、画像の視覚的な品質に顕著な影響を与えることなく、画像の色の範囲をダウンサンプリングすることが可能です。 これは、以下に説明するクロマサブサンプリングによって行われます。

STEP 2. クロマサブサンプリング

多くのゲーマーは、サブサンプリングがゲーム体験を最適化するために設定可能なノブの 1 つであることを思い出すかもしれません。 主なアイデアは、サブサンプリングが多いほど、ゲーム パフォーマンスが速くなることです。 J はサブサンプリングするピクセル数で、a は最上行のピクセル、b は最下行のピクセルを表します。

Figure 5 – Chroma Subsampling

4:4:4 では、4×2 ピクセルで、最初の行 (a) には 4 色、次の行も同様ということになります。 4:2:2 の場合、4×2 ピクセルにおいて、最初の行は 2 色で表され、2 番目の行も同じでなければならないことを意味します。 4:2:0の場合、4×2ピクセルで、最初の行は2色で表され、2番目の行は最初の行にあるものをコピーすることを意味します。

このようにクロマサブサンプリングによって、色の範囲を75%も削減することができます。 このステップでは、以下に示す信号に基づいて8×8チャンクの係数を割り当てます。

図6 – 離散コサイン変換(DCT). 左の画像は、元の画像に重みをつけるために使用される8×8の信号の参照です。 右の画像は、DCT を通過した結果の塊です。

ここでの考え方は、人間の目が DCT 基準の左上から右下へ移動するにつれ、知覚が難しくなることです。 そのため、通常、係数を割り当てる際に、左上が非常に高い値を得て、斜め下に行くにつれて下がっていくことが起こります。

図 7 – 元の塊(左) DCT 適用後の新しい塊(右)

STEP 4. 量子化

DCTが適用された後、次のステップは量子化と呼ばれるものです。 ここでは、得られたDCT値に対して、量子化テーブルを適用します。 このテーブルは圧縮アルゴリズムによって異なり、ソフトによっては使用する量子化量をユーザーが設定できるものもあります。 以下は標準的なテーブルです。

Figure 8 – A Standard Quantization Table

Nice that the digit go high as one moves from upper left to the lower right. これは意図的なものです。 量子化の考え方は、DCTから得られるデータを量子化テーブルで分割することです。 ここで、圧縮された画像は多くのデータを失うことになります。 右下の数値は高いので、除算すると最終的にほとんどの数値が0になります。 以下はその様子です。

図9-量子化テーブル(左)結果の値(右)

ステップ5 ハフマン符号化を用いたエントロピーコーディング

ハフマン符号化は圧縮における最後のステップとなります。 その仕組みを説明します。

ある範囲の数字をビットで表現したいとします。 さらに、その表現に消費するビット数が最小になるように表現したい。 その方法は、繰り返しの多い数字に低いビットを与えることです。 例えば、0をたくさん表現する場合は、一般的に低いビットを割り当てることになる。 ハフマン符号化についてのより詳細な説明は、こちらを参照してください。

ここでの考え方は、より長い値のセットを表現するために、より少ないビットを使用するということです。 ハフマン符号化は可逆圧縮アルゴリズムであり、テキストファイルの圧縮にも使用されます。 これを行うことで、元のサイズの 50% も節約することができます。

What’s Next?

圧縮は方程式の 1 部にすぎません。 画像をレンダリングする必要がある場合、画面に画像を表示する前に、圧縮プロセスを逆転させなければなりません。 今日まで、それはまだ利用可能な最も一般的な画像圧縮形式です。 HEIF (2013) や AVIF (2018) などの新しいアルゴリズムでは、圧縮アルゴリズムに使用できるピクセルの範囲が拡大されています²。 たとえば、一般に WebP は JPEG の約 70% のサイズですが、それでも画像の視覚的な整合性を維持することができます。 そのため、Google(WebPを開発した会社)は開発者に対して、画像をJPEGからWebPに再エンコードするように働きかけています。 しかし、WebPのサポートはJPEGに比べるとまだ少ない。

¹ “The BMP File Format”. プリプレス. 2019年4月19日にアクセスした。 https://www.prepressure.com/library/file-formats/bmp.

² Netflixは、2018年にAVIF画像の最初のセットを公開しました。 この投稿の時点でも、画像はここからアクセスできます。 Firefox や Microsoft などの企業は、提供するソフトウェアで間もなくこの画像をサポートする予定です。

.

コメントを残す

メールアドレスが公開されることはありません。