На чем основан алгоритм сжатия rle

На чем основан алгоритм сжатия rle

Первый вариант алгоритма

Данный алгоритм необычайно прост в реализации. Групповое кодирование — от английского Run Length Encoding (RLE) — один из самых старых и самых простых алгоритмов архивации графики. Изображение в нем (как и в нескольких алгоритмах, описанных ниже) вытягивается в цепочку байт по строкам растра. Само сжатие в RLE происходит за счет того, что в исходном изображении встречаются цепочки одинаковых байт. Замена их на пары уменьшает избыточность данных.

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

Initialization(. );
do <
byte = ImageFile.ReadNextByte();
if(является счетчиком(byte)) <
counter = Low6bits(byte)+1;
value = ImageFile.ReadNextByte();
for(i=1 to counter)
DecompressedFile.WriteByte(value)
>
else <
DecompressedFile.WriteByte(byte)
> while(ImageFile.EOF());

В данном алгоритме признаком счетчика (counter) служат единицы в двух верхних битах считанного файла:

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Соответственно оставшиеся 6 бит расходуются на счетчик, который может принимать значения от 1 до 64. Строку из 64 повторяющихся байтов мы превращаем в два байта, т.е. сожмем в 32 раза. Упражнение: Составьте алгоритм компрессии для первого варианта алгоритма RLE. Алгоритм рассчитан на деловую графику — изображения с большими областями повторяющегося цвета. Ситуация, когда файл увеличивается, для этого простого алгоритма не так уж редка. Ее можно легко получить, применяя групповое кодирование к обработанным цветным фотографиям. Для того, чтобы увеличить изображение в два раза, его надо применить к изображению, в котором значения всех пикселов больше двоичного 11000000 и подряд попарно не повторяются. Вопрос к экзамену: Предложите два-три примера “плохих” изображений для алгоритма RLE. Объясните, почему размер сжатого файла больше размера исходного файла. Данный алгоритм реализован в формате PCX. См. пример в приложении.

Второй вариант алгоритма

Второй вариант этого алгоритма имеет больший максимальный коэффициент архивации и меньше увеличивает в размерах исходный файл.

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

Initialization(. );
do <
byte = ImageFile.ReadNextByte();
counter = Low7bits(byte)+1;
if(если признак повтора(byte)) <
value = ImageFile.ReadNextByte();
for (i=1 to counter)
CompressedFile.WriteByte(value)
>
else <
for(i=1 to counter) <
value = ImageFile.ReadNextByte();
CompressedFile.WriteByte(value)
>
CompressedFile.WriteByte(byte)
> while(ImageFile.EOF());

Признаком повтора в данном алгоритме является единица в старшем разряде соответствующего байта:

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Как можно легко подсчитать, в лучшем случае этот алгоритм сжимает файл в 64 раза (а не в 32 раза, как в предыдущем варианте), в худшем увеличивает на 1/128. Средние показатели степени компрессии данного алгоритма находятся на уровне показателей первого варианта. Упражнение: Составьте алгоритм компрессии для второго варианта алгоритма RLE. Похожие схемы компрессии использованы в качестве одного из алгоритмов, поддерживаемых форматом TIFF, а также в формате TGA. Характеристики алгоритма RLE:

Коэффициенты компрессии: Первый вариант: 32, 2, 0,5. Второй вариант: 64, 3, 128/129. (Лучший, средний, худший коэффициенты)

Класс изображений: Ориентирован алгоритм на изображения с небольшим количеством цветов: деловую и научную графику.

Симметричность: Примерно единица.

Характерные особенности: К положительным сторонам алгоритма, пожалуй, можно отнести только то, что он не требует дополнительной памяти при архивации и разархивации, а также быстро работает. Интересная особенность группового кодирования состоит в том, что степень архивации для некоторых изображений может быть существенно повышена всего лишь за счет изменения порядка цветов в палитре изображения.

Алгоритм LZW

Название алгоритм получил по первым буквам фамилий его разработчиков — Lempel, Ziv и Welch. Сжатие в нем, в отличие от RLE, осуществляется уже за счет одинаковых цепочек байт.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

При этом мы получим увеличение размера файла в худшем случае на 32770/32768 (в двух байтах записано, что нужно переписать в выходной поток следующие 2 15 байт), что совсем неплохо. Максимальный коэффициент сжатия составит в пределе 8192 раза. В пределе, поскольку максимальное сжатие мы получаем, превращая 32Кб буфера в 4 байта, а буфер такого размера мы накопим не сразу. Однако, минимальная подстрока, для которой нам выгодно проводить сжатие, должна состоять в общем случае минимум из 5 байт, что и определяет малую ценность данного алгоритма. К достоинствам LZ можно отнести чрезвычайную простоту алгоритма декомпрессии. Упражнение: Предложите другой вариант алгоритма LZ, в котором на пару будет выделено 3 байта, и подсчитайте основные характеристики своего алгоритма. Алгоритм LZW

