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 연산자를 사용하기 전에 (일반적인 VisualApplet 옵션을 사용하여) 이미지 데이터를 8x8 픽셀 블록으로 재매핑해야 합니다.

연산자의 출력은 JPEG 헤더가 없는 허프만 스트림(Huffman stream)입니다. 압축률은 런타임에 변경할 수 있는 선택된 양자화 테이블에 따라 달라집니다. 허프만 코딩에는 표준 휘도 테이블이 사용됩니다. 양자화 테이블 외에도 압축률, 즉 출력 스트림 크기는 입력 이미지에 따라 달라집니다. 따라서 연산자의 출력 너비는 원하는 출력 크기에 맞게 변경할 수 있습니다.

JPEG 인코더는 클럭 주기당 약 2.5개의 입력 픽셀을 처리할 수 있습니다. 클럭 주파수는 사용하는 프레임 그래버에 따라 다릅니다. microEnable 보조 프레임 그래버의 기본 클럭 주파수는 62.5MHz입니다. 따라서 이 연산자는 microEnable IV 프레임 그래버에서 158MPixels/s를 처리할 수 있습니다. 고품질 압축을 유발하는 양자화 테이블을 사용하는 경우 데이터 속도가 감소할 수 있습니다. 이는 약 95%를 초과하는 Quality 수준에서 발생합니다. 자세한 내용은 JPEG 어플리케이션 노트를 참조하십시오.

이 연산자는 서로 다른 두 가지 구성 방식을 나타내는 두 개의 파라미터를 사용하여 양자화 테이블을 선택할 수 있도록 합니다.

  • 필요한 경우 각 양자화 테이블 값을 개별적으로 설정할 수 있습니다. 이 경우 quantization_matrix 파라미터를 사용하십시오.

  • 대안으로 백분율 값을 기반으로 양자화 테이블을 결정할 수 있습니다. 이 경우 quality_in_percent 파라미터를 사용하십시오.

표준 휘도 양자화 테이블은 다음과 같으며 연산자의 기본 설정으로 사용됩니다.

백분율 Quality를 사용하는 경우 양자화 테이블은 다음 공식을 통해 계산됩니다.

설명한 바와 같이 연산자의 출력은 인코딩된 이미지 데이터의 허프만 스트림(Huffman Stream)입니다. 기본 DC 계수와 AC 계수는 고정되어 있으며 W. P. Pennbaker와 J. L. Mitchell의 문헌인 "JPEG Still Image Data Compression Standard, Van Nostrand Rheinhold, 1993"에서 가져온 것입니다. 목록은 아래를 참조하십시오. 인코더에 의해 생성된 허프만 스트림에는 JPEG 이미지 파일을 생성하는 데 필요한 JPEG 헤더가 포함되어 있지 않습니다. 또한 생성된 데이터 스트림의 Bit Width는 32비트입니다. JPEG 데이터 스트림의 마지막 단어, 즉 마지막 4바이트는 다음과 같은 형식의 상태 정보를 제공합니다.

  • 마지막 단어의 0번 및 1번 바이트는 0xff 및 0xd9인 JPEG EOI 마커를 나타냅니다.

  • 2번 바이트는 뒤에서 두 번째 데이터 Word에서 사용된 바이트 수([1, 4] 범위), 즉 JPEG 데이터 스트림의 실제 끝을 나타냅니다.

  • 마지막 3번 바이트는 에러 코드를 나타냅니다. JPEG 데이터 스트림이 출력 링크에 지정된 최대 이미지 너비보다 큰 경우 출력이 잘립니다(truncated). 이 경우 마지막 바이트가 1로 설정되어 이러한 잘림 현상을 감지할 수 있습니다.

JPEG 출력 데이터 스트림의 끝부분 예시는 다음과 같습니다.

뒤에서 두 번째 Word: 0xffff5fed

마지막 Word: 0x0002d9ff

따라서 JPEG 출력 데이터 스트림은 뒤에서 두 번째 Word의 두 번째 바이트로 끝납니다. 데이터 스트림은 잘리지 않았습니다.

Operator 제한 사항

  • 이 연산자는 빈 이미지, 즉 픽셀이 없는 이미지를 지원하지 않습니다.

  • 포트 I에 있는 각 입력 이미지의 라인은 길이가 같아야 합니다. 따라서 라인 길이가 다른 이미지는 허용되지 않습니다.

I/O Properties

Property Value
Operator Type M
Input Link I, data input
Output Link O, data output

Supported Link Format

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의 배수여야 합니다.

Parameters

quality_in_percent
Type 동적 읽기/쓰기 파라미터
Default 50
Range [-1, 100]

이 파라미터를 사용하여 JPEG 압축의 Quality를 변경할 수 있습니다. 양자화 매트릭스는 위에 제공된 공식을 사용하여 백분율 값으로부터 결정됩니다. 결정된 양자화 값은 quantization_matrix 파라미터에서 읽을 수 있습니다. 이 파라미터는 동적이며 애플릿의 유휴 시간 동안에만 변경해야 합니다.

0에서 100 사이의 Quality 설정을 정의할 수 있습니다. 이 파라미터에 값을 쓰면 quantization_matrix 파라미터로 수행된 양자화 매트릭스의 수동 변경 내용이 덮어씌워집니다. quality_in_percent에서 -1이 읽혀지면 양자화 매트릭스가 수동으로 변경되었음을 의미합니다.

quantization_matrix
Type static/dynamic 읽기/쓰기 매개변수
Default 표준 매트릭스(상단 참조)
Range [1, 255]

이 파라미터는 동적 읽기 및 쓰기 매트릭스 파라미터입니다. JPEG Quality가 백분율 값으로 설정된 경우, 이 파라미터를 사용하여 결정된 양자화 매트릭스 값을 읽을 수 있습니다.

이 파라미터는 사용자가 정의한 양자화 매트릭스를 지정하는 데 사용할 수도 있습니다. 이는 양자화 매트릭스 값 중 하나에 쓰기를 수행하여 수행할 수 있습니다. qulity_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"
}
};