オペレーター JPEG_Encoder_Gray

オペレーター Library: Compression

このオペレーターは、8ビットグレースケール画像のJPEG圧縮を実行します。

[重要] 8x8ピクセルのブロック単位の入力データが必要です

入力において、オペレーターは8x8ピクセルのブロックに再マッピングされた画像データを受け取る必要があります。

microEnable IVフレームグラバーを使用している場合、この再マッピングにオペレーター ImageBuffer_JPEG_Gray を使用できます。 microEnable IVのデザインの場合は、オペレーター JPEG_Encoder_Gray の手前にオペレーター ImageBuffer_JPEG_Gray を配置するだけです。 オペレーター ImageBuffer_JPEG_Gray は、この並べ替えを実行するように設計されています。

microEnable 5フレームグラバーを使用している場合は、オペレーター JPEG_Encoder_Gray を使用する前に、(一般的なVisualAppletsのオプションを使用して)画像データを8x8ピクセルのブロックに必ず再マッピングしてください。

オペレーターの出力は、JPEGヘッダーを持たないハフマンストリームです。 圧縮率は、実行時に変更可能な、選択された量子化テーブルによって異なります。 ハフマン符号化には標準輝度テーブルが使用されます。 量子化テーブルのほか、圧縮率、つまり出力ストリームのサイズは入力画像によって異なります。 したがって、オペレーターの出力幅は、希望する出力サイズに変更可能です。

JPEGエンコーダーは、クロックサイクルあたり約2.5入力ピクセルを処理できます。 クロック周波数は使用するフレームグラバーによって異なります。microEnable IVフレームグラバーのベースクロック周波数は62.5MHzです。 したがって、オペレーターはmicroEnable IVフレームグラバー上で158MPixels/sを処理できます。 高品質な圧縮を引き起こす量子化テーブルを使用した場合、データレートを削減できます。 これは、Qualityレベルが約95%を超える場合に発生します。 詳細については、JPEGアプリケーションノートを参照してください。

このオペレーターでは、2つの設定方法を表す2つのパラメータを使用して量子化テーブルを選択できます。

  • 必要に応じて、量子化テーブルの各値を個別に設定できます。 この場合は、パラメータ quantization_matrix を使用してください。

  • あるいは、パーセンテージ値から量子化テーブルを決定することもできます。 この場合は、パラメータ quality_in_percent を使用してください。

標準輝度量子化テーブルを以下に示します。これは、オペレーターのデフォルト設定として使用されます。

パーセンテージによるQualityを使用する場合、量子化テーブルは次の式によって計算されます

説明したように、オペレーターの出力はエンコードされた画像データのハフマンストリームです。 基礎となるDC係数およびAC係数は固定されており、文献(W. P. Pennbaker and J. L. Mitchell, JPEG Still Image Data Compression Standard, Van Nostrand Rheinhold, 1993)から取得されています。 リストについては以降を参照してください。 エンコーダーによって生成されたハフマンストリームには、JPEG画像ファイルを生成するために必要なJPEGヘッダーが含まれていません。 さらに、生成されたデータストリームは32-bitの幅を持っています。 JPEGデータストリームの最後 ワード、つまり最後の4バイトには、次の形式のステータス情報が含まれています。

  • 最後のワードの0バイト目と1バイト目は、0xffおよび0xd9であるJPEG EOIマーカーを表します。

  • 2番目のバイトは、最後から2番目のデータワードで使用されているバイト数(範囲 [1, 4])、つまりJPEGデータストリームの実際の終了位置を表します。

  • 最後の3番目のバイトはエラーコードを表します。 JPEGデータストリームが、出力リンクに指定された最大画像幅よりも大きい場合、出力は切り捨てられます。 これが発生した場合、最後のバイトは1に設定され、この切り捨ての検出が可能になります。

JPEG出力データストリームの終了部分の例を以下に示します。

最後から2番目のワード: 0xffff5fed

最後のワード: 0x0002d9ff

したがって、JPEG出力データストリームは、最後から2番目のワードの2番目のバイトで終了します。 データストリームは切り捨てられていません。

Operator Restrictions

  • このオペレーターは空の画像、つまりピクセルを持たない画像をサポートしていません。

  • ポートIにおける各入力画像のラインは同じ長さでなければなりません。したがって、ラインの長さが異なる画像は許可されません。

I/O Property

Property 値
オペレータータイプ M
Input Link I, data input
Output Link O, data output

サポートされているリンクフォーマット

Link Parameter Input Link I Output Link O
Bit Width 8 32
Arithmetic unsigned as I
Parallelism 8 1
Kernel Columns 1 as I
Kernel Rows 1 as I
Img Protocol VALT_IMAGE2D as I
Color Format VAF_GRAY as I
Color Flavor FL_NONE as I
Max. Img Width any1 any
Max. Img Height any2 1

1 2

入力の幅と高さは8の倍数である必要があります。

パラメーター

quality_in_percent
タイプ 動的読み取り/書き込みパラメータ
Default 50
範囲 [-1, 100]

このパラメータを使用して、JPEG圧縮のQualityを変更できます。 量子化マトリクスは、上記の式を使用してパーセンテージ値から決定されます。 決定された量子化値は、パラメータ quantization_matrix から読み取ることができます。 このパラメータは動的であり、アプレットのアイドル時間にのみ変更する必要があります。

0から100の間のQuality設定を定義できます。 このパラメータに書き込むと、パラメータ quantization_matrix によって行われた量子化マトリクスの手動変更が上書きされます。 quality_in_percent から -1 が読み取られた場合、量子化マトリクスの手動変更が行われています。

