khurata’s blog

khurata’s blog

情報の圧縮

(もともと「Yahoo!知恵袋」の「知恵ノート」だったものを転載しています)
(最終更新日時:2014/6/3)投稿日:2012/4/21

はじめに

 以前書いた知恵ノート「情報量・ビット・バイト」 https://khurata.hatenablog.com/entry/2019/04/04/044010 では、情報量の基本の「き」について述べてみましたが、本ノートでは、普段我々がよく目にしているけれどもあまり意識していない(かも知れない)情報の圧縮について、基本を書いてみようと思います。

 

圧縮するのは何のため?

 コンピュータが扱う情報は、文字でも音声でも、全てディジタル・データです。

 そして、我々が普段目にするデータのうち、文字でないものには、「圧縮」という技術が、よく使われています。

 JPEGGIFPNG などの画像、MP3 などの音声、MPEG地デジDVDブルーレイなどの動画、これらの多くは、圧縮されたものです。

 簡単に言うと、圧縮とは情報容量を節約する技術です。 ここで注意すべきは、情報を節約、ではなく、情報容量を節約する、という事です。
 後ほど述べるように、圧縮には「情報量を節約する圧縮」も有るのですが、圧縮の最大目的は、情報容量を節約する事です。

 知恵ノート「情報量・ビット・バイト」 https://khurata.hatenablog.com/entry/2019/04/04/044010 では、新聞のたとえを用いて、「情報容量は全体の字数」であり、「情報量は内容の変化の度合い」だと書きました。

 つまり、実質の情報量が少なくても、大きな情報容量を「無駄に使う」という事は有るわけです。 その無駄な容量を節約して、全体の情報容量を本当の情報量に近付けよう、というのが、圧縮技術の主目的です。
 昨日と1文字しか違わない新聞だったら、小さい紙にすれば良いじゃないか、というわけです。 これなら配達する人もラクだし、印刷する人も、読む人もラク、しかも紙も節約出来て、良い事ずくめですね。

 たとえば国策として推進された地デジの「理由」は、電波帯域の節約でした。 アナログ放送だと限られた画質で十数チャンネルしか確保出来なかったところに、デジタル圧縮技術を使うと、高画質で多チャンネルが実現するわけです。
 しかし、そう言われても、なぜそんな事が出来るのか、理解している人は多くなかったのではないでしょうか。 この謎を解くカギが、「圧縮」なのです。

 

可逆圧縮

 私が持っているデジカメで撮った画像の中に、「横 2592×縦 1944ピクセル、フルカラー、ファイルサイズ 2,934,865バイト」というものがあります。 これを話のネタにしてみます。

 ピクセル pixel は、画素と訳され、画像を構成する細かい点の事です。 ドット dot と言う人もいます。 くだんの画像は、横 2592個×縦 1944個= 503万8848個という、たくさんの点の集まりです。
 デジカメの性能を表す言葉に「メガピクセル」というのがありますが、これはメガ(100万)ピクセル、100万個の点という意味です。 私のデジカメは5メガピクセルというわけです。

 フルカラーというのは、定義によっていろいろあるのですが、多くの場合、24ビットカラーの事です。 24桁の2進数は、10進数換算で 0~1677万7215 まで表せるので、24ビットカラーとは、約 1677万色が表せますよ、という意味です。
 画像を構成する「横×縦×ビット数」のうち、「×ビット数」を画像の「奥行き」みたいに考えて、色数を「ビット深度 bit depth」なんて言ったりもします(たとえばビット深度が1なら、2色しか表せないのでモノクロ2値画像になります)。

 よって、くだんの画像は、ピクセル 503万8848個×24ビット=1億2093万2352ビット=1511万6544バイトの情報容量がある……はずです(1バイトを8ビットとした場合)。

 ……が、ファイルサイズは、「2,934,865 バイト」、つまり約 293万バイトしかありません。 おかしいですね。

 他の画像を見てみますと、ピクセル数、色数は同じなのに、「2,956,534バイト」、「1,485,241バイト」と、まちまちです。 どうしてこんな事になるのか、その答えは、「圧縮されているから」です。

 デジカメ画像は、拡大して見てみれば、「同じ色のピクセルが、何個も続く」ところがあったり、色の変化がなだらかな箇所があったりします。
 言い方を変えると、「次に出現するピクセルの色が、今のピクセルと同じ・似ている確率」が高い箇所がたくさんあります。 ……確率が高ければ、情報量は小さくなりますね!
 「変化の小さいものは、情報量も小さい」……そう、色の変化が少ないという事は、情報量も少ないって事なのです。

 全ての隣接するピクセルが、互いに全く違う色ならば、大きな情報量を持つわけですが、それは我々の目から見ればランダムな色の細かい点が続く画像、砂嵐のようなノイズ画像にしか見えないでしょう(※1)。
 こういう画像を格納するなら、確かに 1511万6544バイトの情報容量(器の大きさ)が必要なのですが、「ノイズでない画像」は、器の大きさを抑える事が出来るのです。

 たとえば「黒のピクセルが 100個続く」箇所では、「黒黒黒黒…」と、「黒」を 100回書き連ねても構いませんが、「黒が 100回出る」と書いても良いわけです。 前者は 100文字ですが、後者はわずか8文字です! 画像の各ピクセルを、このように表現すれば、容量が「圧縮」出来るわけです。 元々の情報量が少ないから出来る芸当です。
 圧縮の程度は、画像の内容によって異なりますから、圧縮された画像の容量すなわちファイルサイズは、まちまちになるのです。

 こうして圧縮されたデータは、「伸張」という処理を経て、元の画像に復元されます。 「黒が 100回出る」という圧縮済みデータを読み込んで、「黒黒黒黒…」と、黒のピクセルを 100個、描き出すわけです。

 伸張によって、元と全く同じ情報が再現される圧縮を、「可逆圧縮」と呼びます。 可逆圧縮は情報量が変わらないので、圧縮しても劣化しません。 たとえば PNG、GIF、PSD などは可逆圧縮を用いた画像データです。

