Operator JPEG_Encoder_Gray

Operator 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 之前,將影像資料重新映射為 8x8 像素的區塊(透過 VisualApplet 的一般選項)。

此運算子的輸出為不含 JPEG 標頭的霍夫曼(Huffman)資料流。 壓縮率取決於所選的量化表,且該量化表可在執行期間變更。 霍夫曼編碼採用標準亮度量化表。 除了量化表之外,壓縮率(即輸出資料流的大小)亦取決於輸入影像。 因此,此運算子的輸出寬度可調整為所需的輸出大小。

JPEG 編碼器每時鐘週期約可處理 2.5 個輸入像素。 時鐘頻率取決於所使用的幀擷取卡。microEnable IV 幀擷取卡的基本時鐘頻率為 62.5MHz。 因此,操作者可在 microEnable IV 幀擷取卡上處理 158MPixels/s。 若使用可實現高品質壓縮的量化表,資料傳輸速率可能會降低。 此情況適用於品質等級約在 95% 以上的情況。 更多詳細資訊,請參閱 JPEG 應用說明。

該運算子允許透過兩個參數來選擇量化表,這兩個參數代表兩種不同的配置方式。

  • 若需要,可分別設定每個量化表的數值。 此時請使用參數quantization_matrix。

  • 此外,量化表也可根據百分比值來決定。 在這種情況下,請使用參數quality_in_percent。

以下所示為標準亮度量化表,此表用作操作員的預設設定。

若採用百分比品質,則量化表將依據下列方程式計算

如前所述,此運算子的輸出為經編碼之影像資料的霍夫曼資料流。 其基礎的DC 係數與AC係數均為固定值,並取自文獻, 即 W. P. Pennbaker 與 J. L. Mitchell 所著的《JPEG 靜態影像資料壓縮標準》(Van Nostrand Rheinhold,1993 年)。 請參閱下文的程式碼清單。 編碼器所產生的哈夫曼資料流並不包含生成 JPEG 影像 檔案所需的 JPEG 標頭。 此外,所產生的資料流位寬為 32 位元。 最後一個字元(即 JPEG 資料流的最後四個位元組)提供格式如下所示的狀態資訊:

  • 最後一個字元的前兩個位元(第 0 位元和第 1 位元)代表 JPEG EOI 標記,其值分別為 0xff 和 0xd9。

  • 第 2 位元組代表在範圍 [1, 4] 內倒數第二個資料字中所使用的位元組數,也就是 JPEG 資料流的真正結束點。

  • 最後一個位元組(編號三)代表錯誤代碼。 若 JPEG 資料流大於輸出連結所指定的最大影像寬度,輸出內容將會被截斷。 若發生此情況,最後一個位元組將被設定為 1,以便偵測此截斷現象。

以下提供了一個 JPEG 輸出資料流結尾的範例:

倒數第二個字:0xffff5fed

最後一個字元:0x0002d9ff

因此,JPEG 輸出資料流以倒數第二個字元的第二個位元組作為結尾。 該資料流並未被截斷。

Operator Restrictions

  • 此運算子不支援空影像,也就是沒有像素的影像。

  • 連接至 I 埠的每張輸入影像的行數必須相同。因此,不允許行數不一致的影像。

I/O Properties

Property Value
Operator Type M
Input Link I,資料輸入
Output Link O,資料輸出

Supported Link Format

Link Parameter Input Link I Output Link O
Bit Width 8 32
Arithmetic 無號數 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 的倍數。

Parameters

品質百分比
Type 動態讀取/寫入參數
Default 50
Range [-1, 100]

透過此參數可調整 JPEG 壓縮的品質。 量化矩陣是根據百分比值,透過上述方程式計算得出的。 計算出的量化值可從參數 quantization_matrix 中讀取。 此參數為動態參數,僅應在 Applet 的閒置期間進行變更。

Quality 可設定的範圍為 0 至 100。 若對此參數寫入資料,將覆寫先前透過`quantization_matrix` 參數對量化矩陣所做的手動變更。 若從`quality_in_percent` 讀取到的值為 -1,表示已對量化矩陣進行了手動變更。

量化矩陣
Type static/dynamic 讀寫參數
Default 標準矩陣(見上文)
Range [1, 255]

此參數為動態讀寫矩陣參數。 若 JPEG 畫質以百分比值設定, 則可透過此參數讀取已確定的量化矩陣數值。

此參數亦可用於指定使用者自訂的量化矩陣。 這可透過寫入任一量化矩陣值來實現。 請注意,若寫入參數 quality_in_percent,將會捨棄使用者指定的量化值。 為方便起見,在寫入使用者指定的值後,參數quality_in_percent會被設定為 -1。

Examples of Use

以下範例展示了運算子 JPEG_Encoder_Gray 的使用方式:

More Information

以下是所使用的哈夫曼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"
}
};