Как Huffman Encoding строит изображение (jpeg) из коэффициентов dct? - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть изображение 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

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

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

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

enter image description here

0 голосов
/ 15 марта 2013

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

0 голосов
/ 24 февраля 2012

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

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

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

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

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

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

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

...