画像 - みる会図書館


検索対象: JPEG-概念からC++による実装まで
131件見つかりました。

1. JPEG-概念からC++による実装まで

2.2 ー JPEG の概要 近年、通信方式の向上や通信設備の拡充によって、高速通信が身近になっています。し かしながら、インターネットにおける WWW に代表されるように、電気通信におけるデ ータの量も急増しています。そのなかで、デジタル静止画像の占める割合がかなり大きい ことは、読者の皆さんもよくご存じだと思います。この画像の情報量 ( 画質 ) をなるべく 落とさずに、通信に用いるデータ量を少なくすることができれば、通信設備の利用面や通 信費の面でたいへん有意義です。また、ハードディスクなどの記憶媒体に画像を保存する 場合にも同じことがいえます。この目的のために考案され、標準化されたデジタル静止画 像の圧縮・伸張方式が JPEG です。 JPEG は ISO ( 国際標準化機構 ) と ITU-TS ( 国際電気通信連合電気通信標準化セクタ、 旧 CCITT : 国際電信電話諮問委員会 ) の合同組織で、 Joint Photographic Experts Group of CCITT-ISO/IEC の略称であり、それと同時に、この組織が定めたデジタル静止画像の 圧縮符号化方式をも意味します。本書では、特に断らない限り、後者の画像圧縮符号化方 式を指すものとします。 JPEG には以下の特徴があります。 ・圧縮率が非常に高い ・圧縮率と復号される画像の品質をユーザが調整できる ・プラットフォーム ( ハードウェアや OS などによるコンピュ ケーションに依存しない ・国際標準であり、世界中で広く用いられている ータの分類 ) やアプリ このような特徴があるため、デジタル静止画像の記録、通信用フォーマットとして広く 利用されています。 JPEG は、画像データの圧縮・伸張のアルゴリズムとデータのフォーマットを規定して います。元画像から JPEG データを作ることを符号化といい、 JPEG データから画像を取 り出すことを復号 ( 化 ) といいます。そして、符号化、復号を行う装置やプログラムを、 それぞれ符号器、復号器といいます。 JPEG が高い圧縮率を実現している理山に、元の画像データの情報を復号後の画像デー タに 100 % 反映していないという点があります。 自然画像には原色があまり現れないことに着目すると、色差の変化の範囲が限られてい ることがわかります。そこで、元の画像のなかから特異な色差の情報を少々削っても、も ともとそのような情報は少なかったので、人間の目にはその差がわかりにくいということ になります。 また、自然画像では近くの画素の色が極端に違うということはあまりありません。多く の場合、隣り合った画素はよく似た色になっているでしよう。そこで、人間が見て気にな らない程度に、急激な変化に関する情報を切り捨てることもできます。 これらの情報を削り落とす程度をユーザが調整できるので、画像品質と圧縮率を調整で 2.2 JPEG の概要

2. JPEG-概念からC++による実装まで

えば、 RGB 表色系の場合、 Xx Y バイトの領域を 3 っ作成し、それぞれを R , G, B の各成 分の格納場所とします。画素の色成分を RGB に分解し、それぞれを各成分領域の画素位 置に対応したオフセットで格納します。この様子を Fig. 2.2 に示します。この方法はすべ ての表色系で使用できます。成分数も 3 つである必要はありません。 Fig. 2.2 画像テータの成分分離 画像 成分 1 メモリ領域 1 成分 2 メモリ領域 2 成分〃 メモリ領域〃 画像の属性 ポインタ ) をよく使います。しかし、画像データだけを渡されても、そのデータがどのよ います。 Windows や Macintosh などのシステムではハンドル ( データへのポインタへの 一般に、 C/C + + のプログラムでは、画像データの受け渡しはデータへのポインタで行 す。画像を扱うときは、これらの情報に常に気をつける必要があります。 さらに、どのような表色系を用いているか、成分は何個あるか、といった情報も必要で 必要があります。また、 1 画素が何ビット ( 何バイト ) で表されているかも重要です。 こで、画像データを渡すときはデータサイズと横画素数か、または縦横の画素数を伝える 要です。どこで折り返すか、ということを間違えると、画像が歪んでしまうからです。そ 画像を表示するには、縦横の画素数がわからなければなりません。特に横の画素数は重 うなものかがわからなければ、表示したり加工したりすることはできません。 第 2 章 JPEG におけるデジタル静止画像圧縮

3. JPEG-概念からC++による実装まで

きるのです。多くの情報を削り落とせば JPEG データは小さくなり圧縮率が上がりますが 画像の品質は低下します。逆に、多くの情報を残せば復号した画像は元の画像に近 0 、高 質なものになりますが、 JPEG データはあまり小さくなりません。 23 ー JPEG の種類 JPEG の処理方式は、 1 種類ではありません。 JPEG には 4 つの処理方式があり、ユーザ が自由に選べるようになっています。 4 つの処理方式を次に示します。 ・基本 DCT 方式 ( 最も基本的な方式 ) ・拡張 DCT 方式 ( 基本 DCT 方式にプログレッシブを追加した方式 ) ・可逆方式 ( 元の画像にきわめて近い画像が復号できる方式 ) ・ハイアラーキカル方式 ( 複数の解像度に対応した方式 ) この 4 つの処理方式のうち、基本 DCT 方式が最も多く用いられています。拡張 DCT 方 式のプログレッシプは、インターネットの WWW などでの JPEG データに利用されていま す。プログレッシプとは、にじんだ画像からハッキリした画像へ、段階的にじわじわと表 示されていく方式です (Fig. 2.3 ) 。利用される割合は、ノンプログレッシプ ( プログレッ シプでないものをノンプログレッシプといいます ) のもののほうが、かなり多いようです。 Fig. 2.3 プログレッシブ画像の表示 12 第 2 章 JPEG におけるデジタル静止画像圧縮

4. JPEG-概念からC++による実装まで

・復号後の画像データへのアドレスを渡す VOid GetPictData( u_char** u Char** u Char** int& 土 n し & このメソッドは復号した画像の R, redP, greenP, b1ueP, HSize, VSize ) ー / / 復号画像へのポインタ / / 復号画像へのポインタ / / 復号画像へのポインタ / / 横の画素数 / / 縦の画素数 G, B 3 成分のデータへのポインタと、画像の縦横 の画素数を返すものです。復号に失敗した場合は、値は保証されません。ですから、 D 。 Dec 。 de ( ) でエラーが発生した場合は、このメソッドを呼び出してはいけません。 ・画像属性を渡す / / 返値 : こ PEG 画像の属性 SJpegProperty GetProperty ( void ) 復号した画像の属性を SJpegProperty 構造体で返すメソッドです。 SJpegProperty 構造体のメンバ CanDec 。 de の値を見ると、解析処理の結果の詳細がわかります。 em 工 sHTab1e 、 em 工 sQTab1e が 0 の場合、テープルが未定義なので復号処理はできません。 em 工 sStartData が 0 の場合は、スキャンデータ ( 画像データ ) が存在しないので復号で きません。 ■ : 14 ・メンバ変数 / / 入出力 , 中間データ u_char* mRgbP [ 3 ] : 土し☆ 土 n し 土 n し 土 n し mCompP[3] ー mPreDC [ 3 ] ー mDctDataP[64] : mB10ckP[64] ー / / 復号画像へのポインタ / / 画像の各色成分へのポイント ( ユニットサイズ ) / / 前プロックの DC 成分 ( 3 成分 ) 1 プロック分の DCT 係数データ / / 1 プロック分の画素データ mRgbp [ ] は、復号した画像の RGB 成分へのポインタです。要素はインデックスの 0 か ら順に R , G, B です。 mCompP[] は、 MCU を復号した結果の部分画像へのポインタです。要素はインデック スの 0 から順に Y , Cb, Cr です。変換と同時に、間引かれた値の復元も行いますので、各 領域のサイズはすべて MCU サイズになります。 mPreDC[] は、 1 つ前に DCT 変換したプロックの DC 成分の値です。工ントロピー符号 化セグメントの D C 成分部分は、この値との差が符号化されているので、復号結果と mpreDC[] の値で DC 成分の値を求めます。 mpreDC[] は成分ごとに 1 つ用意する必要があ るので配列にしました。 mDc し Da に ap [ ] は逆 DCT 変換の入力です。復号された DCT 係数データは、逆量子化さ れてこの配列に格納されます。この値が逆 DCT 変換されて mB1 。 ckP [ ] に格納されます。 / / 画像情報 SJpegProperty mProperty; SScanHeader mSHeader ー SFrameComponent mFComp [ 3 ] ー SScanComponent mSComp [ 3 ] ー 第 3 章仕様と論理設計 プロバティ スキャンヘッダ フレーム成分 / / スキャン成分

5. JPEG-概念からC++による実装まで

[D-JPEG] フォルダのデータは、 CBMP], CPICT] フォルダのデータを市販のグラフ ィックソフトで符号化したものです。このフォルダのグレー画像は成分数が 1 になってい ます。ただし、 HEADER. JPGt±けは、テープルの値がわかるように CJpegCoder で符号 化したものになっています。 CC-JPEG], CD-JPEG], CBMP], CPICT] フォルダとも、ファイル名が同じで拡張子 だけが異なるファイルが保存されています。ファイル名が同じファイルは、表示するとほ こでは、拡張子を * として、 3 タイプ (JPG, BMP, とんど同じように見えるはすです。 PICT) 同時に画像の内容を説明します。 ・ HEADER. * (Fig. 5.1 ) 16 x 16 ドットのグレー画像です。この画像を符号化すると、エントロピー符号 化セグメントは、全プロックのデータについて DC 成分は差分値が 0 で、 AC 成分 は EOB のみとなります。主に、テープルデータなどを確認するために使用します。 ・ GRAY. * (Fig. 5.2 ) 16 x 16 ドットのグレー画像です。この画像は 8 x 8 ドットの正方形が 4 つあり、 それぞれ白、薄いグレー、濃いグレー、黒で塗られています。 この画像を一般的な JPEG 符号化ソフトで JPEG 符号化すると、スキャンデータに Cb , cr 成分は含まれません。 Y 成分は DC 成分と EOB だけになります。 CC-JPEG] フォルダの GRAY. JPG は、 CJpegCoder で符号化しているので Cb, Cr 成分 も記録されています ( 3.3.2 ①節 , p. 54 ) 。 ・ GRAY2. * (Fig. 5.3 ) 16 x 16 ドットの白黒画像です。この画像は、 8 x 8 ドットごとに幅 1 ドットの縦 縞になっています。つまり、 AC 成分は横方向の周期 2 ドットの成分だけで構成さ れています。縦方向には変化がないので、縦方向の DCT 係数の値はすべて 0 です。 ・ RGBB. * (Fig. 5.4 ) 32 x 32 ドットのカラー画像です。この画像は 16 x 16 ドットの正方形が 4 つ あり、それぞれ赤、緑、青、黒で塗られています。 RGB で表記すると、 ( 255 , 0 , 0 ) , ( 0 , 255 , 0 ) , ( 0 , 0 , 255 ) , ( 0 , 0 , 0 ) です。すべてのプロックが 1 色で塗りつぶ されているので、 DCT 変換すると AC 成分はすべて 0 になります。 ・ CGRADATION. * (Fig. 5.5 ) ロ ドット幅になっていません。縦縞ですから、縦方向の AC 成分は 0 です。 CGRADATION. JPG では色差の間引きがあるために、ところどころ 1 左から右へ赤→緑→青→赤というグラデーションになっています。 64 x 64 ドットのカラー画像です。この画像は 1 ドット幅の縦縞で、 52 テストデータについて 187

6. JPEG-概念からC++による実装まで

実際に表示を行うには、 Windows の場合と同様に、表示用画像データをあらかじめ背 景色などに設定しておき、復号画像で上書きしていくとよいでしよう。そして、適当なタ イミングで表示画像の再描画ができるようにします。それには、 DoDecode() の返値で更 新すべきかどうかがわかるようにするとよいでしよう。 JPEG データを通信などの低速な手段で読み込む場合は、 JPEG データ格納領域を読み出 しルーチンと CJpegDecoder で共有しなければなりません。そして、 CJpégDecoder で は読み込みが完了していない部分にアクセスできないようにする必要があります。これは、 DoDecode ( ) の引数でなえるようにするとよいでしよう。 その場合、 c ユ pegDec 〇 der はハフマン符号の復号進行状況も保持しなければなりませ ん。もし、 1 つのハフマン符号語を復号する途中で JPEG データがまだ読み込まれていな いと、中途半端な位置で処理が中断してしまいます。すると、呼び出し元に制御を返すこ とができなくなってデッドロックしてしまいます。しかも、 DoDecode ( ) が呼び出された 時点では、そのとき必要な JPEG データの長さがわかりません。ハフマン符号を復号して みなければわからないのです。 ですから、 DoDecode() はインタバルなどの適当な単位での処理だけでなく、ハフマン 符号の復号の段階でも処理を中断して制御をアプリケーションに返すようにしなければな りません。 67 ープログレッシブ オンラインなどの低速の入力を用いて、 JPEG 画像のリアルタイム表示を行うのに便利 な機能がプログレッシブ表示機能です。これは、はじめにばやけた画像を表示し、徐々に 細部まで表示していく方式です。このような伝送・表示方法を採用すると、通信の途中で 画像の概要がわかりますから、もし不要な画像ならば、通信をキャンセルすることもでき ます。 プログレッシプはとても複雑な方式ですから、本書の限られたページ数ではすべてを解 説できません。この節の解説を元に、実際にプログレッシプ形式のデータを解析してみて ください。本格的なプログラミングにあたっては、 JPEG 勧告書を通読することをお勧め 6.7.1 仕組み します。 222 第 6 章発展 おして再表示します。これを数回繰り返すと、ばやけた画像が徐々にハッキリと表示され 波成分が送られてきたら、 DCT 係数データを更新して再度逆 DCT 変換し、画像を作りな 器は、高周波成分を 0 として逆 DCT 変換して画像を作り、一旦これを表示します。高周 周波成分を、画像全体について先に送り、次第に高周波成分を送るというものです。復号 プログレッシプの仕組みは、 DCT 係数データを送信するときに、画像の概要を示す低

7. JPEG-概念からC++による実装まで

として伝えれば、受け取った側で同じ波形を作ることができるのです。 周期とは、 1 回の繰り返しに、どれだけの期間がかかるかを表したものです。これに対 して、一定の期間に繰り返しが何回あるかを表したものが周波数です。周期が大きいと周 波数は低くなり、周期が小さいと周波数は高くなります。以後は周期の代わりに周波数を 使って説明します。 複数の cos 波で画素のレベル値の変化を表すことができました。ところで、自然画像に おいて、 8 x 8 プロックの領域で、隣り合ったドットがまったく異なる色になることがど れだけあるでしようか ? たいていは、色の変化はなめらかです。つまり、周波数成分こ とに見ると、自然画像では低周波の情報が高周波の情報よりも重要なのです。逆にいえば、 高周波の情報を取り除いても画質にあまり影響を与えないのです ( あくまでも一般的な自 然画像の性質についての話です。文字情報などの人工的な画像では高周波の情報が重要に なる部分もたくさんあります ) 。これが圧縮の概念につながっていく周波数成分ごとの操 作です。 2.4.1 ( 3 ) 節 ( p. 18 ) で詳しく説明します。 コサイン変換、フーリエ変換については、数学書や工学書で詳しく解説されているので、 必要に応じてそれらを参照してください。 こで大切なことは、「画素のもつ情報をその まま伝送せすに、コサイン変換を利用して周波数成分に関する情報を作成し、それを送る ことによっても、同じ画像情報を伝えることができる」ということです。そして、「周波 数成分に関する情報は、自然画像の性質や、人間の目の視覚特性に合わせた加工を行うの に都合がよい」ということです。 ■ 12 ・ 2 次元 DCT 画像の小さな部分を波形で表せることがわかりました。ですから、画像全体を小さな部 分に分解してそれぞれを波形で表せば、波形の周波数情報を使って画像を表すことができ るようになります。 その小さな部分ですが、前節ではドットの列に着目しました。でも、画像は 2 次元です。 着目するドットも 2 次元で見るとどうでしよう ? 画像の一部分の正方形領域 (Fig. 2.6 ( b ) ) に着目して、 DCT 変換を行います (DCT 変換 とはおかしな表現ですが、日本語として語感がよいので、あえてこの表現を使うことにし ます ) 。すると、 Fig. 2.6 ( c ) のように、水平方向と垂直方向の周波数成分についての係数の 表が得られます。この表の詳しい見方は、詳細な画像処理をしない限り知らなくても差し 支えありません。次の節で説明しますが、量子化を行うときに、左上隅の係数が最も重要 であり、そこから遠ざかるにつれてあまり重要ではなくなるということを覚えておいてく ださい。 第 2 章 JPEG におけるデジタル静止画像圧縮

8. JPEG-概念からC++による実装まで

" 不完全 MCIJ の処置 先ほども述べましたが、 JPEG 符号化したい元画像のサイズは 8 の倍数ドットで構成さ れているとは限りません。そうすると、符号化時に画像の右隅や下隅付近で MCU が構成 できないかもしれません。そこで、ちょうど MCU が構成できるサイズになるように、画 像の右と下に必要に応じて画素を付け加えます。この様子を Fig. 2.17 に示します。 Fig. 2.17 不完全 MCU の処置 入力画像 252 , 一 付加する画素 復号化すると、付け加えた画素分だけ元の画像より大きな画像が得られることになりま すが、ヘッダで画像サイズが指定されるので、不要な画素を無視することによって、正し いサイズの画像を復号できます。 通常、付加する画素のレベル値は、元画像の右端か下端の画素と同じ値にします。こう すると、 DCT 変換を行ったときに高次の係数が小さくなることが期待できるからです。 ~ インタバル ハフマン符号は符号語によって長さが違うので、ビット誤りが生じると、復号時に符号 語の区切り位置を間違えたり、区切り方がわからなくなったりします。長期の保存や通信 での伝送では、部分的なビット誤りが生じやすく、そうなると、誤った部分に関する画素 の値だけでなく、その後ろに続くすべての画素で正しく復号できなくなってしまいます。 つまり、 JPEG データはビット誤りにきわめて弱いのです。 これでは、高い信頼性を必要とする分野で JPEG を応用することができません。部分的 253 な誤りを全体に影響させない工夫が必要になります。 2.5 インタリープとインタノヾル

9. JPEG-概念からC++による実装まで

~ 2 ゴ 2 画像の表し方 画素の表し方はわかりました。次に、その画素の並べ方を説明しましよう。 コンピュータでは、一般に画像は長方形であると仮定しています。そうしたほうが扱い やすいからです。もちろん、長方形でない画像もありますが、その表現、表示方法は特別 なものですから、 こでは説明しません。 長方形の画像は、画素が縦横に連続して並んだものになります。これをメモリの上に配 置するとき、すべての画素が連続した領域に格納されます。その格納順序は Fig. 2.1 のよ うになります。この図は横 X ドット、縦 Y ドットの画像の各画素の値が、メモリ上のどの アドレスに格納されるかを表しています。オフセットとは、メモリ上に作った画像データ 領域内での位置のことです。 Fig. 2.1 画面上の点の座標とメモリ上のアドレス ( 横 x ドット , 縦 Y ドット ) の画像 ( 0 , 0 ) ( 1 , 0 ) メモリ領域 ( 0 , 0 ) ( 1 , 0 ) セ オ ( x ー 1 , 0 ) ( 0 , 1 ) (x ー 1 , 0 ) ( 0 , 1 ) yxX ) , x X 十ズ (x ー 1 , Y ー 1 ) (x ー 1 , た 1 ) Y x X ー 1 もし、各画素の値が 1 バイトで表されているならば、メモリの先頭アドレスにオフセッ トの値を足したものがそのままアドレスになります。 RGB フルカラーの場合、各画素が 24 ビットなので、 3 バイト割り当てることになります ( 場合によっては、アドレッシング の便利さから 4 バイト割り当てて、 1 バイト無視することもあります ) 。この場合は、オフ セットにそのバイト数を掛けてから先頭アドレスに加えると、アドレスが得られます。 JPEG では、画像成分を別々に扱うので、メモリ上の領域を分けることが多いです。例 2.1 カラー画像について

10. JPEG-概念からC++による実装まで

くしてからカラーに変わるはずです。 ところが、インターネットの WWW を利用しているとわかりますが、 YCbCr 表色系の JPEG 画像を表示するとき、カラーで上のほうから徐々に表示されています。つまり、通 信の最初の段階から 3 成分の情報が混じりあって送られてきているのです。画像を小さな 部分に分けて、その部分ごとに全成分の情報を順番に送る仕組みをインタリーブといいま す。そして、その画像の小さな部分を最小符号化ユニット (MCU) といいます。 インタリープの反対に、成分ごとに全画像データを伝送 ( 記録 ) する方法をノンインタ Fig. 2.13 インタリーブ カラー画像 成分に分解 成分 3 (a) ノンインタリーブ 成分 1 成分 2 成分ごとに符号化 画像を小さな 部分に分ける A B C 成分 3 A B C 成分 1 A B C 成分 2 交互に符号化 MCU (b) 2.5 インタリーブ インタリープとインタバル