※1
 知恵ノート「情報量・ビット・バイト」https://khurata.hatenablog.com/entry/2019/04/04/044010  では、情報量は意外さ・面白さに比例する、などと書きましたが、「意外の連続」を極めれば「ノイズ画像」になり「意味を見出せなくなる」……これはこれで、ちょっと面白い話だと思いませんか? 「お笑い芸人がギャグを作り込みすぎた結果、笑いのツボが分からなくなってしまった」、みたいな感じでしょうか。
 圧縮は、「意味の分かるデータ」から、「意外の連続性を高めたデータ」を作るのだ、とも言えます。 ですから、我々は圧縮したデータを見ても意味が分かりません。 「圧縮するのは何のため?」項では、文字でないものに圧縮がよく使われる、と書きました。 文字データは圧縮出来ますし、転送には圧縮データがよく使われるのですが、圧縮した文字は、我々には読み取る事が出来ません。 

 

不可逆圧縮非可逆圧縮

 情報量を変えずに情報容量を節約するのが可逆圧縮ですが、「情報量も変えてしまえ、そうすればますます全体の容量を節約出来るぞ」という、ちょっと乱暴な感じの圧縮方式を、不可逆圧縮、ないし非可逆圧縮と呼びます。

 たとえば画像のピクセルが、「黒 100%黒 98%黒 99%黒 100%…」と続いている画像は、人間の目で見れば、「黒 100%が4回出る」のとほとんど同じに見えます。
 実際の写真では、人肌や空など、ごく少しずつ色が変化しているところが、けっこうあります。 ですから、圧縮処理において、「今着目しているピクセルと、ある程度近い範囲の色」をまとめて圧縮すれば、かなり容量が減らせるのです。
 この「ある程度」を大きめに取れば、情報量が減るため、容量も減らせますが、画質は劣化します(圧縮率が高い)。
 「ある程度」を小さめに取れば、情報量があまり減らないため、容量もあまり減らせませんが、画質はそこそこ保たれます(圧縮率が低い)。
 「ある程度」がゼロであれば、それは可逆圧縮になります。

 このような不可逆圧縮の代表的なものが JPEG 画像です。 他にも、音声の MP3 や MP2AACAC-3VorbisDTS や、動画の H.264MPEG-1MPEG-2DVMotionJPEGWMVRealVideoQuickTime なども不可逆圧縮です。

 画像は、1枚ずつ使われる事が多いため、可逆圧縮でもなんとか実用的ですが、1秒間に数十枚の画像を使う動画や、1秒間に多くの情報を流す音声は、可逆圧縮でも容量が大きくなってしまうため、不可逆圧縮がよく使われています。

 

