Как Huffman Encoding создает изображение (jpeg) из коэффициентов dct?

У меня есть изображение 512x512, и я попытался его повторно сжать. Вот шаги для повторного сжатия изображения в файл jpeg

    1) convert rgb to YCrCb
    2) perform down sampling on Cr and Cb
    2) convert YCrCb to DCT and Quantized according to chosen Quality
    3) perform Huffman Encoding on Quantized DCT

Но перед кодированием Хаффмана я подсчитал количество DCT-коэффициентов, и оно составило 393216. Деление на 64 дает мне номер DCT-блока (8x8), который будет 6144.

Теперь я попытался посчитать количество блоков 8x8 для пиксельной области. 512/8 = 64, что дает мне 64 блока по горизонтали и 64 блока по вертикали. 64 x 64 = 4096, что не равно количеству блоков DCT, в то время как количество пикселей составляет 512x512 = 262144

Мой вопрос заключается в том, как кодирование Хаффмана волшебным образом преобразует коэффициенты 393216 в 262144 пикселей, получает значения каждого пикселя и вычисляет размер (512x512) сжатого изображения (jpeg).

Заранее спасибо. : D


person Frank Smith    schedule 23.02.2012    source источник
comment
Вы действительно выполняли кодирование Хоффмана вручную или используете какую-то библиотеку?   -  person Sam I am says Reinstate Monica    schedule 24.02.2012
comment
Я использовал библиотеку для всего процесса сжатия   -  person Frank Smith    schedule 24.02.2012


Ответы (3)


Если ваше изображение было закодировано без подвыборки цвета, то будет соотношение 1: 1 блоков коэффициентов 8x8 к блокам компонентов цвета 8x8. Каждый MCU (минимальный кодированный блок) будет иметь размер 8x8 пикселей и 3 блока коэффициентов 8x8. 512x512 пикселей = 64x64 8x8 блоков x 3 (по одному для Y, Cr и Cb) = 12288 блоков коэффициентов.

Поскольку вы сказали, что вы сделали субдискретизацию цвета (я предполагаю, что в обоих направлениях), то теперь у вас будет 6 блоков 8x8 для каждого MCU. На диаграмме ниже крайняя левая диаграмма показывает случай отсутствия субдискретизации цветов, а крайняя правая диаграмма показывает субдискретизацию в обоих направлениях. Размер MCU в этом случае будет 16x16 пикселей. Каждому блоку пикселей размером 16x16 потребуется 6 блоков коэффициентов 8x8 для его определения (4 Y, 1 Cr, 1 Cb). Если вы разделите изображение на микроконтроллеры 16x16, у вас будет 32x32 микроконтроллера каждый с 6 блоками 8x8 на микроконтроллер = 6144 блока коэффициентов. Итак, чтобы ответить на ваш вопрос, кодирование Хаффмана - это не то, что меняет количество коэффициентов, это подвыборка цвета. Частично сжатие, которое происходит за счет использования подвыборки цвета в изображениях JPEG, использует особенности зрительной системы человека. Наши глаза более чувствительны к изменениям яркости, чем цветности.

введите описание изображения здесь

person BitBank    schedule 23.02.2012

Кодирование Хаффмана не преобразует коэффициенты в пиксели или что-то в этом роде. По крайней мере, не ту кодировку Хаффмана, о которой я думаю. Все кодирование Хаффмана делает это, берет список токенов и представляет их с меньшим количеством битов в зависимости от частоты этих токенов.

пример: у вас есть токены a, b, c и d

теперь, без сжатия, каждый из ваших токенов потребует 2 бита (00, 01, 10 и 11).

скажем, a = 00, b = 01, c = 10 и d = 11

aabaccda будет представлен как 0000010010101100 16 бит

но с кодировкой Хаффмана вы бы представляли a с меньшим количеством битов, потому что это более распространено, и вы бы представляли b и d с большим количеством, потому что они менее распространены до степени:

a = 0, b = 110, c = 10, d = 111, а затем

aabaccda будет представлен как 00110010101110 14 бит

person Sam I am says Reinstate Monica    schedule 23.02.2012

Ваше изображение имеет размер 512x512 пикселей. Компонент Y равен 512x512, следовательно, 262144 пикселя превращены в 262144 коэффициента DCT. Компоненты Cb и Cr подвергаются субдискретизации на 2, следовательно, 256x256 пикселей превращаются в каждый 65536 коэффициентов DCT. Сумма всех DCT-коэффициентов равна 262144 + 65536 + 65536 = 393216. Хаффман не имеет к этому никакого отношения.

person flanglet    schedule 15.03.2013