見出し画像

画像データ圧縮はこれまた違う(390号)

データ圧縮の話も今回で5回目です。
さすがに飽きてきたという方もおられますかね。
今回がラストですので、しばしのおつきあいを。

最後を飾るのは、非可逆圧縮というかなり常識はずれな技法のお話です。

この非可逆圧縮というのは、主に画像や動画で使われている圧縮方法です。

前回の動画のデータ圧縮で、次の2つのアプローチがあると書きました。
 A. フレーム内圧縮
 B. フレーム間圧縮

前回は動画ならでは圧縮技法として「B. フレーム間圧縮」)のお話をしました。
なので、今回は画像圧縮である「A. フレーム内圧縮」のお話をします。

可逆圧縮と非可逆圧縮

可逆圧縮は元データを100%再現できる圧縮方法で、非可逆圧縮は元データの一部を失っても良いとする圧縮方法です。

英語では、可逆圧縮をlossless compression((データを)失わない圧縮)、非可逆圧縮を lossy compression(欠けている圧縮)と言います。英語の方がわかりやすいですよね。

そう、非可逆圧縮というのは、データが欠けちゃうんです。
圧縮するともはや、元のデータには戻せなくなります。

これって不思議ですよね。
元に戻せない圧縮方法なんて役に立つシーンがあるのでしょうか?

Excel表を売上表を圧縮して送ったら数字が変わってたら困ります。
いや、Excelに限らず、ビジネス文書でも、私的な手紙でも内容が変わっちゃうような圧縮方法なんて使いようがありません。

が、完全に元通りでなくても許される場合があります。
例えば、写真や動画がそうです。

元の映像からほんの少し(目で見てもわからない程度に)色が違っていても、さほど困りません。それでデータ容量をグッと小さくできるなら、むしろ歓迎されるでしょう。

そう、非可逆圧縮というのは、主に音声、画像、動画といった人が視聴するコンテンツに用いられる圧縮方法なのです。

いくつか例を挙げます。

非可逆圧縮の例:
 ・画像形式:JPEG(今回解説します)
 ・動画形式:MPEG-4/H.264(389号で解説しました)
 ・音声形式:AAC(Appleが開発した音声形式)、MP3(前回の余談参照)
可逆圧縮
 ・画像形式:PNG、GIFなど(後述。6章参照)
 ・汎用形式:ZIP、gzipなど(388号で解説しました)

今回は、いろいろある非可逆圧縮の技法のうち、画像データの圧縮方法についてお話します。

JPEGという形式

画像の形式には様々な形式がありますが、今回はその中でも代表的であるJPEG(ジェイペグ)形式についてお話します。

このJPEGって、前回お話したMPEGとよく似た名前ですよね。実際、MPEG(Moving Picture Experts Group)が組織名(チーム名)の略称だったのと同様にJPEGも Joint Photographic Experts Group という組織名(チーム名)の略称です。

そのチームが、1992年に決めたのが、JPEGと呼ばれる画像形式です。
当時乱立していた画像フォーマットの集大成的な側面もあるため、ものすごくいろんな規定が含まれていまして、規格としてもかなり大きな部類に入ります。

このJPEG形式ですが、主に写真データを高品質にかつ高圧縮に保存することを主眼として規格が作られました。そのため、イラストのようなエッジ(境界線)がハッキリしている画像は苦手で、輪郭がぼやけやすかったりします。

そう、JPEGは画像の特性や人間の目の特徴をうまく利用して、なくてもなんとかなるデータを減らしてしまおうという考え方のデータ圧縮方法なのです。

ハフマン符号などは、データの繰り返しに着目して圧縮、MPEG4などの動画は同じデータを削減して圧縮、JPEGなどの画像は「データを近似値に変えて」データを圧縮します。

それぞれ、考え方が大きく違うんですね。

人間の目はごまかせる

人間の目には「明るさの変化には敏感だが、色の変化には鈍感」という特性があります。

例えば、赤から紫へのグラデーション画像を作るとしますと、大きさにもよりますが、10色もあれば、スムーズなグラデーションに見えます。

ところが、これが白から淡いグレイへのグラデーションとなると、10色では全然足りません。色の境目に線があるように感じてしまいグラデーションには見えないのですね。それっぽく見せるにはもっとたくさんの中間色(例えば30色程度)が必要です。

これからわかることは、色の違いはさほど精密に再現しなくてもゴマかせるが、明暗の違いははかなりゴマかしにくい、ということです。

JPEG形式はこの人の目の特性をフル活用します。
画像をまず、色情報と輝度情報に分けます。
輝度情報はちゃんと再現できるように保存し、色情報は減らします。つまり、似たような色を一つの色にまとめちゃいます。

もちろん、あんまり極端に色をまとめちゃうと、ほとんど色が変わりませんから、変化の乏しいのっぺりした絵になります。
どこまで色の同一視をさせるか?というのはJPEG画像を保存する時に圧縮率などで指定できます。

ですので、多少画質を犠牲にしてでもファイルサイズを小さくしたい時は圧縮率を高く、そうでない場合には圧縮率を低く指定すれば、用途に合った画像が生成できるというわけです。

DCTというマジック

DCT(Discree Cosine Transform:離散コサイン変換)は数学的な技法のことです。
この技法はJPEGに限らず、多くの画像、音声、動画などの作成時に使われています。
これをうまく使うと、めちゃくちゃデータを小さくできます。

そのDCTについてお話します。
が、その手順はかなりややこしい(わかりにくい)です。

