
- •Общие положения алгоритмов сжатия изображений Введение
- •Классы изображений
- •Классы приложений Примеры приложений, использующих алгоритмы компрессии графики
- •Требования приложений к алгоритмам компрессии
- •Критерии сравнения алгоритмов
- •Контрольные вопросы к разделу
- •Алгоритмы архивации без потерь Алгоритм rle Первый вариант алгоритма
- •Второй вариант алгоритма
- •АлгоритмLzw
- •Алгоритм lz
- •Алгоритм lzw
- •Алгоритм Хаффмана Классический алгоритм Хаффмана
- •Алгоритм Хаффмана с фиксированной таблицей ccittGroup 3
- •Lossless jpeg
- •Заключение
- •Контрольные вопросы к разделу
- •Алгоритмы архивации с потерями Проблемы алгоритмов архивации с потерями
- •АлгоритмJpeg
- •Как работает алгоритм
- •Конвейер операций, используемый в алгоритме jpeg.
- •Фрактальный алгоритм Идея метода
- •Папоротник Барнсли. Задается 4 преобразованиями.
- •Построение алгоритма
- •Оценка потерь и способы их регулирования
- •Рекурсивный (волновой) алгоритм
- •Заключение
- •Контрольные вопросы к разделу
- •Различия между форматом и алгоритмом
- •Указатель терминов
- •Литература Литература по алгоритмам сжатия
- •Литература по форматам изображений
- •Приложение. Таблицы сравнения алгоритмов Архивация двуцветного изображения
- •Архивация16-цветного изображения
- •Архивация изображения в градациях серого
- •Архивация полноцветного изображения
Алгоритм Хаффмана с фиксированной таблицей ccittGroup 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>, или, согласно таблице, 001101011001100101001011010000100(разные коды в потоке выделены для удобства). Этот код обладает свойством префиксных кодов и легко может быть свернут обратно в последовательность длин серий. Легко подсчитать, что для приведенной строки в 569 бит мы получили код, длиной в 33 бита, т.е. коэффициент сжатия составляет примерно 17 раз.
Вопрос к экзамену:Во сколько раз увеличится размер файла в худшем случае? Почему? (Приведенный в характеристиках алгоритма ответ не является полным, поскольку возможны большие значения худшего коэффициента сжатия. Найдите их.)
Изображение, для которого очень выгодно применение алгоритма 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). Подсчитать коэффициент компрессии этой строки алгоритмомCCITTGroup 3.
Приведенные ниже таблицы построены с помощью классического алгоритма Хаффмана (отдельно для черных и белых длин серий). Значения вероятностей появления конкретных длин серий были получены путем анализа большого количества факсимильных изображений.
Таблица кодов завершения:
Длина серии |
Код белой подстроки |
Код черной подстроки |
|
Длина серии |
Код белой подстроки |
Код черной подстроки |
0 |
00110101 |
0000110111 |
|
32 |
00011011 |
000001101010 |
1 |
00111 |
010 |
|
33 |
00010010 |
000001101011 |
2 |
0111 |
11 |
|
34 |
00010011 |
000011010010 |
3 |
1000 |
10 |
|
35 |
00010100 |
000011010011 |
4 |
1011 |
011 |
|
36 |
00010101 |
000011010100 |
5 |
1100 |
0011 |
|
37 |
00010110 |
000011010101 |
6 |
1110 |
0010 |
|
38 |
00010111 |
000011010110 |
7 |
1111 |
00011 |
|
39 |
00101000 |
000011010111 |
8 |
10011 |
000101 |
|
40 |
00101001 |
000001101100 |
9 |
10100 |
000100 |
|
41 |
00101010 |
000001101101 |
10 |
00111 |
0000100 |
|
42 |
00101011 |
000011011010 |
11 |
01000 |
0000101 |
|
43 |
00101100 |
000011011011 |
12 |
001000 |
0000111 |
|
44 |
00101101 |
000001010100 |
13 |
000011 |
00000100 |
|
45 |
00000100 |
000001010101 |
14 |
110100 |
00000111 |
|
46 |
00000101 |
000001010110 |
15 |
110101 |
000011000 |
|
47 |
00001010 |
000001010111 |
16 |
101010 |
0000010111 |
|
48 |
00001011 |
000001100100 |
17 |
101011 |
0000011000 |
|
49 |
01010010 |
000001100101 |
18 |
0100111 |
0000001000 |
|
50 |
01010011 |
000001010010 |
19 |
0001100 |
00001100111 |
|
51 |
01010100 |
000001010011 |
20 |
0001000 |
00001101000 |
|
52 |
01010101 |
000000100100 |
21 |
0010111 |
00001101100 |
|
53 |
00100100 |
000000110111 |
22 |
0000011 |
00000110111 |
|
54 |
00100101 |
000000111000 |
23 |
0000100 |
00000101000 |
|
55 |
01011000 |
000000100111 |
24 |
0101000 |
00000010111 |
|
56 |
01011001 |
000000101000 |
25 |
0101011 |
00000011000 |
|
57 |
01011010 |
000001011000 |
26 |
0010011 |
000011001010 |
|
58 |
01011011 |
000001011001 |
27 |
0100100 |
000011001011 |
|
59 |
01001010 |
000000101011 |
28 |
0011000 |
000011001100 |
|
60 |
01001011 |
000000101100 |
29 |
00000010 |
000011001101 |
|
61 |
00110010 |
000001011010 |
30 |
00000011 |
000001101000 |
|
62 |
00110011 |
000001100110 |
31 |
00011010 |
000001101001 |
|
63 |
00110100 |
000001100111 |
Таблица составных кодов:
Длина серии |
Код белой подстроки |
Код черной подстроки |
|
Длина серии |
Код белой подстроки |
Код черной подстроки |
64 |
11011 |
0000001111 |
|
1344 |
011011010 |
0000001010011 |
128 |
10010 |
000011001000 |
|
1408 |
011011011 |
0000001010100 |
192 |
01011 |
000011001001 |
|
1472 |
010011000 |
0000001010101 |
256 |
0110111 |
000001011011 |
|
1536 |
010011001 |
0000001011010 |
320 |
00110110 |
000000110011 |
|
1600 |
010011010 |
0000001011011 |
384 |
00110111 |
000000110100 |
|
1664 |
011000 |
0000001100100 |
448 |
01100100 |
000000110101 |
|
1728 |
010011011 |
0000001100101 |
512 |
01100101 |
0000001101100 |
|
1792 |
00000001000 |
совп. с белой |
576 |
01101000 |
0000001101101 |
|
1856 |
00000001100 |
— // — |
640 |
01100111 |
0000001001010 |
|
1920 |
00000001101 |
— // — |
704 |
011001100 |
0000001001011 |
|
1984 |
000000010010 |
— // — |
768 |
011001101 |
0000001001100 |
|
2048 |
000000010011 |
— // — |
832 |
011010010 |
0000001001101 |
|
2112 |
000000010100 |
— // — |
896 |
011010011 |
0000001110010 |
|
2176 |
000000010101 |
— // — |
960 |
011010100 |
0000001110011 |
|
2240 |
000000010110 |
— // — |
1024 |
011010101 |
0000001110100 |
|
2304 |
000000010111 |
— // — |
1088 |
011010110 |
0000001110101 |
|
2368 |
000000011100 |
— // — |
1152 |
011010111 |
0000001110110 |
|
2432 |
000000011101 |
— // — |
1216 |
011011000 |
0000001110111 |
|
2496 |
000000011110 |
— // — |
1280 |
011011001 |
0000001010010 |
|
2560 |
000000011111 |
— // — |
Если в одном столбце встретятся два числа с одинаковым префиксом, то это опечатка.
Этот алгоритм реализован в формате TIFF.
Характеристики алгоритма CCITT Group 3
Коэффициенты компрессии:лучший коэффициент стремится в пределе к 213.(3), средний 2, в худшем случае увеличивает файл в 5 раз.
Класс изображений:Двуцветные черно-белые изображения, в которых преобладают большие пространства, заполненные белым цветом.
Симметричность:Близка к 1.
Характерные особенности:Данный алгоритм чрезвычайно прост в реализации, быстр и может быть легко реализован аппаратно.
JBIG
Алгоритм разработан группой экспертов ISO (Joint Bi-level Experts Group) специально для сжатия однобитных черно-белых изображений [5]. Например, факсов или отсканированных документов. В принципе может применяться и к 2-х, и к 4-х битовым картинкам. При этом алгоритм разбивает их на отдельные битовые плоскости. JBIG позволяет управлять такими параметрами, как порядок разбиения изображения на битовые плоскости, ширина полос в изображении, уровни масштабирования. Последняя возможность позволяет легко ориентироваться в базе больших по размерам изображений, просматривая сначала их уменьшенные копии. Настраивая эти параметры, можно использовать описанный выше эффект “огрубленного изображения” при получении изображения по сети или по любому другому каналу, пропускная способность которого мала по сравнению с возможностями процессора. Распаковываться изображение на экране будет постепенно, как бы медленно “проявляясь”. При этом человек начинает анализировать картинку задолго до конца процесса разархивации.
Алгоритм построен на базе Q-кодировщика [6], патентом на который владеет IBM. Q-кодер так же, как и алгоритм Хаффмана, использует для чаще появляющихся символов короткие цепочки, а для реже появляющихся — длинные. Однако, в отличие от него, в алгоритме используются и последовательности символов.