Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2013, 23:52   #1
stragger
 
Регистрация: 15.11.2009
Сообщений: 3
По умолчанию Сжатие jpeg. Стандартные таблицы Хаффмана.

Доброго дня!
Пытаюсь разобраться с алгоритмом сжатия Jpeg.
Завис на этапе кодирования Хаффмана. Как я понял на этом этапе чаще всего используются уже подобранные таблицы кодов.
http://www.impulseadventure.com/phot...ized-jpeg.html
Таблицы в разделе "Standard Huffman Tables"

Не ясно как применять эти таблицы в полученной последовательности после зигзаг обхода и применения RLE.

Возможно ошибся с разделом, не нашёл ничего подходящего, но думаю в этом разделе бывают люди, которые смогут мне помочь
stragger вне форума Ответить с цитированием
Старый 13.05.2013, 12:21   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

по моему, там ничего особо умного, величина амплитуды после квантования и RLE является индексом в таблицу Хаффмана.

а для пользы дела, стоит обратиться к Википедии, там наверняка полезные ссылки есть.
f.hump вне форума Ответить с цитированием
Старый 13.05.2013, 14:02   #3
stragger
 
Регистрация: 15.11.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
по моему, там ничего особо умного, величина амплитуды после квантования и RLE является индексом в таблицу Хаффмана.
А можно подробнее? Вот пусть у нас есть последовательность
1118; (0, 2); (1, -2);(13,-1); EndOfBlock;
Первый коэффициент DC, дальше в скобках (количество перед числом, число).

Было бы круто на примере таблиц по ссылке показать как это будет выглядеть.

Главная проблема вот в чем: в таблице коды разделены по размеру бит на код. Определить сколько бит на код для конкретного числа я могу, а как выбирать код после того как определился с размером кода в битах не ясно.
stragger вне форума Ответить с цитированием
Старый 13.05.2013, 15:25   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

могу рассказать мое видение ситуации.

как генерить коды Хаффманна можно прочитать где угодно.

перед сжатием коды упорядочиваются по значению и длине в битах. получается упорядоченный массив кодов huffman_codes[].
также нужен массив содержащий количество задействованных кодов для каждой длины codes_count[16] и массив значений связаный с кодами разной длины coded_values[16][]. (максимальная длина кода для jpeg 16 бит).


после DCT, quantization, RLE получается, к примеру, такое

Цитата:
1118; (0, 2); (1, -2);(13,-1); EndOfBlock;
для пользы дела это стоит записать так:

zz_dc = 1118;
zz_ac[] = {2, 18, 209, 0};

каждая цифра тут это индекс в массив кодов.
дальше нужно определить длину кода в битах

code_length_i = bit_length(huffman_codes[zz_ac[i]])

проверить наличие/отсутствие значения zz_ac[i] в соответствующем списке coded_values[code_length_i][]
если его там нет, то добавить его в список, увеличить codes_count[code_length_i] на 1, и записать codes_count[code_length_i] код из диапазона кодов длиной code_length_i в выходной поток, плюс все детали необходимые для восстановления амплитуды.

примерно так.

еще нужно помнить, что для DC и AC коэффициентов используются разные таблицы и схемы кодирования, плюс еще куча разной, но необходимой мурзилки.

Последний раз редактировалось f.hump; 13.05.2013 в 15:51. Причина: протупил
f.hump вне форума Ответить с цитированием
Старый 13.05.2013, 16:17   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

решил таки посмотреть материал по ссылке.

Похоже имеет место недопонимание ситуации. В jpeg "таблица Хаффмана" состоит из массивов codes_count[16] и coded_values[16][].
Для каждой картинки генерятся свои таблицы. И материал по ссылке рассказывает о преимуществах Адобовского генератора перед стандартным, на примере портрета хищной птички.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стандартные классы smaiq Visual C++ 5 24.12.2012 23:53
JPEG сжатие на C++ racushka_n Помощь студентам 4 24.04.2012 23:04
Стандартные функции C++ vandrouny Общие вопросы C/C++ 4 09.12.2010 22:37
Сжатие информации методом Хаффмана на С++ BaSoff Общие вопросы C/C++ 3 18.11.2009 19:51
Стандартные модули dr.Chas Общие вопросы Delphi 1 07.09.2008 16:54