まず、画像全体を小さなブロック(8x8ドット)に区切ります。
で、そのブロックの各ドットの情報から近似値を得る数式を作って、その数式を圧縮データに入れておこうという方式です。

こう書くと難しそうですが、要は個々の値ではなく、式で覚えておいて、後で計算する方が覚えておくことはコンパクトだよね、ということです。
例えば、税金の計算などで、何ページもの表を作るより、計算式を提示する方が、はるかにコンパクトですよね。それと同じです。

さて、DCTの内部の話になると恐ろしく複雑な計算の話になる(アンド、筆者の理解も追いついていない)ため、ざっくりと書きます。

ここでいう計算に使っているのが、コサイン関数(高校とかの三角関数で出てくるアレ)です。
さすがに、1つのコサイン関数で、8x8ドットのあらゆるパターンには対応できません。
なので、JPEGでは64コものコサイン関数を駆使して網羅することになっています。

「チョットマテ。64コの関数の情報(いわゆるパラメタ)ってかなりの量でしょ?8x8=64ドットの全情報を覚えるのと変わらんやんか」
と思った方。スルドい。

確かに、64コの関数のパラメタを全部圧縮データに入れちゃうと、大した圧縮率になりません。
ところがですね、画像(特に写真)には「急激な色の変化は少ない」って特徴があるんですね。

普通の写真をクローズアップすればわかりますが、大半がゆるやかなな色調や明るさの変化じゃないですか。白の隣に黒みたいなパターンは極めて少ないわけです。

ましてや、8x8ドットという小さなブロック単位で考えると、激しい変化はほぼありません。(仮に白黒のカンバンを写しても、白→淡いグレイ→グレイ→濃いグレイ→黒と段階を踏むことになり、いきなり白→黒となるケースは稀です)
そういった極端な変化は画像のノイズである場合も多いので、むしろ消してしまった方がキレイな画像になる場合すらあります。

64コの関数で表現しているからといって、全部は覚えなくていいんです。激しい変化を示すような関数の情報は圧縮データから消しちゃっても問題ありません。
すると、ゆるやかな変化を示す関数の情報だけを圧縮データに入れることになりますから、元に戻す(伸長)時は、ゆるやかな変化の画像になるというわけです。

もちろん、圧縮データに入る関数パラメタが少なければ、データ圧縮率も上がる理屈です。元は64コの関数でも、これを数個に減らせられれば高い圧縮率が期待できますよね。

JPEGの圧縮率

ここまでの話でおわかりかもしれませんが、JPEGには固定的な圧縮率というのはありません。
圧縮データを作る時には、どこまで圧縮するか?、逆に言えば元データからの乖離をどこまで許すか?を決められるからです。

圧縮率を高くすれば、それだけ上述の関数パラメタ数を減らすことで、画像は単純化され、結果として画質が落ちることになります。

画質を保ちたければ、後述のPNGのような可逆圧縮をサポートした形式での保管が適切でしょう。

代表的な画像形式

代表的な画像形式を3つほど紹介します。

JPEG:
ジェイペグ。写真では一番利用されているファイル形式です。
上述のように非可逆圧縮の代表的な画像形式で、特に写真のようなゆるやかな変化が多い画像で多用され、イラストのように境界線がくっきりしている画像ではノイズが出やすいため、PNGなどの他の形式が好まれるようです。
スマホの写真にもJPEG形式がよく採用されています。
余談ですが、ファイル名の拡張子にJPGを使う場合がありますが、これはずっと昔のWindowsが3文字の拡張子しか使えなかった時代の名残りです。

PNG:
Portable Network graphicsの略。ピン、ピングなどと読みます。
画像ファイルですが、これは可逆圧縮をサポートしています。
そのため、JPEGのように画像劣化がなく、イラストのようなデータでもノイズが出ることがありません。
最初はGIF(後述)というファイル形式が特許で守られているため、そのリスクがないファイルフォーマットとして規定されたものでした。そのため、PNGの利用には利用料などは不要です。

GIF:
Graphics Interchange Formatの略。ジフと読みます。
これも可逆圧縮形式です。
開発された時期が古いため、JPEGやPNGと違い、256色までのサポートです。
GIF形式については特許問題があり、一時(1990年代)は利用しづらい状況でした。
その課題解決のために作られたのが、上記のPNGでした。
とはいえ、2003年(日本では2004年らしい)に特許期間が終了しており、現在はライセンス料は不要となっています。

まとめ

データ圧縮の最終章として、今回は非可逆圧縮方式の代表格であるJPEG(ジェイペグ)形式についてお話をしました。

JPEGでは、元データの100%再現をあきらめることで、大巾なデータ圧縮を実現しています。これはデータを数式化することで実現されています。

また、画像や音声といった人が利用する前程のデータならではのデータ削減手法として、似た色については、複数の色情報を同一化(丸める)しています。

こういった技法を用いることで、通常の可逆圧縮より高い圧縮率を実現しています。

長々と続きましたデータ圧縮のお話は今回で最終となります。
次回もお楽しみに。

(この記事は2025年1月に執筆しました)

このNoteは私が主宰するメルマガ「がんばりすぎないセキュリティ」からの転載です。
誰もが気になるセキュリティに関連するトピックを毎週月曜日の早朝に配信しています。
無料ですので、是非ご登録ください。
https://www.mag2.com/m/0001678731.html
弊社の窓口( info@egao-it.com ) にメールをお送りいただいてもOKです。

いいなと思ったら応援しよう!