Основы сжатия JPEG

Я читал сжатие Jpeg, но у меня есть некоторые проблемы с пониманием основ! Пожалуйста, посмотрите эту схему

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

Моя проблема заключается в последних шагах, представьте, что у нас есть серое изображение размером 16 * 16 пикселей, поэтому у нас есть 4 блока размером 8 * 8. в зигзагообразном сканировании у нас есть 4 массива размером 1 * 64, где первый индекс каждого массива является значением постоянного тока, а остальные 63 значения являются компонентами переменного тока. давайте предположим, что они похожи;

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, поэтому мы имеем:

(0,-1),(0,6),(1,-3),...

тогда в соответствии с таблицей кодов переменного тока JPEG по умолчанию мы имеем:

00-0,100-110,111001-10

и если мои расчеты верны что будет дальше?! мы ставим первый DC первого блока и после этого RLE из 63 оставшихся значений и так далее ? Я имею в виду, что для первого блока у нас есть 10010110-111110 ,00-0,100-110,111001-10, ...

Я немного запутался и нигде не мог найти ответ :(


person Amir    schedule 29.09.2014    source источник
comment
Я рекомендую: amazon.com/Compressed-Image-File-Formats -JPEG/dp/0201604434/   -  person user3344003    schedule 29.09.2014
comment
Спасибо, я прочитал главу 7 и не смог найти ответ :|   -  person Amir    schedule 29.09.2014
comment
Различия коэффициентов постоянного тока и значения переменного тока кодируются методом Хаффмана.   -  person user3344003    schedule 30.09.2014


Ответы (1)


Прежде всего, я настоятельно рекомендую вам обратиться к jpec крошечному кодировщику JPEG, написанному на C (только оттенки серого, базовый уровень JPEG на основе DCT, только блоки 8x8).

Вы можете найти основные этапы сжатия здесь. В частности, обратитесь к этой строке, которая соответствует шаг энтропийного кодирования текущего блока.

DPCM кодирует отличие от предыдущих блоков 8*8, но как?

Энтропийное кодирование работает блок за блоком. Предполагая, что текущий блок не пуст, кодирование коэффициента постоянного тока выполняется путем первого вычисления разницы между текущим и предыдущим значениями постоянного тока:

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 представляет текущую разность постоянного тока:

  1. размер этой разницы (= количество битов) кодируется путем считывания соответствующего кода DC в таблице Хаффмана,
  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) */

Полную версию можно найти в этом разделе кода.

person deltheil    schedule 30.09.2014