圧縮の次元

 先ほど挙げた画像の圧縮は、「黒黒黒黒…」を「黒が 100回出る」に変えるというものでした。 ピクセルを左端から右へ見ていって、右端に達したら1つ下段の左端に戻る、という「走査 scan」によって、1枚の画像を、1本の線のように扱うわけです。
 つまり、この圧縮は、1次元圧縮だと言えます。

 しかし、画像は、両隣りが似ている事もあれば、上下の隣りが似ている事も多々あります。 つまり、左右の関係を見るだけでなく、上下の関係も見れば、より効果的に圧縮出来るだろう、と考えられます。 2次元圧縮です。
 不可逆圧縮 JPEG では、圧縮率を上げていくと、画像のあちこちに四角形が出現します。 これをブロックノイズと呼び、画質の面では嫌われるモノなのですが、これは圧縮処理で「この左右と上下は似ているからまとめよう」とされた部分です。

 動画の場合、画像が時間軸に沿って何枚も並びます。 1秒間に 30枚もあれば、ある時点の静止画1枚と、次の1枚は、かなり似ている事が多いでしょう。 つまり、「同じ位置のピクセル」の、「直前と今」を比べて圧縮する事も出来るわけです。
 横と縦と時間で圧縮出来るので、これは3次元圧縮です(※2)。

 圧縮出来そうな次元を探して、次元数を増やせば、圧縮率を高める事が出来るのですが、良い事ばかりとも限りません。
 たとえば動画の時間軸圧縮の場合、「何分何秒時点の静止画は、その直前と似ているから、直前画像の情報を使って圧縮」するわけですが、その直前画像もまた、「さらに直前の画像」の情報を使って圧縮されているわけです。
 ですので、「何分何秒時点の静止画」だけをすぐに出したい、という事が、ちょっと難しくなります。
 動画編集をされている方はよく御存知だと思いますが、MPEGH.264 で特定のフレーム、フィールドだけ切り出したいのに、再エンコードしないと出来ない、というのは、こういう事情によるのです。

※2
 かつて、ビデオデッキなどのAV家電では「3次元ノイズリダクション」とか「3次元Y/C分離」という機能がもてはやされた事がありました。 「3次元ノイズリダクション」とは、あるピクセルの左右(前後)ピクセルと上下ピクセル、そして直前の同位置ピクセルを見て、ノイズを軽減させるという手法なのです。 

 

出現確率を利用した圧縮

 知恵ノート「情報量・ビット・バイト」 https://khurata.hatenablog.com/entry/2019/04/04/044010 では、文字の情報量について述べました。 「digital data」という文字の並びは、7ビット× 12文字= 84ビットである、とか、「ディジタル・データ」とう9文字の並びはシフト JIS 符号化によって9文字× 16ビット= 144ビットになる、とか……。

 しかし、我々が普段使う文章における文字は、その全てが同じ確率で出現するわけではありません。 たとえば英語圏では、空白と e が、他の文字と比べて高い確率で使われる事は有名です。 情報量は、確率の別の表現形ですから、異なる確率のものを、同じ情報量の器に入れるのは、実は無駄があるのです。
 より具体的に言えば、空白や e は、他の文字のように、7ビットも要らないはずだ、という事です。

 そこで、文字の出現確率をあらかじめ決めておいて、それに従って情報量を割り当てることで、情報容量を節約する、という圧縮方法も考え出されました。

 「情報全体を、ある単位ごとに区切って、単位ごとの内容の出現確率に応じて情報容量を割り当てる」という考え方は、文字情報だけでなく、画像や音声などにも応用されています。

 この圧縮方法を使うには、あらかじめ、「全体のうち、どれくらいを1単位にするか」、「各単位ごとに、どういう内容値が出現するか」を決めて・知っておかねばなりません。 動画のエンコードには、1パスと2パスがありますが、2パス・エンコードの1パス目は、このような「圧縮に使えそうなデータ」を収集しているのです。

 

まとめ

 もし圧縮技術が無かったら、我々のデジタル生活はかなり不便なものになります。 動画・音声ファイルはバカでかくなり、転送には時間がかかり、DVD は1枚に数分しか入らず、デジカメも数枚しか撮れないでしょう。
 圧縮についての基本を知ることは―特に、よく使われている不可逆圧縮について―、普段何気なく使っていた・見過ごしていたコンピュータやディジタル機器類を、より賢く使う事につながるでしょう。

(転載以上)