Рассматриваемый нами ниже вариант алгоритма будет использовать дерево для представления и хранения цепочек. Очевидно, что это достаточно сильное ограничение на вид цепочек, и далеко не все одинаковые подцепочки в нашем изображении будут использованы при сжатии. Однако в предлагаемом алгоритме выгодно сжимать даже цепочки, состоящие из 2 байт.

Процесс сжатия выглядит достаточно просто. Мы считываем последовательно символы входного потока и проверяем, есть ли в созданной нами таблице строк такая строка. Если строка есть, то мы считываем следующий символ, а если строки нет, то мы заносим в поток код для предыдущей найденной строки, заносим строку в таблицу и начинаем поиск снова.

Функция InitTable() очищает таблицу и помещает в нее все строки единичной длины.

InitTable();
CompressedFile.WriteCode(СlearCode);
CurStr=пустая строка;
while(не ImageFile.EOF()) < //Пока не конец файла
C=ImageFile.ReadNextByte();
if(CurStr+C есть в таблице)
CurStr=CurStr+С;//Приклеить символ к строке
else <
code=CodeForString(CurStr);//code-не байт!
CompressedFile.WriteCode(code);
AddStringToTable (CurStr+С);
CurStr=С; // Строка из одного символа
>
>
code=CodeForString(CurStr);
CompressedFile.WriteCode(code);
CompressedFile.WriteCode(CodeEndOfInformation);

Функция ReadNextByte() читает символ из файла. Функция WriteCode() записывает код (не равный по размеру байту) в выходной файл. Функция AddStringToTable() добавляет новую строку в таблицу, приписывая ей код. Кроме того, в данной функции происходит обработка ситуации переполнения таблицы. В этом случае в поток записывается код предыдущей найденной строки и код очистки, после чего таблица очищается функцией InitTable(). Функция CodeForString() находит строку в таблице и выдает код этой строки.

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

Мы знаем, что для каждого кода надо добавлять в таблицу строку, состоящую из уже присутствующей там строки и символа, с которого начинается следующая строка в потоке.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Алгоритм декомпрессии, осуществляющий эту операцию, выглядит следующим образом:

Здесь функция ReadCode() читает очередной код из декомпрессируемого файла. Функция InitTable() выполняет те же действия, что и при компрессии, т.е. очищает таблицу и заносит в нее все строки из одного символа. Функция FirstChar() выдает нам первый символ строки. Функция StrFromTable() выдает строку из таблицы по коду. Функция AddStringToTable() добавляет новую строку в таблицу (присваивая ей первый свободный код). Функция WriteString() записывает строку в файл.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Замечание 2. При сжатии изображения нам важно обеспечить быстроту поиска строк в таблице. Мы можем воспользоваться тем, что каждая следующая подстрока на один символ длиннее предыдущей, кроме того, предыдущая строка уже была нами найдена в таблице. Следовательно, достаточно создать список ссылок на строки, начинающиеся с данной подстроки, как весь процесс поиска в таблице сведется к поиску в строках, содержащихся в списке для предыдущей строки. Понятно, что такая операция может быть проведена очень быстро.

В качестве хэш-функции при этом используется:

Где >> — побитовый сдвиг вправо (key >> 12 — мы получаем значение символа), ^ — логическая операция побитового исключающего ИЛИ, & логическое побитовое И.

Таким образом, за считанное количество сравнений мы получаем искомый код или сообщение, что такого кода в таблице нет.

LZW реализован в форматах GIF и TIFF. Характеристики алгоритма LZW:

Коэффициенты компрессии: Примерно 1000, 4, 5/7 (Лучший, средний, худший коэффициенты). Сжатие в 1000 раз достигается только на одноцветных изображениях размером кратным примерно 7 Мб.

Класс изображений: Ориентирован LZW на 8-битные изображения, построенные на компьютере. Сжимает за счет одинаковых подцепочек в потоке.

Симметричность: Почти симметричен, при условии оптимальной реализации операции поиска строки в таблице.

Характерные особенности: Ситуация, когда алгоритм увеличивает изображение, встречается крайне редко. LZW универсален — именно его варианты используются в обычных архиваторах.

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

Классический алгоритм Хаффмана

Один из классических алгоритмов, известных с 60-х годов. Использует только частоту появления одинаковых байт в изображении. Сопоставляет символам входного потока, которые встречаются большее число раз, цепочку бит меньшей длины. И, напротив, встречающимся редко — цепочку большей длины. Для сбора статистики требует двух проходов по изображению.

