Operator JPEG_Encoder_Gray

Operator Library: Compression

이 연산자는 8비트 흑백 이미지에 대해 JPEG 압축을 수행합니다.

[중요] 8x8 픽셀 블록 단위의 입력 데이터가 필요합니다.

이 연산자는 입력으로 8x8 픽셀 블록으로 재매핑된 이미지 데이터를 받아야 합니다.

microEnable IV 프레임 grabber를 사용하는 경우, 이 재매핑을 위해 ImageBuffer_JPEG_Gray 연산자를 사용할 수 있습니다. microEnable IV 디자인의 경우, JPEG_Encoder_Gray 연산자 바로 앞에 ImageBuffer_JPEG_Gray 연산자를 배치하기만 하면 됩니다. ImageBuffer_JPEG_Gray 연산자는 이러한 재정렬을 수행하도록 설계되었습니다.

microEnable 5 프레임 grabber를 사용하는 경우, JPEG_Encoder_Gray 연산자를 사용하기 전에 (일반적인 VisualApplets 옵션을 사용하여) 이미지 데이터를 8x8 픽셀 블록으로 재매핑해야 합니다.

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

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

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

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

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

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

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

설명한 바와 같이, 연산자의 출력은 인코딩된 이미지 데이터의 허프만 스트림입니다. 기본이 되는 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번 바이트는 뒤에서 두 번째 데이터 워드에서 사용된 바이트 수([1, 4] 범위), 즉 JPEG 데이터 스트림의 실제 끝을 나타냅니다.

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

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

뒤에서 두 번째 워드: 0xffff5fed

마지막 워드: 0x0002d9ff

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

오퍼레이터 제한 사항

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

  • 포트 I에 입력되는 각 이미지의 라인 길이는 모두 동일해야 합니다. 따라서 라인 길이가 다른 이미지는 허용되지 않습니다.

I/O Properties

Property Value
Operator Type M
입력 링크 I, data input
출력 링크 O, data output

지원되는 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 파라미터에서 읽을 수 있습니다. 이 파라미터는 동적이며 애플릿의 유휴 시간(idle time)에만 변경해야 합니다.

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 오퍼레이터의 사용법은 다음 예시와 같습니다:

추가 정보

다음 Huffman 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"
}
};