quantization_matrix
タイプ static/dynamic read/write parameter
Default 標準マトリクス(上記を参照)
範囲 [1, 255]

このパラメータは、動的な読み取り/書き込みマトリクスパラメータです。 JPEGのQualityがパーセンテージ値で設定されている場合。 このパラメータを使用して、決定された量子化マトリクスの値を読み取ることができます。

このパラメータは、ユーザー定義の量子化マトリクスを指定するためにも使用できます。 これを行うには、いずれかの量子化マトリクス値に書き込みます。 パラメータ quality_in_percent への書き込みは、ユーザーが指定した量子化値を破棄することに注意してください。 便宜上、ユーザーが指定した値が書き込まれた後、パラメータ quality_in_percent は -1 に設定されます。

使用例

JPEG_Encoder_Gray オペレータの使用方法は、次の例に示されています。

詳細情報

次のハフマン DC および AC 係数が使用されます。

typedef char DCHuffTableType[12][17]; // huffman-table for luminance-DC-coefficients

DCHuffTableType Lum_DC_HuffmanTable= {
"00",
"010",
"011",
"100",
"101",
"110",
"1110",
"11110",
"111110",
"1111110",
"11111110",
"111111110" };

typedef char ACHuffTableType[16][11][17]; // Huffman-Tabelle für Luminance-AC-Koeffizienten

ACHuffTableType Lum_AC_HuffmanTable= {
{ //Run == 0
"1010",//EOB
"00",
"01",
"100",
"1011",
"11010",
"1111000",
"11111000",
"1111110110",
"1111111110000010",
"1111111110000011"
},
{ //Run == 1
"1010",//EOB
"1100",
"11011",
"1111001",
"111110110",
"11111110110",
"1111111110000100",
"1111111110000101",
"1111111110000110",
"1111111110000111",
"1111111110001000"
},
{ //Run == 2
"1010",//EOB
"11100",
"11111001",
"1111110111",
"111111110100",
"1111111110001001",
"1111111110001010",
"1111111110001011",
"1111111110001100",
"1111111110001101",
"1111111110001110"
},
{ //Run == 3
"1010",//EOB
"111010",
"111110111",
"111111110101",
"1111111110001111",
"1111111110010000",
"1111111110010001",
"1111111110010010",
"1111111110010011",
"1111111110010100",
"1111111110010101"
},
{ //Run == 4
"1010",//EOB
"111011",
"1111111000",
"1111111110010110",
"1111111110010111",
"1111111110011000",
"1111111110011001",
"1111111110011010",
"1111111110011011",
"1111111110011100",
"1111111110011101",
},
{ //Run == 5
"1010",//EOB
"1111010",
"11111110111",
"1111111110011110",
"1111111110011111",
"1111111110100000",
"1111111110100001",
"1111111110100010",
"1111111110100011",
"1111111110100100",
"1111111110100101"
},
{ //Run == 6
"1010",//EOB
"1111011",
"111111110110",
"1111111110100110",
"1111111110100111",
"1111111110101000",
"1111111110101001",
"1111111110101010",
"1111111110101011",
"1111111110101100",
"1111111110101101"
},
{ //Run == 7
"1010",//EOB
"11111010",
"111111110111",
"1111111110101110",
"1111111110101111",
"1111111110110000",
"1111111110110001",
"1111111110110010",
"1111111110110011",
"1111111110110100",
"1111111110110101",
},
{ //Run == 8
"1010",//EOB
"111111000",
"111111111000000",
"1111111110110110",
"1111111110110111",
"1111111110111000",
"1111111110111001",
"1111111110111010",
"1111111110111011",
"1111111110111100",
"1111111110111101"
},
{ //Run == 9
"1010",//EOB
"111111001",
"1111111110111110",
"1111111110111111",
"1111111111000000",
"1111111111000001",
"1111111111000010",
"1111111111000011",
"1111111111000100",
"1111111111000101",
"1111111111000110"
},
{ //Run == 0xA
"1010",//EOB
"111111010",
"1111111111000111",
"1111111111001000",
"1111111111001001",
"1111111111001010",
"1111111111001011",
"1111111111001100",
"1111111111001101",
"1111111111001110",
"1111111111001111"
},
{ //Run == 0xB
"1010",//EOB
"1111111001",
"1111111111010000",
"1111111111010001",
"1111111111010010",
"1111111111010011",
"1111111111010100",
"1111111111010101",
"1111111111010110",
"1111111111010111",
"1111111111011000"
},
{ //Run == 0xC
"1010",//EOB
"1111111010",
"1111111111011001",
"1111111111011010",
"1111111111011011",
"1111111111011100",
"1111111111011101",
"1111111111011110",
"1111111111011111",
"1111111111100000",
"1111111111100001"
},
{ //Run == 0xD
"1010",//EOB
"11111111000",
"1111111111100010",
"1111111111100011",
"1111111111100100",
"1111111111100101",
"1111111111100110",
"1111111111100111",
"1111111111101000",
"1111111111101001",
"1111111111101010"
},
{ //Run == 0xE
"1010",//EOB
"1111111111101011",
"1111111111101100",
"1111111111101101",
"1111111111101110",
"1111111111101111",
"1111111111110000",
"1111111111110001",
"1111111111110010",
"1111111111110011",
"1111111111110100"
},
{ //Run == 0xF
"11111111001", //ZRL
"1111111111110101",
"1111111111110110",
"1111111111110111",
"1111111111111000",
"1111111111111001",
"1111111111111010",
"1111111111111011",
"1111111111111100",
"1111111111111101",
"1111111111111110"
}
};