JPEG データは SOI マーカで始まっているので、ます、この検出を行います。 通常、フレームの先頭に量子化テープルとハフマンテープル定義データがあるので、 れらを解釈して復号処理の準備を行います。テープルと画像データは別ファイルになって いることもあります。 フレームヘッダを解釈すると、画像のサイズ、成分数、成分ごとの水平・垂直サンプリ ングファクタ、成分ごとに使用する量子化テープルなどがわかります。また、スキャンへ ッダを解釈すると、成分ごとに使用するハフマンテープルが決まります。 復号は MCU 単位で行います。 MCU を復号すると、該当する部分のカラーデータができ あがります。 リスタートインタバルマーカを検出した場合は、復号器をリセットします ( 各成分の前 のプロックの DC 成分を 0 にします ) 。 復号処理では、 JPEG のフォーマットに適合したすべてのデータを復号できなければな りません。また、 JPEG フォーマットでは、 部のマーカの出現順序が規定されていない 29.1 画像の表現方法 29 ー J 日 F と間引き ので、柔軟に対処できるように設計しなければなりません。 第 2 章 JPEG におけるデジタル静止画像圧縮 号無し 1 バイトで数値を表現するためのものです。 RGB 表色系と YCbCr 表色系の相互変換式は以下のとおりです。この式の 128 とは、符 使用します。 順です。それぞれの成分は 1 画素につき 256 階調です。グレー画像の場合は Y 成分のみを JFIF では、カラー画像の表現に YCbCr 表色系を用います。成分の順序は Y , Cb, Cr の トなどで公開されている JPEG データは、すべて JFIF です。 フォーマットとして、 JFIF (JPEG File lnterchange Format) があります。インターネッ 不特定のプラットフォーム、アプリケーション間での JPEG データの交換を目的とした に決まっていなければなりません。 アプリケーションで利用可能なデータを提供する場合は、使用する表色系と成分順序が公 てしまってかまいません。しかし、インターネットなどで、不特定のプラットフォーム、 ータ交換を考えないのであれば、そのアプリケーションが表色系と画像成分の順序を決め 特定のアプリケーションで独自に JPEG データを利用し、他のアプリケーションとのデ ることはできませんし、成分番号と成分の対応もわかりません。 とになっています。ところが、 JPEG フォーマットでは、どの表色系を使っているかを知 JPEG では、様々な表色系に対応できるように、フレームヘッダで成分数を指定するこ YCbCr や YMCK といった表色系があります。 コンピュータ上では RGB 表色系が最もよく利用されています。 RGB 表色系の他にも カラー画像は複数の成分から構成されています。構成方法にはいくつかの種類があり、
直】 8 ・コメント .COM/ セグメント コメントセグメントを Fig. 2.25 と Table 2.10 に示します。このセグメントの利用方法も、 JPEG では規定していません。利用者が自由にコメントを書いたり、コピーライト表示に 使うことができます。一部のアプリケーションでは、画像がそのアプリケーションで作成 されたことを示す一文を挿入しています。 JPEG では、文字列の形式についての規定がありません。インターネットなどで見かけ る画像データでは、 C 文字列 ( 最後に nu Ⅱ文字 0X00 を付けた文字列 ) を利用しているも 0 ~ 255 のが多いようです。 Fig. 2.25 コメントセグメントの構造 コメントセグメント COM Lc Cml 1 バイト cmu- Table 2.10 コメントセグメントパラメータのサイズと許容値 2 バイト 意味 バラメータ Lc Crnl サイズ ( ビット ) 8 16 許容値 2 ~ 65535 パラメータ長 コメントデータ ロ」 9 ・その他のマーカ 2.6.3 ープルデータ指定の省略フォーマットといいます。このフォーマットを Fig. 2.26 に示します。 ておかなければなりません。画像を含まないテープルのみのデータのフォーマットを、テ 省略フォーマットの画像データを復号するには、あらかじめ復号器にテープルを設定し います。 プルなどのデータを付加していない JPEG データのフォーマットを省略フォーマットとい ができます。この場合、画像データにテープルデータを付加する必要はありません。テー JPEG では、複数の画像で量子化テープルとハフマンテープルを共有して利用すること 省略フォーマット す。 特に、 SOFI ~ SOF15 が現れた場合は、復号不可能としてただちに処理を終了するべきで また、復号器では無視するか、あるいはエラーとして処理を中断してもよいでしよう。 号器ではそのマーカを使用する必要はありません。 こまでで説明しなかったマーカは、基本 DCT 方式では使用しません。ですから、符 第 2 章 JPEG におけるデジタル静止画像圧縮
0.2990 十 0.5870G 十 0.1140B ー 0.1687 一 0.3313G 十 0.5000B 十 128 0.5000 一 0.4187G ー 0.0813B 十 128 十 1 .40200 ( Cr ー 128 ) = Y G= Y— 0.34414 ( C わー 128 ) ー 0.71414 ( Cr ー 128 ) B = Y + 1 .77200 ( C わー 128 ) 変換を行うと、符号無し 1 バイトで扱える範囲を越えることがあります。この場合は適 宜補正が必要です。負になった場合は 0 に、 255 を超えた場合は 255 にします。 、、・ J 日 F フォーマット JPEG データが JFIF であるかは、 APPo マーカのアプリケーションデータセグメントに よって識別します。この様子を Fig. 2.29 と Table2.11 に示します。 ID には、 " JFIF \ 0 " という C 文字列が入っています。 これを表す値として VI V ぃ V2 は JFIF のバージョンです。現在のバージョンは 1.02 で、 に 1 が、 V2 に 2 が入っています。 U は画像の密度単位です。 0 : 単位無し、 1 : ドット / インチ、 2 : ドット / センチメート ルの 3 種類から選びます。 Xd, Yd はこの単位に従った横と縦の密度です。 また、 JFIF ではサムネイル (thumbnail) を添付することができます。サムネイルを直 訳すると「親指の爪」ですが、これはその程度の大きさの画像という意味で、プレビュー や一覧表示などに利用すると便利なものです。 xt, Yt はサムネイルの横・縦ドット数です。サムネイルは RGB 表色系で、ドットごと に R, G, B の順に並びます。各値のサイズは 1 バイトです。サムネイルセグメントには、 xt x Yt x 3 バイトのサムネイル画像が収められます。サムネイルがないときは、 Xt' Yt はともに 0 になり、サムネイルセグメントは存在しません。 JFIF を拡張したフォーマットに JFXX ( JFIF 拡張 APPo マーカセグメント ) があります。 この様子を Fig. 2.30 と Table 2.12 に示します。このフォーマットは添付するサムネイルの 形式を JPEG 、 1 バイト / ドット RGB 、 3 バイト / ドット RGB の 3 種類に指定できるように なっています。 サムネイルに JPEG を用いる場合は、 JFIF と JFXX セグメントを含まない通常の JPEG データを使用します。 レヾイト / ドット RGB を使用すると、サムネイル画像は 256 色になります。このとき、 使用する色は 1670 万色中の任意の 256 色を選び、 768 バイトのパレットデータで指定しま す。パレットには RGB の順で組み合わせが指定されます。例えば、 Fig. 2.30 で、 Vn m が 0 だったら、カラーパレットの R() , G() , B() を使います。 3 バイト / ドット RGB を使用するときは JFIF のサムネイルと同じです。 2.92 2.9 JFIF と間引き
るようになります。 この方式は周波数成分ごとに分割して伝送するので、スペクトラル・セレクションと呼 ばれます。これに対し、 AC 成分の係数データをビットごとに分割して伝送する方式があ り、これはサクセッシブ・アプロキシメーションと呼ばれます。一般には、スペクトラ ル・セレクションが使用されます。サクセッシプ・アプロキシメーションはスペクトラ ル・セレクションと併用され、完全なプログレッシプと呼ばれます。 プログレッシプの伝送方式を Fig. 6.5 の模式図を使って説明しましよう。この図の小さ な直方体が 1 ビットのデータを表します。これが横に 8 個並んだ ( a ) が 1 つの DCT 係数デー タです。そして、これが縦に 64 個並んだ ( b ) が 1 つのプロック分の DCT 係数になります。 Fig. 6.5 プログレッシブの伝送方式の模式図 MSB → LSB ・■ 0 ・■ プロック .. ・ (a) 量子化された DCT 係数の 1 つ 1 0 0 1 DCT 係数三 (c) 量子化された 1 成分の DCT 係数 62 63 (b) 量子化された 1 プロック分の DCT 係数 Fig. 6.6 シーケンシャル ( 基本 DCT 方式 ) の伝送順序 伝送順序 6.7 プログレッシプ
そこで、正式な文書を参照することになるのですが、この文書がかなりわかりにくいの です。なにしろ、「標準」とか「勧告」といわれる正式な文書です。誤りなく、明確に記 述されている反面、誰でも読めるという表記ではありません。さまざまな基礎知識がなけ れば理解できないのです。 このような背景を踏まえ、本書は JPEG の基本方式をわかりやすく、完全に解説するこ とを目的としました。そして、実際に他のプログラムとデータの交換ができる C + + プロ グラムを添付しました。本書をお読みいただけば、 JPEG の基本方式のすべてを理解でき ることでしよう。また、実際に動作するプログラムを手に入れ、さまざまな実験を試みる こともできるでしよう。 またこの過程で、中級へのステップアップを試みるプログラマにとっては、プログラミ ングにおける重要な概念を学ぶ機会となるでしよう。 12 ー内容 JPEG は ISO ( 国際標準化機構 ) と ITU-TS ( 国際電気通信連合電気通信標準化セクタ、 旧 CCITT : 国際電信電話諮問委員会 ) の合同組織で、 J0int Ph0tographic Experts Group of CCITT-ISO/IEC の略称であると同時に、この組織が定めたデジタル静止画像の圧縮符 号化方式を意味します ( 本書では、特に断らない限り、後者の画像圧縮符号化方式を指す ものとします ) 。 後ほど説明しますが、 JPEG はとても大きな方式です。そのすべてを利用することは難 しいですし、現実的ではありません。実際、インターネットや CD - R()M で提供されてい る JPEG データは、その多くが最も基本的な機能だけで作られたものです。その画像を表 示するときも、最も基本的な機能だけで表示することができます。このようなデータは一 般に交換 ( 配布 ) されている JPEG データの 7 割から 8 割にあたります ( 筆者らの経験に よる ) 。残りの 2 , 3 割の JPEG データには、拡張方式という機能が使用されています。 ところが、 JPEG 方式はもっと奥が深いのです。基本と拡張の 2 方式だけではなく、そ の他にもいくつかの方式があり、それらを組み合わせて使用することができるのです。 れらの一般には使われない方式は特殊分野で活用されています。 そのすべての方式について解説することは現実的ではありません。そこで、本書では基 本方式に限って解説することにします。説明の範囲は少々狭くなりますが、基本に関する JPEG データの符号化・復号が完全に行えるプログラムを掲載します。 作成するプログラムは 2 つです。 1 つは JPEG ・符号化プログラム、もう 1 つは JPEG 復号 プログラムです。 JPEG はプラットフォーム ( ハードウェアや (S) やアプリケーションに依存しないとい う特徴があります。その特徴を生かすため、本書のサンプルプログラムは ANSI C + + で 記述しました。そして、一般的なパソコンで動作が確認できるように、 Windows 用と Macintosh 用のアプリケーションとして動作するプロジェクトを構成しました。どちらの 1.2 内容
1 . ハフマン符号語の候補を 0 とする 2. 候補を 1 ビット左にシフトし、ビットストリームから 1 ビット読み出して候補に 付け加える 3. 候補と一致する符号語が復号用ハフマンテーブルに存在するかどうか確認する 4. 候補と一致する符号語が存在しない場合は、 2. に戻る 5. 候補と符号語が一致したら、そのときのインデックス値で対応した値のテーブル を引く 3. で、一致する符号語の検索は、読み出したビット数と同じ長さの符号語についてだけ ため、土 nt 型の配列で定義します。たとえば、輝度用の量子化テープルは℃ oderTables. h" 量子化テープルの要素は符号無し 8 ビットのサイズですが、量子化の計算効率を高める ま使用します。 c ユ pegc 。 der の量子化テープルも「付属書 K 」に例として掲載されているものをそのま 0 】 1 ・符号化用量子化テーブル , 量子化テーブル 行えばよいのです。そこで、サイズテープルで符号語検索の範囲を決めます。 で次のように定義しています。 static const 土 n し kYQuantumT[] 16 ′ 12 ′ 14 ′ 14 ′ 18 ′ 2 4 ′ 4 9 ′ 72 ′ 11 ′ 12 ー 13 ′ 17 ′ 2 2 ′ 3 5 ′ 6 4 ′ 9 2 ′ 10 ′ 14 ′ 16 ′ 2 2 ′ 3 7 ′ 5 5 ′ 7 8 ′ 9 5 ′ 16 ′ 19 ′ 2 4 ′ 2 9 ′ 5 6 ′ 6 4 ー 87 ′ 9 8 ′ 2 4 ′ 2 6 ′ 4 0 ー 51 ′ 6 8 ′ 81 ′ 10 3 ′ 112 ′ 4 0 ′ 5 8 ′ 5 7 ′ 10 9 ′ 10 4 ′ 121 ′ 10 0 ′ 51 ′ 6 0 ′ 6 9 ′ 10 3 ′ 113 ー 12 0 ′ 10 3 ′ / / 輝度用 9 9 101 ′ 9 2 ′ 7 7 ′ 62 ′ 5 6 ′ 5 5 ′ 61 ′ このデータは量子化処理だけでなく、符号化した JPEG データの DQT セグメントにも 使用します。ファイルに書き出すときは uns 土 gned char 型にキャストして、 1 要素 8 ビッ トで格納します。 ■ 12 ・復号用量子化テーブル 復号用量子化テープルは DQT セグメントを解釈して構成します。その値は符号無し 8 ビットの大きさで、要素数は 64 です。 要素数がわかっているので、配列として格納領域を確保することにします。型は unsigned char 型でよいのですが、逆量子化処理の効率が上がるように土 n し型とします。 量子化テープルは最大 4 っ利用されます。といっても、基本 DCT 方式では 2 つしか使用 しません。ですが、 JPEG データを解釈していて、まだ復号できるかどうかわからないう 仕様と論理設計 ちに量子化テープルが 4 つ宣言されても大丈夫なように、また、使用するテープルが 2 つ 60 第 3 章
的に圧縮率を上げるわけではありません。そこで、サンプルプログラムでは JPEG 勧告書 の「付属書 K 」に掲載されている例をそのまま採用しました。 しかし、場合によっては、ほんの少しでも圧縮率を上げたいということがあるでしよう。 特に、画質を落とせない場合、量子化による情報の削減ができませんから、最適なハフマ ン符号を使って圧縮率を高くしたいことでしよう。ここでは、ハフマン符号の作成方法の 概要を説明します ( 詳しくは、 JPEG 勧告書の付属書 K の「 K. 2 ハフマン符号テープルを 規定するリストを生成するための手順」や、符号理論と情報理論の専門書を参照してくだ さい ) 。 ■ 1 ・ハフマン符号構成手順の概要 JPEG におけるハフマン符号のシンポルとは、量子化された DCT 係数値です。ます、画 像全体について、成分ごとにシンポルの度数分布表を作成します。つまり、シンボル v が 現れる回数を、配列に格納します。 このとき、シンポル 0 ( 係数値 ) が最も多くなることはわかっています。 0 はカウント しなくてよいでしよう。 最近のパソコンは 32 ビット CPU を使用しているので、一般的な画像の度数分布表の作 成でオーバーフローすることはますありませんが、組み込みシステムなどで 32 ビット以 下の CPU を使用する場合はオーバーフローに注意してください。 シンポル出現の度数分布表ができたら、出現回数の高い順にシンポルをソートします。 同じ確率のシンボルは、値の小さいほうを先にします。そして、その順序で符号長 ( ビッ ト数 ) を割り当てます。このとき、最大符号長は 16 ビット以下にならなければなりませ ん。 各シンボルに対する符号長が決まったら、具体的な符号語の割り当てを行います。同時 、ハフマンテープル定義データも作成します。 6-4 ープラットフォームの特定 プラットフォームを特定すると処理範囲が限定されるので、コードの無駄な部分を省く ことができます。これは高速化や使用メモリの削減になります。 プラットフォームに最も依存するのは画像の形式です。 Windows では BMP を、 Macin tosh では PICT を使用するのが普通です。そこで、 CJpegCoder の入力と CJpegDecoder の出力の形式をそれぞれ BMP と PICT に変えてください。 具体的には次のメソッドの変更が必要になります。 CJpegCoder : CJpegCoder ( ) , makeYCC ( ) CJpegDecoder : GetPictData ( ) , makeRGB ( ) , De1eteRGB( ) これらの変更は引数の変更を伴うので、オーバーライドでは実現できません。メソッド 6.4 プラットフォームの特定 の多重定義をするか、または別のメソッドを作成することになります。その場合、その変
ー JPEG プログラムの現状と本書の目的 インターネットと CD - ROM の普及によって、美しい静止画像を小さなデータで提供す る最も有効な手段として JPEG が浸透しました。インターネットェクスプローラやネット スケーブナビゲータなどの WWW プラウザは、必ず JPEG 画像を表示する機能を備えてい ます。もはや、 JPEG 画像を表示することができないパソコンシステムは珍しくなってい ます。 ユーザだけでなく、プログラマにとっても JPEG は身近なものになっています。 Windows でも Macintosh でも、 JPEG の符号化・復号 ( 圧縮・伸張 ) プログラムはコンポ ーネント ( ソフトウェア部品・ライプラリ ) として提供されているものがあり、もはや JPEG のプログラムなど作成する必要はないという人までいます。 はたして本当にそうでしようか ? 既成のコンポーネントを利用してシステムを構築する方法は、システム開発の期間の短 縮と経費の節約に大きな効果があります。そして、そのような方法はソフトウェア工学に おける重要なテーマです。 ところが、そのような方法は、実際には問題をすり替えているに過ぎないという意見も あります。コンポーネント部分のプログラムを作成しなくてよい反面、その部分には一切 手を出せなくなってしまったのです。既成のコンポーネントを利用することで通常の符号 化・復号はできても、 JPEG を応用した特別なシステムの開発はできません。しよせん、 既成の範囲から抜け出すことはできないのです。 また、ほとんどのプログラマが既成のコンポーネントを使用するので、 JPEG に詳しい 人が減り ( 増えす ) 、 JPEG が「特別な技術」という扱いを受けることになりつつあります。 実際には、 JPEG が特殊技術という扱いを受ける理山は何もありません。むしろ、これだ け普及しているのですから、すべてのプログラマがその基礎技術に精通していても不思議 ではないのです。 一方、プログラミング言語を覚えたばかりの、初級から中級へ移ろうとしているプログ ラマにとっても、 JPEG は魅力的なテーマです。 JPEG プログラムを作成することによって、 プログラミングの様々な概念と技術を得ることができるでしよう。また、 JPEG について しく知っておくことは、決して損にはなりません。 ところで、「それでは JPEG プログラムを作成してみよう ! 」と思って準備を始めると、 情報の少なさに驚かされます。インターネットで JPEG について検索してみてください。 ほとんどの情報は、 JPEG データの特徴とか、 DCT 変換とハフマン符号 ( 後述 ) を使う、 という内容に限られています。このことは、いわゆる JPEG の解説書でも同じです。 では、その情報だけでプログラムが作成できるのか ? というと、答えは「作成できる のは半分だけ」となります。 JPEG に似た独自の圧縮・伸張プログラムを作ることはでき ますが、他のプログラムとのデータ交換はとても無理です。 DCT 変換とハフマン符号を 扱う部分が CPU だとすると、レ () にあたる部分の情報が完全に欠落しているのです。 第 1 章本書の概要 二一一口
・ GGRADATION. * (Fig. 5.6 ) 成分が複数あるとテストが複雑になるので、輝度情報だけで確認作業 この画像は CGRADATION. * をグレー 256 階調に変換したものです。 ができるように用意しました。 てください。 ・その他の画像 テスト用の自然画像を用意しました。上の 6 つのテストデータで確認ができたら利用し 188 第 5 章テスト されます。その結果をネットスケーブナビゲータなどで表示した結果と見比べます。画面 JPEG データファイルを選んでオープンします。しばらく待っと、復号結果が画面表示 第 12 ・復号部 ークポイントを設定しておくと、すべての解析処理の流れを追うことができるでしよう。 ほかの解析メソッドも同様に処理を追いかけてください。 Ana1ysisMarker() にプレ ます。 ポイントで一時停止したら、所定のメンバ変数に値が正しく設定されるかどうかを確認し トを設定します ( 以下、スコープの記述を省略します ) 。プログラムを実行し、プレーク イントを設定します。たとえば、 CJpegDecoder::Ana1ysisDQT() にプレークポイン デバッガを有効にして復号器プログラムのテストしたい解析処理メソッドにプレークポ ■】 1 ・前処理 およそのテスト手順は次のようになります。 行います。前処理のテストは比較的簡単ですが、復号部のテストは楽ではありません。お ピー符号化セグメントを復号して表示データを作成する復号部 (DoDecode()) に分けて テストは、テープルの作成などに代表される前処理 (DoAna1ysis()) と、エントロ の指定がある場合は、このフォルダのファイルを開いてください。 この節で使用する入力データは、 CD-JPEG] フォルダの *. JPG ファイルです。データ うために、 JPEG データをバイナリダンプして表示できるソフトがあると好都合です。 使って正しい表示例を示し、その画像と比較を行います。また、ファイルの解析状況を追 復号のテストでは、ネットスケーブナビゲータなどの JPEG 画像を表示できるソフトを テスト方法の概要 5.3 ー CJpegDecoder のテスト
~ フォーマット この節ではセグメントの詳しい構造を説明します。プログラミングを行うときには正確 に実現しなければならない大事な項目です。 こで説明するセグメントは、基本 DCT 方式で使用されるものです。その他の方式で 使用されるものは省略しました。ですから、復号器はここで紹介されるすべてのセグメン トを正しく解釈しなければなりません。 符号器は、このセグメントのうち、必要なものだけを利用すればよいことになります。 具体的には、コメントやインタバルをサポートしないときは、そのセグメントを省略して かまわないのです。 0 」 1 ・画像開始と終了 JPEG データは必す SOI マーカで始まり、 EOI マーカで終わります。各種の情報はこの 間に記録されます (Fig. 2.18 ( a ) ) 。基本 DCT 方式では、 S()I マーカと E()I マーカの間にた だ 1 つのフレームが存在します ( 他の方式では複数のフレームが存在することがありま ー 262 ー Fig. 2.18 JPEG ( 基本 DCT 方式、拡張 DCT 方式、可逆方式 ) のデータ構造 す ) 。あらゆるデータはフレーム内に記録されています。 (a) JPEG テータ フレーム 2 バイト EOI SOI (b) テーブルなどフレームヘッダスキャン 1 フレーム DNL スキャン 2 スキャン セグメント テープレ指定 など スキャンヘッダ ECSO (c) R STO 〃バイト ECS は スキャン 最後の RSTIast 1 工ントロピー符号化セグメント <MCUn>, <MCUn+l>, ・ <MCUIast> 34 ・・ (d) 工ントロピー符号化セグメント <MCUI>, <MCU2>, ・ <MCURI> 第 2 章 JPEG におけるデジタル静止画像圧縮