Здравствуйте, коллеги.
Строю свой кодер jpeg для ч\б 8-бит. изображения на fpga. 2D-DCT - quantization - zigzag сделал. Чтобы самому не строить дерево Хаффмана, хочу закодировать, использую стандартые таблицы кодирования (например отсюда
http://www.w3.org/Graphics/JPEG/itu-t81.pdf).
Для простоты я задал тестовую матрицу 8х8, над которой далаю преобразования. У меня получилась такая последовательность посли зигзага и RLE:
DC: -19 (амплитуда);
AC: (0,-26); (0,-24); (0,-7); (0,-3); (0,-10); (0,1); (0,9); (0,10); (0,1); (0,-2); (0,-4); (0,-6); (0,-3); (0,-1); (1,1); (0,2); (0,-26); (0,3); (4,-1); (21,-1); EOB. (1-е число: кол-во предшествующих нулей "RUNLENGTH", 2-е: значение "AMPLITUDE").
DC можно разложить еще в (5, -19), где 5 - размер "SIZE".
Каждое AC можно разложить, добавив еще size, например (0,-26) в (0,5)(-26).
Общий вопрос. Зачем 2 таблицы: luminance, chrominance. У меня ч\б изображение, может достаточно одной luminance?
Как закодировать DC? Значение в первом блоке, как я понимаю, определяет общую яркость всей картинки, т.к все остальные DC будут кодироваться только как разность с предыдущей DC.
Есть 2 таблицы по 12 коэф. DC коэффициентов. (luminance DC, chrominance DC). Не могу понять, как используя их можно закодировать мое число -19.
Я могу предположить что для реального изображения разность между соседними DC будет не больше 11 и можно будет использовать всего 12 значений. Но как тогда закодировать первое значение (-19)?
Для AC также есть 2 таблицы (luminance AC, chrominance AC), они уже побольше, размер 16х11.
С AC понятно только как закодировать (0,5). Это значение 11010 в "luminance AC". Но вот что делать с -26?
В моей последовательности есть такое значение (21,-1). Это значит что перед -1 было 21 ноль. Знаю что для такого случая используется код (F,0). Как при помощи его закодировать?
Прошу помочь, кто занимался таким.
Спасибо.