2014-09-29 2 views
0

Jpeg 압축을 읽었지 만 기본 사항을 이해하는 데 약간의 문제가 있습니다! PLS 내 문제는 마지막 단계에JPEG 압축 기본 사항

http://www.cs.cf.ac.uk/Dave/Multimedia/Topic5.fig_29.gif

이 스키마를 참조, 우리는 16 * 16 픽셀의 회색의 이미지를 고려, 그래서 우리는 크기 8 * 8의 4 개 블록이있다. 지그재그 스캔에서 크기가 1 * 64 인 4 개의 배열을 가지며 각 배열의 첫 번째 인덱스는 DC 값이고 나머지 63 개의 값은 AC 구성 요소입니다. 같은 것을 가정 해 봅시다.

BLOCK-1::150,-1, 6, 0,-3,.... 
BLOCK-2:-38, 4,-6,-1, 1,.... 
BLOCK-3:18,-2,3,4,1,.... 
BLOCK-4:45,3,5,-1,1,.... 

DPCM은 이전의 8 * 8 블록과의 차이를 인코딩하지만 어떻게 알 수 있습니까?! 이런 뭔가해야만 :

150,150-(-38),-38-18,45-18>> 
150,188,-156,27 

후 JPEG 계수 부호화 테이블에 따라 우리가 (예를 들어),

10010110-111110,10111100-111110,01100011-111110,11011-110 

과의 AC 성분에 대해이 첫 번째 행 (-1, 6, 0, -3, ...) 우리는 RLE를 사용 그래서 우리는이 :

JPEG의 기본 AC 코드 표에 따라 다음
(0,-1),(0,6),(1,-3),... 

우리가 가진 :

00-0,100-110,111001-10 

내 계산이 정확하면 다음에 어떤 일이 발생합니까?! 첫 번째 블록의 첫 번째 DC를 넣은 후 63 개의 나머지 값과 같은 RLE를 넣습니다. 나는 우리가 첫 번째 블록에 대한 의미 10010110-111110 ,00-0,100-110,111001-10, ...

나는 조금 혼란 스러워요 그리고 난 아무 대답을 찾을 수 없습니다 :(모든

+0

나는 추천 : http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=pd_sim_b_1?ie=UTF8&refRID=1H35H2R09003XR2V7JBH – user3344003

+0

감사합니다, 나는 제 7 장 및 나오지 않았어 읽기 ' 내 대답을 찾지 : | – Amir

+0

DC 계수 차이와 AC 값은 허프만 인코딩입니다. – user3344003

답변

0

먼저 나는 매우 당신이 jpec 작성된 작은 JPEG 인코더를 참조하는 것이 좋습니다 C (계조만을 기준 DCT 기반 JPEG, 8 × 8 블록 만).

에서는 메인 압축 here 단계를 찾을 수있다. 특히, 상기 현재 블록의 부호화 단계 엔트로피에 해당 this line 참조하시기 바랍니다.

DPCM은 이전 8 * 8 블록과의 차이를 인코딩하지만 어떻게됩니까?

엔트로피 코딩은 블록 이후에 동작한다. 상기 현재 블록을 가정하면 DC 계수의 인코딩은 먼저 현재 및 이전의 DC 값의 차이를 계산함으로써 행해진 다 비어 있지 :

int val, bits, nbits; 
/* DC coefficient encoding */ 
if (block->len > 0) { 
    val = block->zz[0] - s->dc; 
    s->dc = block->zz[0]; 
} 

참고 s 상태 코더 엔트로피를 나타낸다. 또한, 첫 번째 블록에 대해, s->dc은 따라서 0

val 초기화된다 현재 DC 차이를 나타냄

    이 차분 (= 비트 수)의 크기는 대응하는 DC 코드를 판독하여 부호화
  1. 허프만 테이블에서
  2. 의 진폭 (= 값)이 인코딩됩니다.

차이가 음수이면 2의 보수가 사용됩니다.

bits = val; 
if (val < 0) { 
    val = -val; 
    bits = ~val; 
} 
JPEC_HUFF_NBITS(nbits, val); 
jpec_huff_write_bits(s, jpec_dc_code[nbits], jpec_dc_len[nbits]); /* (1) */ 
if (nbits) jpec_huff_write_bits(s, (unsigned int) bits, nbits); /* (2) */ 

전체 버전은 code section을 참조하십시오.