Московский государственный университет имени М.В.Ломоносова
Опубликован: 10.10.2007 | Доступ: свободный | Студентов: 1478 / 158 | Оценка: 4.36 / 4.18 | Длительность: 14:22:00
Специальности: Программист
Лекция 5:

Алгоритмы архивации без потерь

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Алгоритм Хаффмана

Алгоритм Хаффмана с фиксированной таблицей CCITT GROUP 3

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

Близкая модификация алгоритма используется при сжатии черно-белых изображений (один бит на пиксел). Полное название данного алгоритма CCITT Group 3. Это означает, что данный алгоритм был предложен третьей группой по стандартизации Международного Консультационного Комитета по Телеграфии и Телефонии (Consultative Committee International Telegraph and Telephone). Последовательности подряд идущих черных и белых точек в нем заменяются числом, равным их количеству. А этот ряд, уже в свою очередь, сжимается по Хаффману с фиксированной таблицей.

Определение: Набор идущих подряд точек изображения одного цвета называется серией. Длина этого набора точек называется длиной серии.

В таблице, приведенной ниже, заданы два вида кодов:

  • Коды завершения серий - заданы с 0 до 63 с шагом 1.
  • Составные (дополнительные) коды - заданы с 64 до 2560 с шагом 64.

Каждая строка изображения сжимается независимо. Мы считаем, что в нашем изображении существенно преобладает белый цвет, и все строки изображения начинаются с белой точки. Если строка начинается с черной точки, то мы считаем, что строка начинается белой серией с длиной 0. Например, последовательность длин серий 0, 3, 556, 10, ... означает, что в этой строке изображения идут сначала 3 черных точки, затем 556 белых, затем 10 черных и т.д.

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

Алгоритм компрессии выглядит так:

for(по всем строкам изображения) {
    Преобразуем строку в набор длин серий;
    for(по всем сериям) {
      if(серия белая) {
        L= длина серии;
        while(L > 2623) { // 2623=2560+63
          L=L-2560;
          ЗаписатьБелыйКодДля(2560);
        }
      if(L > 63) {
        L2=МаксимальныйСостКодМеньшеL(L);
        L=L-L2;
        ЗаписатьБелыйКодДля(L2);
      }
      ЗаписатьБелыйКодДля(L); 
              //Это всегда код завершения
    }
    else {
      [Код аналогичный белой серии, 
       с той разницей, что записываются 
      черные коды]
    }
  } 
  // Окончание строки изображения
}

Поскольку черные и белые серии чередуются, то реально код для белой и код для черной серии будут работать попеременно.

В терминах регулярных выражений мы получим для каждой строки нашего изображения (достаточно длинной, начинающейся с белой точки) выходной битовый поток вида:

((<Б-2560>)*[<Б-сст.>]<Б-зв.>(<Ч-2560>)*[<Ч-сст.>]<Ч-зв.>)+

[(<Б-2560>)*[<Б-сст.>]<Б-зв.>]

Где ()* - повтор 0 или более раз, ()+.- повтор 1 или более раз, [] - включение 1 или 0 раз.

Для приведенного ранее примера: 0, 3, 556, 10... алгоритм сформирует следующий код: <Б-0><Ч-3><Б-512><Б-44><Ч-10>, или, согласно таблице, 00110101 10 0110010100101101 0000100 (разные коды в потоке выделены для удобства). Этот код обладает свойством префиксных кодов и легко может быть свернут обратно в последовательность длин серий. Легко подсчитать, что для приведенной строки в 569 бит мы получили код длиной в 33 бита, т.е. степень сжатия составляет примерно 17 раз.

Упражнение: Во сколько раз увеличится размер файла в худшем случае? Почему? (Приведенный в характеристиках алгоритма ответ не является полным, поскольку возможны большие значения худшей степени сжатия. Найдите их.)
Изображение, для которого очень выгодно применение алгоритма CCITT-3. (Большие области заполнены одним цветом) - слева. Изображение, для которого менее выгодно применение алгоритма CCITT-3. (Меньше областей, заполненных одним цветом. Много коротких "черных" и "белых" серий) - справа.

Рис. 5.6. Изображение, для которого очень выгодно применение алгоритма CCITT-3. (Большие области заполнены одним цветом) - слева. Изображение, для которого менее выгодно применение алгоритма CCITT-3. (Меньше областей, заполненных одним цветом. Много коротких "черных" и "белых" серий) - справа.

Заметим, что единственное "сложное" выражение в нашем алгоритме: L2=МаксимальныйДопКодМеньшеL(L) - на практике работает очень просто: L2=(L>>6)*64, где >> - побитовый сдвиг L влево на 6 битов (можно сделать то же самое за одну побитовую операцию & - логическое И).

Упражнение: Дана строка изображения, записанная в виде длин серий - 442, 2, 56, 3, 23, 3, 104, 1, 94, 1, 231, размером 120 байт ((442+2+..+231)/8). Подсчитать степень сжатия этой строки алгоритмом CCITT Group 3.

Приведенные ниже таблицы построены с помощью классического алгоритма Хаффмана (отдельно для длин черных и белых серий). Значения вероятностей появления для конкретных длин серий были получены путем анализа большого количества факсимильных изображений.

Таблица кодов завершения (табл. 5.1)

Таблица 5.1.
Длина серии Код белой подстроки Код черной подстроки
0 00110101 0000110111
1 00111 010
2 0111 11
3 1000 10
4 1011 011
5 1100 0011
6 1110 0010
7 1111 00011
8 10011 000101
9 10100 000100
10 00111 0000100
11 01000 0000101
12 001000 0000111
13 000011 00000100
14 110100 00000111
15 110101 000011000
16 101010 0000010111
17 101011 0000011000
18 0100111 0000001000
19 0001100 00001100111
20 0001000 00001101000
21 0010111 00001101100
22 0000011 00000110111
23 0000100 00000101000
24 0101000 00000010111
25 0101011 00000011000
26 0010011 000011001010
27 0100100 000011001011
28 0011000 000011001100
29 00000010 000011001101
30 00000011 000001101000
31 00011010 000001101001
32 00011011 000001101010
33 00010010 000001101011
34 00010011 000011010010
35 00010100 000011010011
36 00010101 000011010100
37 00010110 000011010101
38 00010111 000011010110
39 00101000 000011010111
40 00101001 000001101100
41 00101010 000001101101
42 00101011 000011011010
43 00101100 000011011011
44 00101101 000001010100
45 00000100 000001010101
46 00000101 000001010110
47 00001010 000001010111
48 00001011 000001100100
49 01010010 000001100101
50 01010011 000001010010
51 01010100 000001010011
52 01010101 000000100100
53 00100100 000000110111
54 00100101 000000111000
55 01011000 000000100111
56 01011001 000000101000
57 01011010 000001011000
58 01011011 000001011001
59 01001010 000000101011
60 01001011 000000101100
61 00110010 000001011010
62 00110011 000001100110
63 00110100 000001100111
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >