■ 補足資料 -画像の圧縮形式について-

JPEG形式

 JPEG形式はCCITT(国際電信電話諮問機関。現ITU-T)とISO(国際標準化機構)の画像符合標準化のための合同グループである「Joint Photographic Experts Group」という団体が提唱した、カラー静止画像の国際標準符号化方式です。細かい事を言えば、JPEGで標準化されているのは圧縮方式であって、実際にファイルに記録する方式は標準化されていません。そのためいくつかの規格が存在するのですが、現在ではC-Cube Microsystems社による「JPEG File Interchange Format」(JFIF)がデファクトスタンダードとなっており、普通、JPEGと言った場合はこのJFIFを指します。JPEG/JFIFでは最大65535×65535ドット、1677万色(24ビットカラー)の画像を扱うことができます。

 JPEGには2種類の圧縮方式が存在します。可逆圧縮のSpatial方式と不可逆圧縮のDCT方式です。しかし、Spatial方式は可逆圧縮のため圧縮率が低く(大体DCT方式の1/10くらいの効率です)、またサポートするマシンも少なかったことから、一般的にはDCT方式が普及しています。そこで、ここではDCT方式による圧縮について説明したいと思います。

 前の章で説明したように、GIFはデータそのものを数学的に圧縮することでファイルサイズを小さくしていました。しかし、JPEGにおける圧縮はそれとは根本的に違います。JPEGは人間の目に知覚できない範囲でデータを欠落させ、データ量を落としているのです。では、実際にその手順を見てみましょう。


Step. 1 表色系の変換とサンプリング

 「色について」の章でも述べたとおり、コンピュータでは一般に、色をRGBで表しますが、JPEGではまず最初に、これをYCbCrという表色系に変換します。これは色を輝度(Y)と色合い、すなわち青の色差(Cb)と赤の色差(Cr)で表現する方法です。RGBからYCbCrへの変換は、具体的には次の式に基づいて行います。

  Y = 0.299×R + 0.587×G + 0.114×B
  Cb = 0.564×(B - Y)
  Cr = 0.713×(R - Y)

 なぜこんな面倒なことをするのでしょうか。実は人間の目には、輝度の変化には敏感だが色合いの変化には鈍感という特性があります。つまり、色合いに関する情報をある程度カットしても、目に見える画像にほとんど変化はないのです。後で詳しく述べますが、JPEGの圧縮ではこれを一部利用しています。しかし、RGBのままでは、色情報だけを圧縮したくとも圧縮できないので、色を輝度と色合いに分ける必要があるのです。

 そして次に、画像を8ドット×8ドットのブロックに区切ります。つまり、640×480ドットの画像なら80×60個のブロックができます。しかし、これは輝度成分についての話です。色差成分については縦横1ドットずつ間引きながらデータを拾い(サンプリング)、ブロック化します。その結果、色差成分については40×30個のブロックしかできません。勘のいい方はもう分かったかもしれませんが、色差成分については隣り合う4ドットの値を、1つにまとめて記録してしまうわけですから、その分データが圧縮されることになります。この場合、たったこれだけのことでデータ量は半分になります。輝度成分に対して色差成分をこのように間引くことを「サンプリング比が4:1:1である」といいます。

 また、色差成分を水平方向だけに間引くことや、まったく間引かないことも可能で、この場合、それぞれ「サンプリング比が2:1:1である」、「サンプリング比が1:1:1である」などといいます。サンプリング比が2:1:1の場合、データ量は元のデータの2/3になります。サンプリング比が1:1:1の場合は、当然データ量は元のままです。


Step. 2 離散的コサイン変換と量子化

 次のステップに入る前にちょっと「波」についておさらいしておきましょう。

 ある物理量がある規則をもって変動するとき、これを「波」といいます。下図は最も基本的な波である正弦波ですが、これは「振幅」と「周期」で表されます。そして、このグラフで横軸に表されている単位物理量あたりの波の数を「周波数」といいます。別のいい方をすれば、周波数は周期の逆数です。

振幅と周期
Fig.1 振幅と周期

 さて、下の2枚の絵を見てください。白と黒とが交互に、すなわち「明度」が変動していますね。これは波に他なりません。つまり、画像に対しても波という概念を適用することができます。そして、この波の持つ周波数を「空間周波数」といいます。簡単に言えば、空間周波数は画像の周期構造の細かさを表す数値です。左の図は白と黒とが広い間隔で分布しています。つまり「空間周波数が低い」ということになります。右の図は逆に、白と黒とが細かく交互に現れており、「空間周波数が高い」といえます。また、画像全体が一様な色だった場合は、周期が無限大、すなわち空間周波数は0ということになります。

空間周波数
Fig.2 画像と空間周波数
左は空間周波数の低い画像、右が空間周波数の高い画像です。実際には画像は2次元に広がっているので、グラフはX軸、Y軸に空間座標、Z軸にシグナル強度を取った3次元のグラフとなります。

 このように画像は波として捉えることができるわけですが、どんな形の波でもsinやcosの組み合わせで表すことができます。これが大学の数学などで出てくる「フーリエ変換」です。そしてJPEGではこのフーリエ変換の仲間の「離散的コサイン変換(DCT : Discrete Cosine Transform)」というものを使って、さきほど8×8ドットに分割したブロック内の画像を計64個のコサインカーブに分解し、「高周波成分と低周波成分がどのくらいの割合で含まれているのか」というデータに置き換えます。「離散的」というのは「連続でない」、すなわちデジタルのことです。

 だんだん難しくなってきましたが、もうちょっと我慢してください。

 今、漠然と「高周波成分」とか「低周波成分」と書きましたが、では、これは一体画像の何に相当するのでしょう?先程の空間周波数の話を思い出してください。細かく濃淡が分布しているものほど周波数が高く、ベタに近いほど周波数が低いのでした。つまり、画像の高周波成分は画像中の細かい図形や輪郭線を、低周波成分は大まかな色面を表すのです。

 一般に、写真などの人工的でない画像は低周波成分が多く、高周波成分は少ないという特徴があります。そこでこの事を利用し、画像データ中の高周波成分を切り捨ててしまえば、画像自体にそれほど大きな影響を与えないでデータ量を減少させることが可能になります。実際のJPEGではさすがに直接「切り捨て」はしません。その代わり、DCTで分解したデータを「量子化テーブル」というものに基づき、高周波側のデータほど大きな値で割ってやるようにします。そして得られた値を整数に「丸めて」しまうのです。こうすればデータが単純になりますし、特に高周波成分は、割り算と整数化の結果、データがゼロになってしまうこともしばしばです。以上の操作を「量子化」といいます。これによって、データ量はかなり圧縮されます。(→具体例

 一方、データを復元するときは、逆に量子化テーブルの値をかけてやればいいのです。ただし、量子化を行った後のデータは「丸められて」いますから、テーブルの値をかけても割る前のデータには完全には戻りません。これがJPEGが不可逆圧縮である所以です。

 問題は量子化テーブルにどのような値を持ってくるかです。これによって画像の圧縮率や画質が大きく変わってきます。実際のアプリケーションの多くは量子化テーブルの値を直接いじることはせず、テーブルにユーザーが設定したパラメータをかけたり割ったりしてテーブルの値を変化させています。


Step. 3 ハフマン符号化

 DCTと量子化を経てシェイプアップされたデータを、JPEGではさらに「ハフマン符号化(Huffman coding)」という方法で圧縮します。これは有名なアーカイバ「LHA」にも一部応用されている方法です。JPEGではこの他に「算術符号化(arithmetic coding)」という圧縮法も規定されており、圧縮率もハフマン符号化に比べて5~10%ほど高いのですが、方法自体がかなり複雑なため、あまり利用されていません。

 ハフマン符号化は簡単に言えば、まずファイル内のデータの出現頻度を調べ、出現頻度の高いものから順に長さの短いコードを割り当てていくことでファイル全体のサイズを圧縮するものです。なお、この圧縮方法自体は可逆なので、この操作による画質の変化はありません。


 以上のような複雑な手順を踏むことで、JPEGはフルカラーにもかかわらずきわめて高い圧縮率を達成しています。しかし、手順が複雑な分、画像の圧縮や展開には時間がかかります。

 また、次のような特徴があることも、JPEGのアルゴリズムを考えれば分かっていただけると思います。

 つまりJPEGの場合、GIFとは反対に写真のような画像に向いていると言えます。このような画像なら画質の低下が目立たず、圧縮率も高くなります。逆に、GIFが得意とするイラスト系の絵の場合、画質と圧縮率の低下をある程度覚悟しなくてはならないと言えます。

 ただ、ほとんどのブラウザが対応しているフルカラー画像の保存形式としては、現状ではJPEGしか選択肢がないので、JPEGでの保存に不向きな絵であってもJPEGを使わざるを得ないという事情があります(フルカラー画像の可逆圧縮形式であるPNGは、ネイティブで対応しているのがIE4やNN4だけです)。その際はJPEGの特質を理解し、画質とファイルサイズをにらみながら、できるだけ最適な条件で保存することが必要です。

 しかし、ソフトによってはサンプリング比が固定なものや、量子化テーブルに作用させるパラメータを細かく設定できないものも多いので、注意が必要です。例えば、Painterはサンプリング比は「4:1:1」で固定、量子化のパラメータも4段階でしか設定できないようです。また、Photoshopも圧縮率こそ11段階で設定できますが、サンプリング比と量子化パラメータを独立には設定できないようです。

cf.
 個人的な「お勧め」は「ツール集」のところで紹介している「Dibas32」です。プログレッシブJPEGにこそ対応していませんが、量子化パラメータ(25~100%まで1%刻み)とサンプリング比を指定できる上、結果をプレビューで確認しながらできるので、非常に便利です(しかもこの時、予想ファイルサイズも表示してくれます)。




前のページへ 目次へ サイトトップへ