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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
rozochka90
0 / 0 / 0
Регистрация: 14.09.2011
Сообщений: 20
#1

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

14.03.2012, 17:28. Просмотров 2486. Ответов 3
Метки нет (Все метки)

здравствуйте! я пишу программу сжатия jpeg. написала код для кодирования хаффмана по дереву. и столкнулась с такой проблемой записываю в файл jpeg в маркер ffc4 количество длин кодов и кодируемые символы...(весь файл сохранила как написано в стандарте). и когда начинаю декодировать с помощью программы jpegsnoop она мне выдает коды не те что у меня получились в моей программе...у меня подозрения что она кодирует хаффмана по длине кодов...может ли такое быть и как исправить эту ошибку или я что-то не так делаю....
помогите пожалуйста, никак не могу найти выход из этой проблемы...заранее спасибо!...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2012, 17:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос кодирование хаффмана (C++):

Кодирование Хаффмана - C++
Добрый вечер. Я за эту неделю малость зафлудил форум наверно. Прошу прощения за это. Просто уже не знаю, куда ещё обратиться со всем...

Кодирование Хаффмана - C++
Есть дерево Хаффана, с помощью функции, приведенной ниже прохожусь по дереву и "выписываю" 0 и 1, получившиеся коды символов записываю в...

Кодирование алгоритмом Хаффмана - C++
Проблема - такая : Есть рабочая программа, которая кодирует текстовый файл алгоритмом хаффмана. Кодирует она двоичным кодом. Присвоение...

Кодирование алгоритма Хаффмана - C++
Доброго времени суток. У меня есть на руках рабочий код. Вопрос стоит следующим образом: Нужно сделать шифрование не используя векторы или...

Кодирование текста методом Хаффмана - C++
Вроде бы всё правильно , НО : 1)вылезает "ё" в самом начале , хотя сортируется map по умолчанию по алфавиту и "ё" должно быть в конце.. ...

Кодирование Хаффмана (bmp в свой формат) - C++
Дообры день! Подскажите как реализовать следующее: Есть программа кодирования/декодирования хаффмана. Работает так: с текстового файла...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
15.03.2012, 10:01 #2
А напишите Ваши коды и те, что jpegsnoop выдает
0
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...или что???
извините что так много вопросов...просто никак не могу с этим разобраться....
0
soft.creator
104 / 104 / 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 - думаю, он не должен присутствовать, если последний символ блока - ненулевой. А в остальных случаях он обязателен.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2012, 22:41
Привет! Вот еще темы с ответами:

Алгоритм Хаффмана - C++
Возможно и наболевшая тема на форуме, но всё же есть реализация алгоритма Хаффмана. Допустим, у меня в файле есть следующая строка: ...

Метод Хаффмана - C++
Есть метод Хаффмана, но при выполнение в кодировании где-то добавляються переносы строк и из-за этого происходит неправильная кодировка. ...

Алгоритм Хаффмана - C++
Решил разобраться с этим алгоритмом, собственно он состоит из нескольких из таких шагов: 1) Создать массив со всеми символами. 2)...

Архиватор Хаффмана c++ - C++
Пишу архиватор на c++ методом Хаффмана. Не могу найти как считывать байты из файла в c++.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.03.2012, 22:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru