1.Jpeg2000とは
Jpeg2000はJPEG(Joint Photographic Codintg Expert Group)によって提唱された、新しい画像圧縮方式です。
主な特徴は
・不可逆/可逆の両方をサポート
・ブロックノイズがほとんど現れない
・高圧縮率の時の画質の良さ
等です。
(参照:jpeg.org)
現在は、Part10まで制定されています。
Part1 | Core coding system | 画像をJpeg2000に符号化/復号化する基本的なシステム。 |
Part2 | Extensions | Part1の拡張 |
Part3 | Motion JPEG 2000 | 動画を取り扱うMotionJpeg2000について |
Part4 | Conformance testing | 画像伝送におけるコードストリームの検証方法を規定 |
Part5 | Reference software | Jpeg2000の機能を検証するための公式ソフトウェア
JasPer software (C) http://www.imagepower.com/
JJ2000 software (Java) http://jj2000.epfl.ch/ |
Part6 | Compound image file format | 複合画像(絵と文字が混じった画像)の規定 |
Part7 | 欠番 | . |
Part8 | JPSEC | セキュリティーを考慮したJpeg2000 |
Part9 | JPIP | ネットワーク上での扱いなど |
Part10 | JP3D | 3次元画像 |
TABLE1-1 . Jpeg2000の規格(参照:Jpeg2000 Committee Drafts)
各規格に対応したファイルフォーマットとして以下のようなものがあります。
J2K | Jpeg2000標準拡張子 |
JPC/J2C | コードストリーム部のみで構成されるJPEG2000 |
JP2 | 静止画Jpeg2000の標準(Part1) |
MJ2 | 動画Jpeg2000(Part3) |
JPX | 静止画Jpeg2000拡張(Part2) |
JPM | 静止画Jpeg2000レイヤ画像(Part6) |
J3D | 3次元画像(Part10) |
TABLE1-2 . 各フォーマット
静止画で一般に使われるのはJP2フォーマットになります。
2.圧縮方法
Jpeg2000の圧縮の流れは以下のようになります。
FIG.2-1 . 圧縮の流れ
2−1.DCレベルシフト
各コンポーネントが符号なし整数の場合、レベルシフトを行い符号付きの値に変換します。
例えば24bitのビットマップの場合、3つのコンポーネント(R,G,B)が存在し、
各々のコンポーネントは0〜255の8bit符号なし整数で表されるので、
これを-128〜127にレベルシフトします。
r(x,y)=r(x,y)-128
g(x,y)=g(x,y)-128
b(x,y)=b(x,y)-128
2−2.色変換
圧縮効率を向上させるため、RGB信号をYCbCr色空間へ変換します。
YCbCrは輝度(Y)と色差(Cb,Cr)成分を持ちます。
不可逆圧縮の場合は、ICT(Irreversible Color Transform)、
可逆圧縮の場合は、可逆変換が可能なRCT(Reversible Color Transform)を用います。
![](./2-2-1.png)
![](./2-2-2.png)
![](./2-2-3.png)
FIG.2-2-1 . RCTとICTの変換式
2−3.タイル分割
書き途中
2−4.ウェーブレット変換
書き途中
2−5.係数ビットモデリング
書き途中
2−6.算術符合化
書き途中
とりあえず実装例だけ載せておきます。
mq_cod.h
2−7.ビット切り捨て
書き途中
3.コードストリームフォーマット
コードストリームは全て、マーカーセグメント単位で構成されます。
MarkerName | Unsigned 2byte | マーカの種類。
2byteの整数で、1バイト目は必ず0xffになります。
|
MarkerLength | Unsigned 2byte | MarkerNameを含まない、マーカ全体のサイズ。
ビックエンディアンの2byte整数です。 |
MarkerData | . | 実際のデータの部分です。 |
TABLE3-1.Marker構造
Start of codestream | SOC | 0xFF4F | コードストリームの始まり |
Start of tile-part | SOT | 0xFF90 | タイルパートの始まり |
Start of data | SOD | 0xFF93 | データの始まり |
End of codestream | EOC | 0xFFD9 | コードストリームの終わり |
Image and tile size | SIZ | 0xFF51 | 画像サイズ、タイルサイズ情報 |
Coding style default | COD | 0xFF52 | . |
Coding style component | COC | 0xFF53 | . |
Region-of-interest | RGN | 0xFF5E | . |
Quantization default | QCD | 0xFF5C | . |
Quantization component | QCC | 0xFF5D | . |
Progression order default | POD | 0xFF5F | . |
Tile-part lengths, main header | TLM | 0xFF55 | . |
Packet length, main header | PLM | 0xFF57 | . |
Packet length, tile-part header | PLT | 0xFF58 | . |
Packed packet headers, main header | PPM | 0xFF60 | . |
Packed packet headers, tile-part header | PPT | 0xFF61 | . |
Start of packet | SOP | 0xFF91 | . |
End of packet header | EPH | 0xFF92 | . |
Comment and extension | CME | 0xFF64 | コメント |
TABLE3-2.Markerの種類
![](./3-1.png)
FIG.3-1 . コードストリーム構造
4.jp2ヘッダーフォーマット
jp2ファイルの構造は以下のようになっています。
JP2
JP2 Signature box |
JP2 File Type box |
JP2 header box (superbox)
Image Header box |
BitsPerComponent box |
Component Definition box |
Colour Specification box 0 |
//Colour Specification box n// |
Palette box |
Resolution box (superbox)
Capture resolution box |
Default display resolution box |
|
Contiguous codestream box 0 |
//Contiguous codestream box n// |
IPR box |
XML boxes |
UUID boxes |
UUID Info boxes (superbox)
UUID List box |
Data Entry URL box |
|
|
|
TABLE4-1.jp2ファイルの構造
jp2ファイルの中身は、boxという単位のデータ構造の集まりになってます。
太字は、jp2構成に必須になるboxです。
4−1.box
BoxLength | Unsigned 4byte | Boxのサイズをbyteで示します。BoxLength,BoxTypeも含みます。
サイズが0である場合は、ファイル終端までをサイズとします。
サイズが0のBoxが別のBox(SuperBox)に含まれる場合、そのSuperBoxの箱の長さは0とします。
これはこのBoxがファイル中、最後であることを意味します.
2〜7は、ほかの使用のために予約します。 |
BoxType | Unsigned 4byte | Boxの種類を示します
32bitのunsigned intにASCIIコードで4文字をパックしたものです。
SPACEはBoxType内では"\040"とします。 |
(BoxExtendedSize) | Unsigned 8byte | BoxLengthが1である場合こちらが実際のBoxのサイズを示します。 |
BoxData | . | 実際のデータの部分です。 |
TABLE4-1-1.box構造
データはすべてビックエンディアンです。
intel系はリトルエンディアンなので、バイト単位で順序を逆さにする必要があります。
superboxはboxの中にboxを形成します。
4−2.JP2 Signature box
JP2ファイルの先頭にあるjp2識別のための情報を含むboxです。
BoxLength | Unsigned 4byte | (0x0000000C) | . |
BoxType | Unsigned 4byte | (0x6A502020) | ("JP ") |
MagicCode | Unsigned 4byte | (0x0D0A870A) | (CR,LF,0x87,LF) |
TABLE4-2-1.JP2 Signature box構造
4−3.JP2 Filetype box
JP2 Signature boxに続くbox。
BoxLength | Unsigned 4byte | (0x00000014) | . |
BoxType | Unsigned 4byte | (0x66747970) | ("ftyp") |
jp2Header | Unsigned 4byte | (0x6A703230) | ("jp2 ") |
MinorVersion(?) | Unsigned 4byte | (0x00000000) | () |
MajorVersion(?) | Unsigned 4byte | (0x6A703230) | ("jp2 ") |
TABLE4-3-1.JP2 Filetype box構造
4−4.JP2 header box (superbox)
画像ファイルに関する情報を格納するbox
BoxLength | Unsigned 4byte | - | 要計算 |
BoxType | Unsigned 4byte | (0x6A703268) | ("jp2h") |
Image Header box | box | - | (必須) |
BitsPerComponent box | box | - | - |
Component Definition box | box | - | - |
Colour Specification box | box | - | (必須) |
Palette box | box | - | - |
Resolution box(superbox) | box | - | - |
TABLE4-4-1.JP2 Filetype box構造
4−5.JP2 Image Header box
画像情報を格納するbox
BoxLength | Unsigned 4byte | - | (0x00000016) |
BoxType | Unsigned 4byte | (0x69686472) | ("ihdr") |
height | Unsigned 4byte | - | 高さ |
width | Unsigned 4byte | - | 幅 |
Number of components | Unsigned 2byte | - | コンポーネント数 |
Bits per component | Unsigned 1byte | - | コンポーネントのビット深度。
もしすべてのコンポーネントでビット深度が同じである場合、この値がビット深度を示す。
そうでない場合は、ここの値は0としてBitsPerComponent boxで定義する。
(jasperはビット深度が同じでもここの値を0xffとして BitsPerComponent boxを使っているみたいです。) |
Compression type | Unsigned 1byte | (0x07) | 圧縮方法。JP2ファイルではこの値は7とします。 |
Colourspace Unknown | Unsigned 1byte | (0x00) | イメージ・データのcolourspaceが既知であるかどうか明示します。 0:既知,1:未知 |
Intellectual Property | Unsigned 1byte | (0x00) | 知的所有権情報を含むかどうか。 0:権利情報を含まない。,1:権利情報を含む。 |
TABLE4-5-1.JP2 Image Header box構造
以下書きかけ
(c)2002 Ida Satoshi(ayakage@msg.biglobe.ne.jp). All rights reserved.