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

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

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

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

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

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

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

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

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

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

Сжатие Хаффмана - C++
Как изменить данный алгоритм, чтобы ограничить длину кода символа заданным числом Nmax? Спасибо! #include "stdafx.h" #include...

Шифрование Хаффмана - C++
Ребята есть код шифрования Хаффмана, он почему-то пропускает букву Н. Помогите пожалуйста разобраться int main(int argc, char *argv) ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
104 / 104 / 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...или что???
извините что так много вопросов...просто никак не могу с этим разобраться....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2012, 22:41     кодирование хаффмана
Еще ссылки по теме:

Сжатие Хаффмана - C++
Есть прога, реализующая сжатие Хаффмана: #include "stdafx.h" #include <iostream> #include <vector> #include <map> #include...

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

Псевдоалгоритм Хаффмана - C++
есть алгоритм n – количество символов исходного алфавита P – массив вероятностей, упорядоченных по убыванию C – матрица...

Дерево Хаффмана - C++
Здравствуйте. Хотел узнать как работает дерево Хаффмана и 4 дня изучал материалы в интернете (статьи, видеоуроки) и т.д.), написал...

кодировка Хаффмана - C++
Дорогие программисты. Вот был написан код "кодировка Хаффмана", и тут мы вводим количество данных и их частоту. Но я не могу то ли...

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


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

Или воспользуйтесь поиском по форуму:
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 - думаю, он не должен присутствовать, если последний символ блока - ненулевой. А в остальных случаях он обязателен.
Yandex
Объявления
24.03.2012, 22:41     кодирование хаффмана
Ответ Создать тему
Опции темы

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