JPEG2000概説
1.Jpeg2000とは
Jpeg2000はJPEG(Joint Photographic Codintg Expert Group)によって提唱された、新しい画像圧縮方式です。
主な特徴は
・不可逆/可逆の両方をサポート
・ブロックノイズがほとんど現れない
・高圧縮率の時の画質の良さ
等です。

(参照:jpeg.org)

現在は、Part10まで制定されています。

Part1Core coding system 画像をJpeg2000に符号化/復号化する基本的なシステム。
Part2Extensions Part1の拡張
Part3Motion JPEG 2000 動画を取り扱うMotionJpeg2000について
Part4Conformance testing 画像伝送におけるコードストリームの検証方法を規定
Part5Reference software Jpeg2000の機能を検証するための公式ソフトウェア
JasPer software (C) http://www.imagepower.com/
JJ2000 software (Java) http://jj2000.epfl.ch/
Part6Compound image file format複合画像(絵と文字が混じった画像)の規定
Part7欠番 .
Part8JPSEC セキュリティーを考慮したJpeg2000
Part9JPIP ネットワーク上での扱いなど
Part10JP3D 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)を用います。




FIG.2-2-1 . RCTとICTの変換式
2−3.タイル分割
書き途中
2−4.ウェーブレット変換
書き途中
2−5.係数ビットモデリング
書き途中
2−6.算術符合化
書き途中

とりあえず実装例だけ載せておきます。
mq_cod.h
2−7.ビット切り捨て
書き途中
3.コードストリームフォーマット
コードストリームは全て、マーカーセグメント単位で構成されます。

MarkerNameUnsigned 2byteマーカの種類。
2byteの整数で、1バイト目は必ず0xffになります。
MarkerLengthUnsigned 2byteMarkerNameを含まない、マーカ全体のサイズ。
ビックエンディアンの2byte整数です。
MarkerData.実際のデータの部分です。
TABLE3-1.Marker構造

Start of codestream SOC0xFF4Fコードストリームの始まり
Start of tile-part SOT0xFF90タイルパートの始まり
Start of data SOD0xFF93データの始まり
End of codestream EOC0xFFD9コードストリームの終わり
Image and tile size SIZ0xFF51画像サイズ、タイルサイズ情報
Coding style default COD0xFF52.
Coding style component COC0xFF53.
Region-of-interest RGN0xFF5E.
Quantization default QCD0xFF5C.
Quantization component QCC0xFF5D.
Progression order default POD0xFF5F.
Tile-part lengths, main header TLM0xFF55.
Packet length, main header PLM0xFF57.
Packet length, tile-part header PLT0xFF58.
Packed packet headers, main header PPM0xFF60.
Packed packet headers, tile-part header PPT0xFF61.
Start of packet SOP0xFF91.
End of packet header EPH0xFF92.
Comment and extension CME0xFF64コメント
TABLE3-2.Markerの種類


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
BoxLengthUnsigned 4byteBoxのサイズをbyteで示します。BoxLength,BoxTypeも含みます。
サイズが0である場合は、ファイル終端までをサイズとします。
サイズが0のBoxが別のBox(SuperBox)に含まれる場合、そのSuperBoxの箱の長さは0とします。
これはこのBoxがファイル中、最後であることを意味します.
2〜7は、ほかの使用のために予約します。
BoxTypeUnsigned 4byteBoxの種類を示します
32bitのunsigned intにASCIIコードで4文字をパックしたものです。
SPACEはBoxType内では"\040"とします。
(BoxExtendedSize)Unsigned 8byteBoxLengthが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 boxbox--
Colour Specification boxbox-(必須)
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 componentsUnsigned 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 PropertyUnsigned 1byte(0x00)知的所有権情報を含むかどうか。
0:権利情報を含まない。,1:権利情報を含む。
TABLE4-5-1.JP2 Image Header box構造
以下書きかけ

(c)2002 Ida Satoshi(ayakage@msg.biglobe.ne.jp). All rights reserved.