libjpeg turboの使い方

9
LIBJPEG TURBO ののののの ののののののののの 12 ののののののの のののの ののののののの https:// github.com/norishigefukushima/libjpeg12bit

Upload: norishige-fukushima

Post on 25-Jun-2015

984 views

Category:

Documents


2 download

DESCRIPTION

LIBJPEG TURBOの使い方と 12ビット画像への対応.8ビット以上の画像をJPEG圧縮したいときに. https://github.com/norishigefukushima/libjpeg12bit

TRANSCRIPT

Page 1: Libjpeg turboの使い方

LIBJPEG TURBO の使い方と

12ビット画像への対応名古屋工業大学

福嶋慶繁

サンプルコードhttps://github.com/norishigefukushima/libjpeg12bit

Page 2: Libjpeg turboの使い方

LIBJPEG TURBO とは

• libjpeg を SIMD 等を用いて高速化実装したライブ

ラリ.

•標準に準拠したいくつかの拡張機能も実装済み

•並列化はベクトル化のみで,マルチコアは不使用

• libjpeg と libjpegturbo の関数や設定は同じ.

Page 3: Libjpeg turboの使い方

使い方

Page 4: Libjpeg turboの使い方

Jpeg.cpp

• OpenCV の IO をもつサンプル• imencodeJPEG, imdecodeJPEG で画像の圧縮展開• jpeg_encode と jpeg_decode が libjpeg を使った圧縮の実体• このサンプルのライブラリとして添付されている libjpeg.lib

は visual studio 64bit バイナリ向けの入力画像が 12bit でに対応したものでそれに付随してコードも変更されている.

• todo• Mat のタイプを切り替えることで 8bit 12bit どっちも対応するコー

ドが生成可能なので気が向いたら変更.

Page 5: Libjpeg turboの使い方

DCT の精度を変更する

• 構造体 struct jpeg_compress_struct cinfo のパラメータにて

cinfo.dct_method=JDCT_ISLOWとすることで変更可能.候補は 3 つ.

typedef enum { JDCT_ISLOW, /* slow but accurate integer algorithm */ JDCT_IFAST, /* faster, less accurate integer method */ JDCT_FLOAT /* floating-point: accurate, fast on fast HW */} J_DCT_METHOD;

Page 6: Libjpeg turboの使い方

算術符号化を使う

• 構造体 struct jpeg_compress_struct cinfo のパラメータにて

cinfo.arith_code = TRUEとすることで算術符号化が有効化

算術符号化は符号化効率が大きく向上する一方で計算コストが増える.

Page 7: Libjpeg turboの使い方

ハフマンテーブルを設定する

• クオリティパラメータ( 0-100 )を量子化パラメータへ変換する• int q = jpeg_quality_scaling(quality);

• 量子化テーブルを新たにセットする• ルミナンスが 0 番クロマが 1 番• jpeg_add_quant_table(& cinfo, 0,std_luminance_quant_tbl, q,

TRUE);• jpeg_add_quant_table(& cinfo, 1,std_chrominance_quant_tbl,

q, TRUE);

• テーブルは 16x16

static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {16, 11, 10, 16, 24, 40, 51, 61,12, 12, 14, 19, 26, 58, 60, 55,14, 13, 16, 24, 40, 57, 69, 56,14, 17, 22, 29, 51, 87, 80, 62,18, 22, 37, 56, 68, 109, 103, 77,24, 35, 55, 64, 81, 104, 113, 92,49, 64, 78, 87, 103, 121, 120, 101,72, 92, 95, 98, 112, 100, 103, 99};

static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {17, 18, 24, 47, 99, 99, 99, 99,18, 21, 26, 66, 99, 99, 99, 99,24, 26, 56, 99, 99, 99, 99, 99,47, 66, 99, 99, 99, 99, 99, 99,99, 99, 99, 99, 99, 99, 99, 99,99, 99, 99, 99, 99, 99, 99, 99,99, 99, 99, 99, 99, 99, 99, 99,99, 99, 99, 99, 99, 99, 99, 99};

Page 8: Libjpeg turboの使い方

12bit で使う

• Cmake のオプションで WITH12bit を on にしてコンパイル• 注意

• 8bit と併用不可. 12bit 入力専用ライブラリになる.• 算術符号使用不可

• 入力ビットストリーム( JSAMPLE )は short 型

Page 9: Libjpeg turboの使い方

差分を符号化する

• フレーム間差分などの情報を 12bit 対応 JPEG で保存する場合,量子化テーブルを MPEG のインターフレームの符号化の係数のように変更する必要がある.• 自然画像よりもフラットな量子化係数が好ましい

static const unsigned int flt_luminance_quant_tbl[DCTSIZE2] = {16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16,16, 16, 16, 16, 16, 16, 16, 16};

//MPEG2 test model 5static const unsigned int flt_chrominance_quant_tbl[DCTSIZE2] = {16, 17, 18, 19, 20, 21, 22, 23,17, 18, 19, 20, 21, 22, 23, 24,18, 19, 20, 21, 22, 23, 24, 25,19, 20, 21, 22, 23, 24, 25, 27,20, 21, 22, 23, 24, 25, 27, 28,21, 22, 23, 24, 25, 27, 28, 30,22, 23, 24, 25, 27, 28, 30, 31,23, 24, 25, 27, 28, 30, 31, 33};