Для начала введем несколько определений.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Слово В будем назвать кодом сообщения A, а переход от слова A к его коду — кодированием.

Определение. Рассмотрим соответствие между буквами алфавита Y и некоторыми словами алфавита W :

Определение. Пусть слово В имеет вид

Тогда слово B'называется началом или префиксом слова B, а B"концом слова B. При этом пустое слово L и само слово B считаются началами и концами слова B .

Теорема 1. Если схема S обладает свойством префикса, то алфавитное кодирование будет взаимно однозначным.

обладающих свойством взаимной однозначности.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle— длины слов.

Можно показать, что l ср достигает величины своего минимума l * на некоторой S и определена как

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Коды с минимальной избыточностью дают в среднем минимальное увеличение длин слов при соответствующем кодировании.

Алгоритм построения схемы S можно представить следующим образом:

Шаг 1. Упорядочиваем все буквы входного алфавита в порядке убывания вероятности. Считаем все соответствующие слова B i из алфавита W = <0,1>пустыми.

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Производя действия, соответствующие 2-му шагу, мы получаем псевдосимвол с вероятностью 0.26 (и приписываем 0 и 1 соответствующим словам). Повторяя же эти действия для измененного списка, мы получаем псевдосимвол с вероятностью 0.5. И, наконец, на последнем этапе мы получаем суммарную вероятность 1.

Для последовательности из 100 символов, в которой символ a 1 встретится 50 раз, символ a 2 — 24 раза, символ a 3 — 15 раз, а символ a 4 — 11 раз, данный код позволит получить последовательность из 176 бит (На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle). Т.е. в среднем мы потратим 1.76 бита на символ потока.

Доказательства теоремы, а также того, что построенная схема действительно задает код Хаффмана, смотри в [10].

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

На практике используются его разновидности. Так, в некоторых случаях резонно либо использовать постоянную таблицу, либо строить ее “адаптивно”, т.е. в процессе архивации/разархивации. Эти приемы избавляют нас от двух проходов по изображению и необходимости хранения таблицы вместе с файлом. Кодирование с фиксированной таблицей применяется в качестве последнего этапа архивации в JPEG и в рассмотренном ниже алгоритме CCITT Group 3. Характеристики классического алгоритма Хаффмана:

Коэффициенты компрессии: 8, 1,5, 1 (Лучший, средний, худший коэффициенты).

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

Симметричность: 2 (за счет того, что требует двух проходов по массиву сжимаемых данных).

Характерные особенности: Единственный алгоритм, который не увеличивает размера исходных данных в худшем случае (если не считать необходимости хранить таблицу перекодировки вместе с файлом).

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

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

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

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

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

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 <
[Код аналогичный белой серии,
с той разницей, что записываются
черные коды]
>
>
// Окончание строки изображения
>

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

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

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

На чем основан алгоритм сжатия rle. Смотреть фото На чем основан алгоритм сжатия rle. Смотреть картинку На чем основан алгоритм сжатия rle. Картинка про На чем основан алгоритм сжатия rle. Фото На чем основан алгоритм сжатия rle

Изображение, для которого менее выгодно применение алгоритма 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. Приведенные ниже таблицы построены с помощью классического алгоритма Хаффмана (отдельно для длин черных и белых серий). Значения вероятностей появления для конкретных длин серий были получены путем анализа большого количества факсимильных изображений.

Таблица кодов завершения:

Длина
серии
Код белой
подстроки
Код черной
подстроки
Длина
серии
Код белой
подстроки
Код черной
подстроки
00011010100001101113200011011000001101010
1001110103300010010000001101011
20111113400010011000011010010
31000103500010100000011010011
410110113600010101000011010100
5110000113700010110000011010101
6111000103800010111000011010110
71111000113900101000000011010111
8100110001014000101001000001101100
9101000001004100101010000001101101
100011100001004200101011000011011010
110100000001014300101100000011011011
1200100000001114400101101000001010100
13000011000001004500000100000001010101
14110100000001114600000101000001010110
151101010000110004700001010000001010111
1610101000000101114800001011000001100100
1710101100000110004901010010000001100101
18010011100000010005001010011000001010010
190001100000011001115101010100000001010011
200001000000011010005201010101000000100100
210010111000011011005300100100000000110111
220000011000001101115400100101000000111000
230000100000001010005501011000000000100111
240101000000000101115601011001000000101000
250101011000000110005701011010000001011000
2600100110000110010105801011011000001011001
2701001000000110010115901001010000000101011
2800110000000110011006001001011000000101100
29000000100000110011016100110010000001011010
30000000110000011010006200110011000001100110
31000110100000011010016300110100000001100111

