クリックしてウインドウを開き、必要に応じてウインドウ幅を調節して閲覧してください。
画像の圧縮について考えて見ます。
ただ、圧縮についての専門的な知識は私に有りませんし、ここでその必要も無いと思います。関心のある方は専門サイトを参照してください。
圧縮の方法、種類は「画像ファイル形式」の違いに直結します。
ここでは、CGビギナーの頭を悩ます「画像ファイル形式」の理解の為に、或いはホームページに配置する画像の、種類を選択する際の判断材料になれば、と言う程度に、圧縮の「考え方」を述べるつもりです。
画像圧縮の方法として、根本的に異なる2種類の方式に分類できます。
少し具体的に見てみましょう。
データ記述の構造部分を整理することで圧縮する方法です。
デジタル画像は、さまざまなビット値(カラー情報)を持つピクセルの配置です。
このピクセルのビット情報には変更を加えず、ピクセル配置の記述方法を整理し直すことで、データ量を圧縮する方法です。
画像情報 の内容そのものには手を触れていないので、圧縮の手続きをそのまま逆にたどることで、データを完全に元の状態に復元できます。
その為、この圧縮方法を「可逆的圧縮形式」と言います。
次に、可逆圧縮の考え方を理解する為の、2つの方式についてザッと見てみましょう。
例えば………
□□□■■□□□□□■■■■□□□■■■ と言う20個のピクセルの並びが有ったとします。
この場合□3■2□5■4□3■3の形に書き直すことが出来そうです。
「リンゴ、リンゴ、リンゴ」と書くよりも、「リンゴが三つ」と書くのが普通ですが、それと同じことです。
上記のように、同じ値のデータ(画像の場合、ピクセル)が、横方向に1個以上連続する状態を「ラン」と言います。ランレングスではピクセルの配置をそのまま記述する(これを、フルマトリックスと言います)のでなく、ランの状態を記述します。
上の例では、20個のデータが12個のデータで表すことが出来ました。つまり「圧縮」出来た訳です。
もう少しスマートな方法を考えて見ましょう。
上の例では、情報の種類は■□2種類だけ(つまり1ビット)です。この場合■□のランは、必ず交互に並びます。ですから最初のランが、■であるか、□であるか、だけ分かれば、後はランの長さだけ順に記述すれば良いことになります。
この考えで行けば、□325433 となり、7個のデータに圧縮出来ました。
そして、どちらも圧縮の手順を逆にたどることで、最初の20個のデータに完全復元できます。
ランレングス方式は素朴で単純な圧縮方法ですが、これだけではあまり圧縮効果は有りません。実は上の例では本当は圧縮になっていないのです。
※ モノクロ画像のピクセル1個は1ビットのサイズを持ちます。 上記のピクセル配置をフルマトリックスで表示した場合、11100111110000111000
となり、20ビットのメモリ領域で表示・保存が可能です。
しかし、ランレングスではこのビット情報を数字に置き換えて記述します。
数字1文字の記述には8ビット必要ですから(英数字は1バイト文字)、上記の場合、8*12=96ビット、或いは8*7=56ビットになり、圧縮になっていません。
※ また横方向に同じ値のピクセルが続く場合(つまりランが長い場合)は、圧縮効率が高いが、入り組んだ画像の場合、逆にファイルサイズが膨らむ場合が有ります。
それでも例えば文書データをファックスで送る時等、文字以外大半は白の地が連続しています。このような場合、単純なランレングス方式でも結構圧縮効果を上げることが出来ます。 そう言うことで、ファックス等はランレングス方式を使っている場合が有ります。
……と言うことで、現在ランレングスは圧縮の主役では有りません。又単独で使われることも殆ど有りません。ここでは可逆圧縮の考え方の説明として取り上げました。
現在、実際の圧縮技術の基本は 「ハフマン符号化」とそのバリエーションです。
これは、情報の出現頻度の多いパターンに短い符号、出現頻度の少ないパターンには長い符号を割り当てる。それにより、 個々のパターンに一定サイズの符号を割り当てる方式よりも効率よくデータを圧縮できるようにする。と言う考え方です。
□□□■■□□□□□■■■■□□□■■■
上と同じこのデータで言えば、□□□のランが2回出現し、他のランの出現頻度より多いので、□□□に 0 や1 の、短い符号を割り当てる、と言うことです。
※ そんなの簡単じゃん、出現頻度の多い順に、0,1,2,3………、と割り当てれば良いだけでしょ。
……と、思われそうですが、2進数の世界では、どうもそう簡単ではなさそうなのです。 (これは管理人の勝手な理解です。信用しないように)。
2進数ではそもそも使える符号(数字)が、0と1の2つしか有りません。
出現頻度の多い順に、0、1とつけたら次は10となり、どんどん桁数(文字数)が増えるので、この「順番」と言うのは10進数以上に大きな意味を持つ(のではないだろうか)。
2進数で表現されるデータは、最初からそのデータを表すビット数が決まっていて、個々のデータは本来同じ長さ(固定長符号)の筈です。例えば同じ、黒、白でも……、
モノクロ1ビット画像の黒は、0、白は、1ですが、
グレースケール8ビット(1バイト)画像の黒は、00000000、白は 11111111です。
フルカラー24ビット画像の……、
黒は、00000000 00000000 00000000 であり、
白は、11111111 11111111 11111111 で表されます。
つまり同じデータの中で、出現頻度ごとに、異なる長さの符合(可変長符号)を割り当てる、と言うのは思っているより簡単ではない(のではないだろうか)。
そんなこんなで、実は色々難しい計算や技術(要するにアルゴリズム)が有るようです。しかしここでは、そう言うことに立ち入るつもりも知識も有りません。
興味のある方は、専門書、サイトを参照して下さい。
脳ミソが「圧縮」され、不可逆状態になること請け合いです。
ハフマン符号化は、データ圧縮の基本として、可逆的圧縮法だけでなく圧縮全般に広く使われている技術です。
LHA、Zip等の圧縮形式は、文字にも画像にも幅広く使われている圧縮方法ですが、当然可逆的圧縮で、全てこの圧縮法の仲間、バリエーションです。 画像であれテキストであれ、とりあえずある程度の圧縮はやってくれます。
GIF画像形式はこの圧縮方式です。
「Web画像形式と保存1-GIF」参照。
可逆的圧縮法が、ピクセルのカラー情報そのものには手を付けず、いわばその記述構造を整理しなおしただけなのに比べ、非可逆的圧縮法は、カラー情報そのものを間引いて廃棄することで画像サイズを圧縮します。
従って圧縮後の画像を、元に戻そうとしても完全には復元できません。又圧縮や解凍を繰り返すたびに画質は劣化します。
情報の再現性が完全ではない 、などと言う圧縮法が役に立つか、と言うことですが、確かにこの圧縮方法は、テキストやプログラム等のデータには使えません。
この圧縮方法が適用できるのは、「画像(静止画及び映像などの動画)」「音声」に限られます。これらの 情報は全て、人間の感覚器官を通して直接認識される情報です。
人間の目は次のような特性を持っています。
つまり色調変化のデータ、或いは変化の激しい部分のデータを多少廃棄しても、人間にはその違いを区別することが難しい、言うことになります。
こういう特質を利用することで、画質の劣化をあまり「感じさせず」なおかつ高い圧縮が実現できます。
不可逆圧縮の手順を、大雑把に言えば次のようになります。
非可逆圧縮の代表はJPEGです。