Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сжатие данных, звука и изображений

.pdf
Скачиваний:
1692
Добавлен:
01.05.2014
Размер:
7.92 Mб
Скачать

Глава 1. Статистические методы

ным образом, однако, по мере сжатия и сбора статистики, кодер улучшает используемый префиксный код, что приводит к улучше­ нию компрессии. Алгоритм должен быть разработан таким обра­ зом, чтобы декодер мог повторить каждый шаг кодера, собрать ту же статистику и улучшить префиксный код в точности тем же спо­ собом. Пример адаптивного сжатия рассмотрен в § 1.5.

1.4. Кодирование Хаффмана

Кодирование Хаффмана является простым алгоритмом для построе­ ния кодов переменной длины, имеюп];их минимальную среднюю дли­ ну. Этот весьма популярный алгоритм служит основой многих ком­ пьютерных программ сжатия текстовой и графической информа­ ции. Некоторые из них используют непосредственно алгоритм Хаф­ фмана, а другие берут его в качестве одной из ступеней многоуров­ невого процесса сжатия. Метод Хаффмана [Huffman 52] произво­ дит идеальное сжатие (то есть, сжимает данные до их энтропии), если вероятности символов точно равны отрицательным степеням числа 2. Алгоритм начинает строить кодовое дерево снизу вверх, затем скользит вниз по дереву, чтобы построить каждый индиви­ дуальный код справа налево (от самого младшего бита к самому старшему). Начиная с работ Д.Хаффмана 1952 года, этот алгоритм являлся предметом многих исследований. (Последнее утверждение из § 3.8.1 показывает, что наилучший код переменной длины можно иногда получить без этого алгоритма.)

Алгоритм начинается составлением списка символов алфавита в порядке убывания их вероятностей. Затем от корня строится дере­ во, листьями которого служат эти символы. Это делается по шагам, причем на каждом шаге выбираются два символа с наименьшими вероятностями, добавляются наверх частичного дерева, удаляются из списка и заменяются вспомогательным символом, представляю­ щим эти два символа. Вспомогательному символу приписывается вероятность, равная сумме вероятностей, выбранных на этом ша­ ге символов. Когда список сокращается до одного вспомогатель­ ного символа, представляющего весь алфавит, дерево объявляется построенным. Завершается алгоритм спуском по дереву и построе­ нием кодов всех символов.

Jlymie всего проиллюстрировать этот алгоритм на простом примере. Имеется пять символов с вероятностями, заданными на рис. 1.3а.

1.4- Кодирование Хаффмана

Символы объединяются в пары в следующем порядке:

1. а4 объединяется с аз, и оба заменяются комбинированным сим­ волом а45 с вероятностью 0.2; 2. осталось четыре символа, а\ с вероятностью 0.4, а также 02, «з

и 045 с вероятностями по 0.2. Произвольно выбираем «з и «45, объ­ единяем их и заменяем вспомогательным символом аз45 ^^ вероятно­ стью 0.4;

3. теперь имеется три символа ai, 02 и аз45 с вероятностями 0.4, 0.2 и 0.4, соответственно. Выбираем и объединяем символы «2 и аз45 во вспомогательный символ 02345 с вероятностью 0.6; 4. наконец, объединяем два оставшихся символа а\ и а2345 и заме­ няем на а12345 с вероятностью 1.

Дерево построено. Оно изображено на рис. 1.3а, «лежа на боку», с корнем справа и пятью листьями слева. Для назначения кодов мы про­ извольно приписываем бит 1 верхней ветке и бит О нижней ветке дерева для каждой пары. В результате получаем следующие коды: О, 10,

111,

1101 и 1100. Распределение битов по краям - произвольное.

«1

0.4

Л > - 1 . 0

01

0.4

1

0145 <

«2345 I \-I012345

02

0.2

02

0.2

1

 

 

 

 

 

 

023 <1

 

аз

0.2

 

оз

0.2

~о~

 

 

 

0 3 4 5 f ^

04

0.1

1

 

04

0.1

-—i

 

045 ' ,0.2

 

 

045

 

 

05

0.1

- ^

п.

П 1

 

 

 

 

(а)

 

 

(Ь)

 

 

 

Р и с . 1.3. Коды

Хаффмана.

 

 

Средняя длина этого кода равна 0.4 х 1 + 0.2x24-0.2x34-0.1x44- 4-0.1 X 4 = 2.2 бит/символ. Очень важно то, что кодов Хаффмана бывает много. Некоторые шаги алгоритма выбирались произволь­ ным образом, поскольку было больше символов с минимальной ве­ роятностью. На рис. 1.3b показано, как можно объединить символы по-другому и получить иной код Хаффмана (11, 01, 00, 101 и 100). Средняя длина равна 0.4 х 2 + 0.2 х 2 4- 0.2 х 2 + 0.1 х 3 4- 0.1 х 3 = 2.2 бит/символ как и у предыдущего кода.

Глава 1. Статистические методы

 

Пример: Дано 8 символов A,B,C,D,E,F,G

и Я с вероятностя­

ми 1/30, 1/30, 1/30, 2/30, 3/30, 5/30, 5/30 и

12/30. На рис. 1.4а,Ь,с

изображены три дерева кодов Хаффмана высоты 5 и 6 для этого алфавита. Средняя длина этих кодов (в битах на символ) равна

(5 + 5 +

5 + 5-2

+ 3

-3

+ 3 - 5 4 - 3

- 5

+ 12)/30

=

76/30,

(5 4-54-4 +

4 - 2

+

4 - 3

4

- 3 - 5

- | - 3

- 5

+

12)/30

=

76/30,

(6 + 6 +

5 +

4 - 2

+

3

- 3 4

- 3 - 5

+ 3-5 +

12)/30

=

76/30.

Пример: На рис. 1.4d показано другое дерево высоты 4 для восьми символов из предыдущего примера. Следующий анализ пока­ зывает, что соответствующий ему код переменной длины - плохой,

хотя его длина меньше 4.

 

 

(Анализ.) После объединения символов Л , В , C^D^E^F

и G остают­

ся символы ABEF (с вероятностью

10/30), CDG (с вероятностью

8/30) и Я (с вероятностью 12/30).

Символы ABEF

и CDG име­

ют наименьшую вероятность, поэтому их необходимо было слить в один, но вместо этого были объединены символы CDG и Н. Полу­ ченное дерево не является деревом Хаффмана.

 

 

30

 

 

30

 

 

/\

 

 

А

 

 

18 Н

 

 

18 Н

 

5

E F G

 

i

\Y G

/

\

 

/

\

/ \

2

3

 

2

E C D

/ \

/

\

/ \

 

 

А

B C D

А В

 

 

(а)

 

 

 

(Ь)

 

30

 

 

 

 

/ \

 

 

 

 

18 И

 

30

 

/

\

 

 

 

 

 

8

10

 

 

 

3 D

5

F

8

Н

/ \

/ \

 

/

\

2 С

2

E

3 G

/ \

/ \

 

/ \

 

А В

A B C D

 

(с)(d)

Рис. 1.4. Три дерева Хаффмана для восьми символов.

Таким образом, некоторый произвол в построении дерева позво­ ляет получать разные коды Хаффмана с одинаковой средней дли­ ной. Напрашивается вопрос: «Какой код Хаффмана, построенный для данного алфавита, является наилучшим?» Ответ будет простым, хотя и неочевидным: лучшим будет код с наименьшей дисперсией.

Дисперсия показывает насколько сильно отклоняются длины ин­ дивидуальных кодов от их средней величины (это понятие разъяс-

1.4- Кодирование Хаффмаиа

няется Ё любом учебнике по статистике). Дисперсия кода 1.3а равна

0.4(1-2.2)2+0.2(2-2.2)2+0.2(3-2.2)2+0.1(4-2.2)2+0.1(4-2.2)2 = 1.36,

а для кода 1.3b

0.4(2-2.2)2+0.2(2-2.2)2+0.2(2-2.2)2+0.1(3-2.2)2+0.1(3-2.2)2 = 0.16.

Код 1.3b является более предпочтительным (это будет объяснено ниже). Внимательный взгляд на деревья показывает, как выбрать одно, нужное нам. На дереве рис. 1.3а символ «45 сливается с симво­ лом аз, в то время как на рис. 1.3b он сливается с ai. Правило будет такое: когда на дереве имеется более двух узлов с наименьшей веро­ ятностью, следует объединять символы с наибольшей и наименьшей вероятностью; это сокрап];ает общую дисперсию кода.

Если кодер просто записывает сжатый файл на диск, то диспер­ сия кода не имеет значения. Коды Хаффмана с малой дисперсией бо­ лее предпочтительны только в случае, если кодер будет передавать этот сжатый файл по линиям связи. В этом случае, код с большой дисперсией заставляет кодер генерировать биты с переменной ско­ ростью. Обычно данные передаются по каналам связи с постоянной скоростью, поэтому кодер будет использовать буфер. Биты сжато­ го файла помепцаются в буфер по мере их генерации и подаются в канал с постоянной скоростью для передачи. Легко видеть, что код с нулевой дисперсией будет подаваться в буфер с постоянной скоро­ стью, поэтому понадобится короткий буфер, а большая дисперсия кода потребует использование длинного буфера.

Следующее утверждение можно иногда найти в литературе по

сжатию

информации:^лг/wa кода

Хаффмана символа ai с вероят­

ностью

Pi всегда не превосходит

\— log2 Pi] . На самом деле, не

смотря на справедливость этого утверждения во многих примерах, в общем случае оно не верно. Я весьма признателен Гаю Блелоку, который указал мне на это обстоятельство и сообщил пример кода, приведенного в табл. 1.5. Во второй строке этой таблицы стоит сим­

вол с кодом длины 3 бита, в то время как

[— log2 0.3] = [1.737] = 2.

Pi

Код

-log2Pi

r-log2^il

0.01

000

6.644

7

* 0.30

001

1.737

2

0.34

01

1.556

2

0.35

1

1.515

2

Табл. 1.5. Пример кода Хаффмана.

Глава 1. Статистические методы

Длина кода символа a«, конечно, зависит от его вероятности Pj. Однако она также неявно зависит от размера алфавита. В боль­ шом алфавите вероятности символов малы, поэтому коды Хаффмана имеют большую длину. В маленьком алфавите наблюдается обратная картина. Интуитивно это понятно, поскольку ^\ля малого алфавита требуется всего несколько кодов, поэтому все они корот­ ки, а большому алфавиту необходимо много кодов и некоторые из них должны быть длинными.

000 Е .1300

 

0010 Т .0900

 

ООП А .0800

 

0100

О .0800

 

0101

N .0700

 

ОНО R .0650

 

0111 I .0650

 

10000

Н .0600

 

10001 S .0600

 

10010 D .0400

 

10011 L .0350

 

10100

С .0300

 

10101 и .0300

 

10110 М .0300

 

10111 F .0200

 

11000

Р .0200

 

11001 Y .0200

 

НОЮ В .0150

 

11011 W .0150

 

11100 G .0150

 

11101 V .0100

 

111100 J .0050

 

111101 К .0050

 

111110

X .0050

 

1111110 Q .0025

 

1111111 Z .0025

.005

Рис. 1.6. Код Хаффмана для английского алфавита.

На рис. 1.6 показан код Хаффмана для всех 26 букв английского алфавита.

Случай алфавита, в котором символы равновероятны, особенно интересен. На рис. 1.7 приведены коды Хаффмана для алфавита с

L4' Кодирование Хаффмана

5, 6, 7 и 8 равновероятными символами. Если размер алфавита п является степенью 2, то получаются просто коды фиксированной длины. В других случаях коды весьма близки к кодам с фиксиро­ ванной длиной. Это означает, что использование кодов переменной длины не дает никаких преимуществ. В табл. 1.8 приведены коды, их средние длины и дисперсии.

i

 

 

 

1

 

2

 

1

 

2

 

1

3

 

0

1

3

 

0

4

 

 

0

4

 

 

5

 

 

 

5

 

 

1

>

 

 

6

 

 

 

 

 

 

 

2

 

1

 

1

1

 

 

 

 

 

 

3

 

0

 

2

 

1

 

 

 

 

 

4

 

 

1

3

 

0

 

 

 

 

 

 

5

 

 

0

4

 

 

 

 

 

 

 

6

 

1

 

5

 

 

 

 

 

 

 

7

1

0

 

6

1

1

 

 

 

 

8

 

 

 

7

 

0

 

 

 

 

 

 

Рис. 1.7. Коды Хаффмана с равными вероятностями.

Тот факт, что данные с равновероятными символами не сжима­ ются методом Хаффмана может означать, что строки таких симво­ лов являются совершенно случайными. Однако, есть примеры строк, в которых все символы равновероятны, но не являются случайны­ ми, и их можно сжимать. Хорошим примером является последо-

Глава 1. Статистические методы

вательность aia\... «102^2 • • • «г^^з^з •.., в которой каждый символ встречается длинными сериями. Такую строку можно сжать мето­ дом RLE, но не методом Хаффмана. (Буквосочетание RLE означает «run-length encoding», т.е. «кодирование длин серий». Этот простой метод сам по себе мало эффективен, но его можно использовать в алгоритмах сжатия со многими этапами, см. [Salomon, 2000].)

п

р

а\

а2

«3

«4

Об

ае

а?

ag

Ср.длина

Дисперсия

5

0.200

111

110

101

100

О

 

 

 

2.6

0.64

6

0.167

111

110

101

100

01

00

 

 

2.672

0,2227

7

0.143

111

ПО

101

100

011

010

00

 

2.86

0.1226

8

0.125

111

ПО

101

100

011

010

001

000

3

О

Табл. 1»8. Коды Хаффмана для 5-8 символов.

Заметим, что метод Хаффмана не работает в случае двухсимвольного алфавита. В таком алфавите одному символу придется присвоить код О, а другому - 1. Метод Хаффмана не может присво­ ить одному символу код короче одного бита. Если исходные данные (источник) состоят из индивидуальных битов, как в случае двух­ уровневого (монохромного) изображения, то возможно представле­ ние нескольких бит (4 или 8) в виде одного символа нового недво­ ичного алфавита (из 16 или 256 символов). Проблема при таком подходе заключается в том, что исходные битовые данные могли иметь определенные статистические корреляционные свойства, ко­ торые могли быть утеряны при объединении битов в символы. При сканировании монохромного рисунка или диаграммы по строкам пикселы будут чаще встречаться длинными последовательностями одного цвета, а не быстрым чередованием черных и белых. В итоге получится файл, начинающийся с 1 или О (с вероятностью 1/2). За нулем с большой вероятностью следует нуль, а за единицей - едини­ ца. На рис. 1.9 изображен конечный автомат, иллюстрирующий эту ситуацию. Если биты объединять в группы, скажем, по 8 разрядов, то биты внутри группы будут коррелированы, но сами группы не бу­ дут иметь корреляцию с исходными пикселами. Если входной файл содержит, например, две соседние группы 00011100 и 00001110, то они будут кодироваться независимо, игнорируя корреляцию послед­ них нулей первой группы и начальных нулей второй. Выбор длин­ ных групп улучшает положение, но увеличивает число возможных групп, что влечет за собой увеличение памяти р^ля хранения табли­ цы кодов и удлиняет время создания этой таблицы. (Напомним, что

1.4- Кодирование Хаффмана 37J

если группа длины s увеличивается до длины 5 + п, то число групп растет экспоненциально с 2* до 2*"^".)

Start ( S

0,50% /

\ 1,50%

0 , 6 7 ^ - ^ 0'40% ^ - ^ 1,60% Рис. 1.9. Конечный автомат.

Более сложный подход к сжатию изображений с помощью ко­ дов Хаффмана основан на создании нескольких полных множеств кодов Хаффмана. Например, если длина группы равна 8 бит, то порождается несколько семейств кодов размера 256. Когда необхо­ димо закодировать символ S^ выбирается одно семейство кодов, и S кодируется из этого семейства.

Давид Хаффман (1925-1999)

Давид начал свою научную карьеру студентом в Массачусетском техноло­ гическом институте (MIT), где построил свои коды в начале пятидесятых годов прошлого века.

Он поступил на факультет MIX в 1953 году. В 1967 году Хаффман перешел в университет Сайта Круз на факультет компьютерных наук. Он играл заметную роль в развитии академической программы факультета и в подборе преподава­ телей, возглавляя его с 1970 по 1973 года. Выйдя на пенсию в 1994 году, Давид Хаффман продолжил свою научную деятельность в качестве заслуженного про­ фессора в отставке, читая курсы по теории информации и по анализу сигналов. Он умер в 1999 году в возрасте 74 лет.

Хаффман сделал важный вклад во многих областях науки, включая теорию информации и теорию кодирования. Он много занимался прикладными задача­ ми, например, проектированием сигналов для радаров, разработкой процедур для асинхронных цепей и другими коммуникационными проблемами. Побочным результатом его работы по математическим свойствам поверхностей «нулевой кривизны» стало развитие им оригинальной техники свертывания из бумаги не­ обычных скульптурных форм [Grafica 96].

Пример: Представим себе изображение из 8-и битовых пиксе­ лов, в котором половина пикселов равна 127, а другая половина име­ ет значение 128. Проанализируем эффективность метода RLE для индивидуальных битовых областей по сравнению с кодированием Хаффмана.

Глава 1. Статистические методы

(Анализ.) Двоичная запись 127 равна 01111111, а 128 - 10000000. Половина пикселов поверхности будет нулем, а вторая половина - единицей. В самом плохом случае область будет походить на шах­ матную доску, то есть, иметь много серий длины 1. В этом случае каждая серия требует кода в 1 бит, что ведет к одному кодовому биту на пиксел на область, или 8 кодовых битов на пиксел для всего изображения. Это приводит к полному отсутствию сжатия. А ко­ ду Хаффмана для такого изображения понадобится всего два кода (поскольку имеется всего два разных пиксела), и они могут быть длины 1. Это приводит к одному кодовому биту на пиксел, то есть к восьмикратному сжатию.

1,4'1» Декодирование Хаффмана

Перед тем как начать сжатие потока данных, компрессор (кодер) должен построить коды. Это делается с помощью вероятностей (или частот появления) символов. Вероятности и частоты следует запи­ сать в сжатый файл для того, чтобы декомпрессор (декодер) Хаф­ фмана мог сделать декомпрессию данных (см. различные подходы ⧧1.3и1.5). Это легко сделать, так как частоты являются целыми числами, а вероятности также представимы целыми числами. Обыч­ но это приводит к добавлению нескольких сотен байтов в сжатый файл. Можно, конечно, записать в сжатый файл сами коды, однако это вносит дополнительные трудности, поскольку коды имеют раз­ ные длины. Еще можно записывать в файл само дерево Хаффмана, но это потребует большего объема, чем простая запись частот.

В любом случае, декодер должен прочесть начало файла и по­ строить дерево Хаффмана для алфавита. Только после этого он мо­ жет читать и декодировать весь файл. Алгоритм декодирования очень прост. Следует начать с корня и прочитать первый бит сжа­ того файла. Если это нуль, следует двигаться по нижней ветке де­ рева; если это единица, то двигаться надо по верхней ветке дерева. Далее читается второй бит и происходит движение по следующей ветке по направлению к листьям. Когда декодер достигнет листа дерева, он узнает код первого несжатого символа (обычно это сим­ вол ASCII). Процедура повторяется д^ля следующего бита, начиная опять из корня дерева.

Описанная процедура проиллюстрирована на рис. 1.10 для алфа­ вита из 5 символов. Входная строка «a4«2«5^i» кодируется последо­ вательностью 1001100111. Декодер начинает с корня, читает первый бит «1» и идет вверх. Второй бит «О» направляет его вниз. То же са­ мое делает третий бит. Это приводит декодер к листу ^4- Получен

1.4- Кодирование Хаффмана 39)

первый несжатый символ. Декодер возвращается в корень и читает ПО, движется вверх, вверх и вниз и получает символ «2, и так далее.

1 —1

2

'

1

 

3

 

0

1

4

 

 

0

 

 

 

Рис. 1.10. Коды Хаффмана с равными вероятностями.

1.4'2. Средняя длина кода

На рис. 1.13а представлено множество из пяти символов с их ве­ роятностями, а также типичное дерево Хаффмана. Символ А воз­ никает в 55% случаев и ему присваивается однобитовый код, что вносит вклад 0.55 х 1 в среднюю длину. Символ Е возникает лишь в 2% случаев. Ему присваивается код длины 4, и его вклад равен 0.02 X 4 = 0.08. Тогда средняя длина кода равна

0.55 X 1 + 0.25 X 2 + 0.15 X 3 + 0.03 х 4 + 0.02 х 4 = 1.7 бит на символ.

Удивительно, но тот же результат получится, если сложить значе­ ния вероятностей четырех внутренних узлов кодового дерева: 0.05 4- +0.2 + 0.45 + 1 = 1.7. Это наблюдение дает простой способ вычисле­ ния средней длины для кодов Хаффмана без использования операции умножения. Надо просто сложить значения внутренних узлов дере­ ва. Табл. 1.11 иллюстрирует, почему этот метод будет работать.

0.05

=

 

 

= 0.02 + 0.03

 

 

0.20=

0.05

+ 0.15

=0.02 +

0.03

+ 0.15

 

0.45

=

0.20

+ 0.25

=

0.02

-Ь 0.03 + 0.15 + 0.25

1.00

=

0.45

+ 0.55

=

0.02

+

0.03

+ 0.15

+ 0.25 + 0.55

Табл. 1.11. Состав узлов.

(В таблице внутренние узлы выделены.) В левом столбце выпи­ саны величины всех внутренних узлов. В правых столбцах показано,