Таблица составных кодов:

Длина
серии
Код белой
подстроки
Код черной
подстроки
Длина
серии
Код белой
подстроки
Код черной
подстроки
6411011000000111113440110110100000001010011
1281001000001100100014080110110110000001010100
1920101100001100100114720100110000000001010101
256011011100000101101115360100110010000001011010
3200011011000000011001116000100110100000001011011
3840011011100000011010016640110000000001100100
4480110010000000011010117280100110110000001100101
512011001010000001101100179200000001000совп. с белой
576011010000000001101101185600000001100— // —
640011001110000001001010192000000001101— // —
70401100110000000010010111984000000010010— // —
76801100110100000010011002048000000010011— // —
83201101001000000010011012112000000010100— // —
89601101001100000011100102176000000010101— // —
96001101010000000011100112240000000010110— // —
102401101010100000011101002304000000010111— // —
108801101011000000011101012368000000011100— // —
115201101011100000011101102432000000011101— // —
121601101100000000011101112496000000011110— // —
128001101100100000010100102560000000011111— // —
Если в одном столбце встретятся два числа с одинаковым префиксом, то это опечатка.

Этот алгоритм реализован в формате TIFF. Характеристики алгоритма CCITT Group 3

Коэффициенты компрессии: лучший коэффициент стремится в пределе к 213.(3), средний 2, в худшем случае увеличивает файл в 5 раз.

Класс изображений: Двуцветные черно-белые изображения, в которых преобладают большие пространства, заполненные белым цветом.

Симметричность: Близка к 1.

Характерные особенности: Данный алгоритм чрезвычайно прост в реализации, быстр и может быть легко реализован аппаратно. JBIG

Алгоритм разработан группой экспертов ISO (Joint Bi-level Experts Group) специально для сжатия однобитных черно-белых изображений [5]. Например, факсов или отсканированных документов. В принципе, может применяться и к 2-х, и к 4-х битовым картинкам. При этом алгоритм разбивает их на отдельные битовые плоскости. JBIG позволяет управлять такими параметрами, как порядок разбиения изображения на битовые плоскости, ширина полос в изображении, уровни масштабирования. Последняя возможность позволяет легко ориентироваться в базе больших по размерам изображений, просматривая сначала их уменьшенные копии. Настраивая эти параметры, можно использовать описанный выше эффект “огрубленного изображения” при получении изображения по сети или по любому другому каналу, пропускная способность которого мала по сравнению с возможностями процессора. Распаковываться изображение на экране будет постепенно, как бы медленно “проявляясь”. При этом человек начинает анализировать картинку задолго до конца процесса разархивации.

Алгоритм построен на базе Q-кодировщика [6], патентом на который владеет IBM. Q-кодер, так же как и алгоритм Хаффмана, использует для чаще появляющихся символов короткие цепочки, а для реже появляющихся — длинные. Однако, в отличие от него, в алгоритме используются и последовательности символов.

Этот алгоритм разработан группой экспертов в области фотографии (Joint Photographic Expert Group). В отличие от JBIG, Lossless JPEG ориентирован на полноцветные 24-битные или 8-битные в градациях серого изображения без палитры. Он представляет собой специальную реализацию JPEG без потерь. Коэффициенты сжатия: 20, 2, 1. Lossless JPEG рекомендуется применять в тех приложениях, где необходимо побитовое соответствие исходного и декомпрессированного изображений. Подробнее об алгоритме сжатия JPEG см. следующий раздел.

Попробуем на этом этапе сделать некоторые обобщения. С одной стороны, приведенные выше алгоритмы достаточно универсальны и покрывают все типы изображений, с другой — у них, по сегодняшним меркам, слишком маленький коэффициент архивации. Используя один из алгоритмов сжатия без потерь, можно обеспечить архивацию изображения примерно в два раза. В то же время алгоритмы сжатия с потерями оперируют с коэффициентами 10-200 раз. Помимо возможности модификации изображения, одна из основных причин подобной разницы заключается в том, что традиционные алгоритмы ориентированы на работу с цепочкой. Они не учитывают, так называемую, “когерентность областей” в изображениях. Идея когерентности областей заключается в малом изменении цвета и структуры на небольшом участке изображения. Все алгоритмы, о которых речь пойдет ниже, были созданы позднее специально для сжатия графики и используют эту идею.

Справедливости ради следует отметить, что и в классических алгоритмах можно использовать идею когерентности. Существуют алгоритмы обхода изображения по “фрактальной” кривой, при работе которых оно также вытягивается в цепочку; но за счет того, что кривая обегает области изображения по сложной траектории, участки близких цветов в получающейся цепочке удлиняются.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *