Форум программистов, компьютерный форум CyberForum.ru

кодирование хаффмана - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
14.03.2012, 17:28     кодирование хаффмана #1
здравствуйте! я пишу программу сжатия jpeg. написала код для кодирования хаффмана по дереву. и столкнулась с такой проблемой записываю в файл jpeg в маркер ffc4 количество длин кодов и кодируемые символы...(весь файл сохранила как написано в стандарте). и когда начинаю декодировать с помощью программы jpegsnoop она мне выдает коды не те что у меня получились в моей программе...у меня подозрения что она кодирует хаффмана по длине кодов...может ли такое быть и как исправить эту ошибку или я что-то не так делаю....
помогите пожалуйста, никак не могу найти выход из этой проблемы...заранее спасибо!...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
15.03.2012, 10:01     кодирование хаффмана #2
А напишите Ваши коды и те, что jpegsnoop выдает
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
19.03.2012, 11:23  [ТС]     кодирование хаффмана #3
для конкретного jpeg сжатия для дерева АС Y у меня в моей программе получились коды в зависимости от вероятности повторений
символы(в 16-ричной системе) - длины 5:
6F - 01010
76 - 01011
77 - 01100
7B - 01101
7D - 01110
81 - 01111
длины 4:
8A - 0000
8D - 0001
9A - 0010
88 - 0011
79 - 0100
и код длины 1:
80 - 1

а в программе jpegsnoop при декодировании моего сохраненного jpeg файла те же самые символы получаются декодированы кодами:
длины 5:
11010
11011
11100
11101
11110
11111
длины 4:
1000
1001
1010
1011
1100
длины 1:
0

а вот с AC-коэффициентами цветоразности получились разные совсем коды:
символы - коды длиной 6
7B - 011110
7C - 011111
символы - коды длиной 5
7F - 00000
86 - 00001
8A - 00010
8B - 00011
8C - 00100
8E - 00101
84 - 01110
символы - коды длиной 4
7E - 0011
7D - 0100
82 - 0101
81 - 0110
символы - коды длиной 1
80 - 1
а в программе jpegsnoop при декодировании тех же символов получаются коды
длины 6:
111110
111111
длины 5:
11000
11001
11010
11011
11100
11101
11110
длины 4:
1000
1001
1010
1011
длины 1:
0
получается различие кодов...а почему непонятно..из-за этого я так понимаю ошибки в маркере закодированных данных....

Добавлено через 12 минут
еще в программе jpegsnoop такую ошибку *** ERROR: @ 0x00000127.7, num_coeffs>64 [68]

*** ERROR: @ 0x00000127.7, num_coeffs>64 [68]
*** ERROR: Bad scan data in MCU(0,0): Lum AC CSS(0,0) @ Offset 0x00000128.0
MCU located at pixel=(0,0)
*** ERROR: @ 0x0000012E.2, num_coeffs>64 [69]
*** ERROR: Bad scan data in MCU(1,0): Lum AC CSS(1,0) @ Offset 0x0000012E.3
MCU located at pixel=(16,0)


и еще такой вопрос...может ли отсутствовать коэффициент EOB(и вообще я не очень понимаю зачем он нужен)...
и вообще правильно ли я понимаю....я перед тем как создавать дерево хаффмана прибавила 128 к каждому кодируемому символу для того чтобы не было отрицательных чисел...нулей у меня нет..все числа положительные. у меня расхождение в мыслях- то ли EOB это коэффициент чтобы закодировать нули(которых у меня нет)...то ли это коэффициент что это конец кодируемого блока 8 на 8...или что???
извините что так много вопросов...просто никак не могу с этим разобраться....
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
24.03.2012, 22:41     кодирование хаффмана #4
А попробуйте более короткие коды начинать с нуля, а более длинные - с единицы.
То есть, если из одного и того же узла дерева Хаффмана выходят два поддерева, то поддерево, в которое мы попадаем по 0, должно содержать более короткие коды. Не исключено, что все будет работать корректно.

Добавлено через 18 минут
То, что Вы прибавили 128, ничего не меняет, дерево Хаффмана от этого не изменится. А EOB (End Of Block) - это маркер конца блока, он должен присутствовать и говорит о том, что далее, до конца блока, следует завершающая серия нулей и больше ничего кодировать в этом блоке не надо. Отсутствовать он вроде не должен.

Добавлено через 16 минут
И еще одно наблюдение. Абстрактное, но Вы его можете проследить на кодах из jpegsnoop. Допустим, есть 3 кода длины 2 и дерево кодов большей длины. В этом случае коды длины 2 будут 00, 01, 10. А вот дерево будет "расти" из 11.
То есть, если на одном и том же уровне есть и терминальные вершины (т.е. собственно коды символов), и "корни" деревьев, коды с меньшим бинарным значением отдаются для терминальных вершин, а с большим - для дальнейшего роста деревьев.
То, что я написал в самом начале поста #4 - частный случай этого правила. Так что, если Вы реализуете построение дерева способом, описанным в предыдущем абзаце, Ваши коды должны совпасть с кодами jpegsnoop.
И еще по EOB - думаю, он не должен присутствовать, если последний символ блока - ненулевой. А в остальных случаях он обязателен.
Yandex
Объявления
24.03.2012, 22:41     кодирование хаффмана
Ответ Создать тему
Опции темы

Текущее время: 23:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru