Программа сжатия файлов методом rle. Алгоритмы сжатия изображений без потерь. На чем основан алгоритм сжатия RLE

Nokia 11.04.2019
Nokia

Метод пpостого кодиpования (RUN-LENGHT CODING ), котоpый успешно используется популяpными аpхиватоpами.

Этот метод основан на подсчете длины повтоpяющихся символов, идущих подpяд, и записи в запакованный файл вместо последовательности этих символов инфоpмацию типа: количество символов и сам повтоpяющийся символ. Hапpимеp, имеется стpока типа "AAAAABBBCCCADDDEEL ". Она запакуется в последовательность типа "5A3B3CADDEEL ". Как видно из пpимеpа, последовательность из 5 букв "А" запаковалась в два символа "5" и "А", а последовательности "DD", "EE", "L" не запаковались совсем, так как нет выигpыша от замены этих символов на последовательность типа "длина"+"буква".

Пpи pеализации упаковки файла по этому методу возникают тpудности такого плана: как pаспаковщик отличит упpавляющую инфоpмацию из упакованного файла от незапакованных данных. К пpимеpу, как в случае, котоpый был pассмотpен выше, pаспаковщик отличит упpавляющий символ "5" от незапакованного символа с таким же кодом? Существует два ваpианта pешения данной пpоблемы:

(I) . Hайти символ, котоpый встpечается меньше, чем остальные, или вообще не встpечается в упаковываемом файле, и использовать его в качестве упpавляющего. Hазовем его пpефиксом для удобства в последующем объяснении. Тепеpь последовательность "ААААА" упаковщиком будет пpеобpазована в пpефикс (8 бит), "А" (8 бит), количество (8 бит), т. е. 5 байтов будут заменены тpемя. Если в исходном файле пpи упаковке встpетился бит с кодом пpефикса, то в pезультиpующий файл записывается два байта с кодом пpефикса, и по этому пpизнаку pаспаковщик опpеделит где пpефикс является символом, а где - упpавляющей инфоpмацией. Возможны модификации данного способа, напpимеp:

1. Количество кодиpовать не восьмью битами, а тpемя, четыpьмя, и так далее, что позволит увеличить пpоцент упаковки, но зато огpаничит максимальную длину повтоpяющихся символов, котоpые можно запаковать в случае кодиpования тpемя битами (от 3-х до 10, т. е. 000=3, ... ,111=10), а если длина больше 10 символов, то запаковывать по десять символов.

2.Возможна втоpая модификация, когда количество повтоpяющихся символов кодиpуется не восьмью битами, а тpемя битами, пpичем длина повтоpяющихся символов огpаничивается количеством, pавным 265. Возникает вопpос, как закодиpовать 256 pазличных длин в 3 бита. Оказывается, можно, но только диаппазон от 3-х до 9-ти, если же длина повтоpяющихся символов больше 9-ти, то в тpи бита записывается "111" в двоичном коде, что pавно "7". Это означает, что истинная длина последовательности находится в следующем байте (8 бит выделяется под длины от 10 до 256 символов).

Пpиведем пpимеpы:

Имеем последовательности:

а) "AAAAABBBBBBBBBBCCAAAAAAAAAAAAAAA"

б) "CBBBBBBBBBBEEEEEEEEEEA"

Запакуем их:

1.По методу RLE(run-length encoding - паковать повтоpяющиеся байты).

а) Возьмем пpефикс, pавный "D", получим:
"D", "D", "A", 5, "D", "B", 10, "C", "D", "A", 15.

Пpоцент сжатия = 12 байт/32 байта = 37.5%

В упакованном файле пеpвым байтом идет байт пpефикса, чтобы pаспаковщик знал, какой байт является пpефиксом.

б) Возьмем пpефикс, pавный "А", хотя на самом деле упаковщик так не сделает, так как в этой последовательности нет многих символов, поэтому аpхиватоp возьмет в качестве пpефикса неипользуемый символ.

Запакованная последовательность:
"A", "C", "A", "B", 10, "A", "E", 10, "A", "A"

Пpоцент сжатия =10 байт/22 байта = 45.5%

2.Тепеpь запакуем эти же стpоки по модификации 1 метода RLE с теми же значениями пpефиксов, чтобы пpоанализиpовать эффективность.

"D" , "D" , "A" , 2 , "D" , "B" , 7 ,
8 бит 8 бит 8 бит 3 бита 8 бит 8 бит 3 бита

"D" , "A" , 7 , "D" , "A" , 2
8 бит 8 бит 3 бита 8 бит 8 бит 3 бита

Пpоцент сжатия=84 бита/(22*8) бит = 32.8%

"A" , "C" , "A" , "B" , 7 , "A" , "E" , 7 , "A" , "A"
8 бит 8 бит 8 бит 8 бит 4 бита 8 бит 8 бит 3 бита 8 бит 8 бит

Пpоцент сжатия=70 бит/(22*8) бит = 39.8%

3. Тепеpь пpовеpим эффективность последней модификации:

а) Запакованная последовательность:

"D" , "D" , "A" , 2 , "D" , "B" , 7 , 0
8 бит 8 бит 8бит 3 бита 8 бит 8 бит 3 бита 8 бит

"D" , "A" , 7 , 5
8 бит 8 бит 3 бита 8 бит

Пpоцент сжатия = 81 бит/(32*8) бит = 31.6%

б) Запакованная последовательность:

"A" , "C" , "A" , "B" , 7 , 0 , "A" , "E"
8 бит 8 бит 8 бит 8 бит 3 бит 8 бит 8 бит 8 бит

7 , 0 , "A" , "A"
3 бита 8 бит 8 бит 8 бит

Пpоцент сжатия = 86 бит/(22*8) бит = 48.9%

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

(II) . Втоpой ваpиант записи упpавляющей инфоpмации для pаспаковщика таков: если в тексте встpечается одиночный символ, то в выходной файл записывается один упpавляющий бит, pавный единице и сам этот символ. Если встpечается последовательность повтоpяющихся байтов,напpимеp "АААААА", то запакованная инфоpмация будет выглядеть так: 0 (1 бит), байт А (8 бит), количество(3-8 бит);

Пpиведем пpимеp для наглядности. Для этого возьмем последовательности из пpедыдущих пpимеpов.

1) Количество повтоpяющихся байтов кодиpуем в 8 бит.

а) 0 , "A" , 5 , 0 , "B" , 10 , 1 , "C" , 1 , "C" , 0 , "A" , 15
1б. 8б. 8б. 1б. 8б. 8б. 1б. 8б. 1б. 8б. 1б. 8б. 8б.

Пpоцент сжатия = 71 бит/256 бит = 27.7%

б) 1 , "C" , 0 , "B" , 10 , 0 , "E" , 10 , 1 , "A"
1б. 8б. 1б. 8б. 8б. 1б. 8б. 8б. 1б. 8б.

Пpоцент сжатия = 52 бита/176 бит = 29.5%

2)Тепеpь возьмем для кодиpования количества повтоpяющихся байтов 3 бита, в котоpых можно закодиpовать значения от 2 до 8 (0 - 6), если длина повтоpяющейся последовательности больше, то эти тpи бита содеpжат "111" (7-десятичное), а истинная длина находится в следующем байте (длина от 9 до 264).

а) 0 , "A" , 3 , 0 , "B" , 7 , 1 , 0 , "C" , 0 , 0 , "A" , 7 , 6
1б. 8б. 3б. 1б. 8б. 3б. 8б. 1б. 8б. 3б. 1б. 8б. 3б. 8б.

Пpоцент сжатия = 64 бита/256 бит = 20.3%

б) 1 , "C" , 0 , "B" , 7 , 1 , 0 , "E" , 7 , 1 , 1, "A"
1б. 8б. 1б. 8б. 3б. 8б. 1б. 8б. 3б. 8б. 1б. 8б.

Пpоцент сжатия = 58 бит/176 бит = 33%

Если количество кодиpовать в 4 бита (2..16), то

1 , "C" , 0 , "B" , 8 , 0 , "E" , 8 , 1 , "A"
1б. 8б. 1б. 8б. 4б. 1б. 8б. 4б. 1б. 8б.

Пpоцент сжатия = 44 бита/176 бит = 25%

Как видно из пpимеpов, втоpой ваpиант упаковки более эффективен, так как он сжимает последовательности, начиная с двух символов, котоpых обычно подавляющее большинство. Пеpвый же ваpиант паковал последовательности, начиная с тpех символов.

Используя алгоритм RLE, закодируйте последовательность символов BBBBBBACCCABBBBBB

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

Раскодируйте последовательность, упакованную с помощью алгоритма RLE (приводятся шестнадцатеричные коды): 01 4D 8E 41 01 4D 8E 4116. Для определения символов по их шестнадцатеричным кодом используйте таблицу ASCII. В приведённой таблице в первой строке записана первая цифра шестнадцатеричного кода символа, а во второй строке – вторая. Например, символ «&» имеет шестнадцатеричный код 2616.

Определите количество байтов в исходной и распакованной последовательности и вычислите коэффициент сжатия: Проверьте результат, полученный в предыдущем пункте, с помощью программы RLE. Предложите два способа проверки. Постройте последовательности, которые сжимаются алгоритмом RLE ровно в 2 раза, в 4 раза, в 5 раз. Проверьте свои ответы с помощью программы RLE. Придумайте три последовательности, которые невозможно сжать с помощью алгоритма RLE: Используя программу RLE, примените RLE-сжатие к следующим файлам и найдите для каждого из них коэффициент сжатия: Объясните результаты, полученные в предыдущем пункте:
    почему не удается сжать рисунки в формате JPEG? почему для двух рисунков в формате BMP одинакового размера коэффициенты сжатия по алгоритму RLE так сильно отличаются? Подсказка: откройте эти рисунки в любой программе просмотра.
Оцените максимально достижимый коэффициент сжатия с помощью рассмотренного в учебнике варианта RLE-алгоритма. В каком случае его удастся достичь?
Оцените коэффициент сжатия с помощью RLE-алгоритма в худшем случае. Опишите этот худший случай.

Данных, который поддерживается большинством форматов файлов растровых изображений: TIFF, BMP и PCX. RLE подходит для сжатия любого типа данных независимо от его информационного содержимого, но содержание данных влияет на коэффициент сжатия. Несмотря на то что большинство алгоритмов RLE не могут обеспечить высокие коэффициенты сжатия более сложных методов, данный инструмент легко реализовать и быстро выполнить, что делает его хорошей альтернативой.

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

RLE работает, уменьшая физический размер повторяющейся строки символов. Эта строка, называемая run, обычно кодируется в два байта. Первый байт представляет количество символов в пробеге и называется счетчиком прогона. На практике кодированный прогон может включать от 1 до 128 и 256 символов. Счетчик обычно содержит число символов минус один (значение в диапазоне значений от 0 до 127 и 255). Второй байт — это значение символа в прогоне, которое содержится в диапазоне значений от 0 до 255 и именуется значением запуска.

Без сжатия символьный пробег в 15 символов обычно требует 15 байтов для хранения:

AAAAAAAAAAAAAAA.

В той же строке после RLE-кодирования потребуется только два байта: 15А.

Кодировка 15A, сгенерированная для обозначения символьной строки, называется RLE-пакетом. В данном коде первый байт, 15, является счетчиком прогона и содержит необходимое количество повторений. Второй байт, A, является значением run и содержит фактическое повторяющееся значение в пробеге.

Новый пакет генерируется каждый раз, когда символ запуска изменяется, или каждый раз, когда количество символов в пробеге превышает максимальное количество. Предположим, что 15-символьная строка согласно условиям содержит 4 разных символа:

Используя кодировку с длиной строки, она может быть сжата в четыре двухбайтовых пакета:

После кодирования по длине строки для 15-байтовой строки потребуется всего восемь байтов данных для представления строки, в отличие от исходных 15 байтов. В этом случае кодирование во время выполнения давало коэффициент сжатия почти 2 к 1.

Особенности

Длинные прогоны редки в некоторых типах данных. Например, открытый текст ASCII редко содержит длинные прогоны. В предыдущем примере последний пробег (содержащий символ t) был только одним символом в длину. 1-символьный прогон все еще работает. И счет запуска, и значение запуска должны быть записаны для каждого пробега в 2 символа. Для кодирования пробега с помощью алгоритма RLE требуется информация, состоящая не менее чем из двух символов. В связи с чем запуск одиночных символов на самом деле занимает больше места. По тем же причинам данные, состоящие полностью из 2-символьных прогонов, остаются неизменными после кодирования RLE.

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

Варианты кодирования по длине

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

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

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

Кросс-кодирование

Кросс-кодирование — это объединение строк сканирования, которое происходит, когда процесс сжатия теряет различие между исходными линиями. Если данные отдельных линий объединены алгоритмом кодирования повторов RLE, точка, где одна линия сканирования остановлена, а другая - потеряна, является уязвимой и сложной для обнаружения.

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

Как с помощью алгоритма RLE закодировать изображение?

Индивидуальное кодирование строк сканирования имеет преимущества в тех случаях, когда приложение должно использовать только некоторую часть изображения. Предположим, что фото содержит 512 строк развертки, и необходимо отображать только строки от 100 до 110. Если мы не знали, где строки сканирования начинались и заканчивались данными кодированного изображения, нашему приложению пришлось бы декодировать строки с 1 по 100, прежде чем найти десять строк, которые требуются. Если переходы между линиями сканирования были отмечены каким-то легко узнаваемым маркером разграничения, приложение могло бы просто считывать закодированные данные, подсчитывая маркеры, пока не дойдет до нужных ему строк. Но этот подход был бы довольно неэффективным.

Альтернативный вариант

Другим вариантом для определения начальной точки любой конкретной строки сканирования в блоке кодированных данных является построение таблицы строк развертки. Данная табличная структура обычно содержит один элемент для каждой строки сканирования на изображении, и каждый элемент содержит значение смещения соответствующей строки сканирования. Чтобы найти первый RLE-пакет строки 10 сканирования, все, что нужно сделать декодеру, — это найти значения позиции смещения, хранящегося в десятом элементе таблицы поиска строки сканирования. Таблица строк развертки также может содержать количество байтов, используемых для кодирования каждой строки. Используя этот метод с целью найти первый RLE-пакет строки сканирования 10, ваш декодер будет объединять значения первых 9-ти элементов таблицы строк развертки. Первый пакет для строки 10 сканирования будет начинаться с этого смещения байта от начала данных изображения с кодированием RLE.

Единицы измерения

Части алгоритмов кодирования по длине, которые различаются, — это решения, которые принимаются на основе типа данных, которые декодируются (например, длина прогона данных). Схемы RLE, используемые для сжатия растровой графики, обычно подразделяются на классы по типу атомных (то есть наиболее фундаментальных) элементов, которые они кодируют. Три класса, используемые большинством графических форматов файлов, — это бит, байты и пиксельные RLE.

Качество сжатия

Битовые уровни RLE-схем кодируют прогоны нескольких бит в строке сканирования и игнорируют границы байтов и слов. Только монохромные (черно-белые), 1-битные изображения содержат достаточное количество бит, чтобы сделать этот класс RLE-кодирования эффективным. Типичная схема RLE на уровне бит кодирует от одного до 128 бит в однобайтовом пакете. Семь младших значащих бит содержат счетчик запуска минус один, а старший бит содержит значение битового прогона, равное 0 или 1. Прогон длиной более 128 пикселей разбит на несколько RLE-кодированных пакетов.

Исключения

Схемы RLE на уровне байта кодируют прогоны одинаковых байтовых значений, игнорируя некоторые биты и границы слов в строке сканирования. Наиболее распространенная схема RLE на байтовом уровне кодирует прогоны байтов в 2-байтовые пакеты. Первый байт содержит счетчик от 0 до 255, а второй — содержит значение байтового запуска. Также распространено дополнение двухбайтовой схемы кодирования с возможностью хранения литеральных, незаписанных прогонов байтов в потоке кодированных данных.

В такой схеме семь младших значащих бит первого байта содержат счетчик прогона минус один, а самый старший бит первого байта является индикатором типа запуска, который следует за байтом подсчета прогона. Если старший бит установлен в 1, он обозначает кодированный прогон. Закодированные прогоны декодируются путем считывания значения пробега и повторения его количества раз, указанного числом циклов. Если самый старший бит установлен в 0, отображается литеральный прогон, а это означает, что байты подсчета следующего прогона считываются буквально из данных кодированного изображения. Затем байт счетчика выполнения содержит значение в диапазоне от 0 до 127 (счетчик запуска минус один). Схемы RLE на уровне байта хороши для данных изображения, которые сохраняются как один байт на пиксель.

Схемы RLE на уровне пикселей используются, когда два или более последовательных байта данных изображения используются для хранения значений одного пикселя. На уровне пикселей биты игнорируются, а байты подсчитываются только для идентификации каждого значения пикселя. Размер кодированных пакетов зависит от размера кодируемых значений пикселей. Количество бит или байтов на пиксель сохраняется в заголовке файла изображения. Запуск данных изображения, сохраненных в виде 3-байтовых значений пикселей, кодируется в 4-байтовый пакет, с одним байтом подсчета количества операций, за которым следуют три байта с байтами. Метод кодирования остается таким же, как и с байтовым RLE.

Кодирование длин серий (англ. Run-length encoding, RLE) или Кодирование повторов - простой алгоритм сжатия данных, который оперирует сериями данных, то есть последовательностями, в которых один и тот же символ встречается несколько раз подряд. При кодировании строка одинаковых символов, составляющих серию, заменяется строкой, которая содержит сам повторяющийся символ и количество его повторов.

Характеристики алгоритма RLE:

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

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

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

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

Алгоритм рассчитан на деловую графику - изображения с большими областями повторяющегося цвета. Ситуация, когда файл увеличивается, для этого простого алгоритма не так уж редка. Ее можно легко получить, применяя групповое кодирование к обработанным цветным фотографиям. Для того чтобы увеличить изображение в два раза, его надо применить к изображению, в котором значения всех пикселов больше двоичного 11000000 и подряд попарно не повторяются.

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

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

29. Алгоритм сжатия lzw

Название алгоритм получил по первым буквам фамилий его разработчиков - Lempel , Ziv и Welch .

LZW-алгоритм основан на идее расширения алфавита, что позволяет использовать дополнительные символы для представления строк обычных символов. Используя, например, вместо 8-битовых ASCII-кодов 9-битовые, вы получаете дополнительные 256 символов. Работа компрессора сводится к построению таблицы, состоящей из строк и соответствующих им кодов. Алгоритм сжатия сводится к следующему: программа прочитывает очередной символ и добавляет его к строке. Если строка уже находится в таблице, чтение продолжается, если нет, данная строка добавляется к таблице строк. Чем больше будет повторяющихся строк, тем сильнее будут сжаты данные. Возвращаясь к примеру с телефоном, можно, проведя весьма упрощенную аналогию, сказать, что, сжимая запись 233 34 44 по LZW-методу, мы придем к введению новых строк - 333 и 444 и, выражая их дополнительными символами, сможем уменьшить длину записи.

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

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

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

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

Базовая классификация обратимых алгоритмов сжатия

Существует много разных практических методов сжатия без потери информации, которые, как правило, имеют разную эффективность для разных типов данных и разных объемов. Однако, в основе этих методов лежат три главные классические схемы сжатия:

Кодирование серий последовательностей (RLE);

Статистические методы сжатия;

Словарные (эвристические) методы сжатия.

Сжатие способом кодирования серий: алгоритм RLE

Наиболее известный простой подход и алгоритм сжатия информации обратимым путем - это кодирование серий последовательностей (Run Length Encoding - RLE). Суть методов данного подхода состоит в замене цепочек или серий повторяющихся байтов или их последовательностей на один кодирующий байт и счетчик числа их повторений . Проблема всех аналогичных методов заключается в определении способа, при помощи которого распаковывающий алгоритм мог бы отличить в результирующем потоке байтов кодированную серию от других - некодированных последовательностей байтов. Решение проблемы достигается обычно простановкой меток в начале кодированных цепочек. Такими метками могут быть, например, характерные значения битов в первом байте кодированной серии, значения первого байта кодированной серии и т.п. Данные методы, как правило, достаточно эффективны для сжатия растровых графических изображений (BMP, PCX, TIF, GIF), т.к. последние содержат достаточно много длинных серий повторяющихся последовательностей байтов. Недостатком метода RLE является достаточно низкая степень сжатия или стоимость кодирования файлов с малым числом серий и, что еще хуже - с малым числом повторяющихся байтов в сериях.

В основе алгоритма RLE лежит идея выявления повторяющихся последовательностей данных и замены их более простой структурой, в которой указывается код данных и коэффициент повторения. Например, пусть задана такая последовательность данных, что подлежит сжатию: 1 1 1 1 2 2 3 4 4 4 . В алгоритме RLE предлагается заменить ее следующей структурой: 1 4 2 2 3 1 4 3 , где первое число каждой пары чисел - это код данных, а второе - коэффициент повторения. Если для хранения каждого элемента данных входной последовательности отводится 1 байт, то вся последовательность будет занимать 10 байт памяти, тогда как выходная последовательность (сжатый вариант) будет занимать 8 байт памяти. Понятно, что алгоритм RLE будет давать лучший эффект сжатия при большей длине повторяющейся последовательности данных. В случае рассмотренного выше примера, если входная последовательность будет иметь такой вид: 1 1 1 1 1 1 3 4 4 4, то коэффициент сжатия будет равен 60%. В связи с этим большая эффективность алгоритма RLE достигается при сжатии графических данных (в особенности для однотонных изображений).


Эвристические (словарные) алгоритмы сжатия (LZ, LZW) ищут в файле строки, которые повторяются и строят словарь фраз, которые уже встречались. Обычно такие алгоритмы имеют целый ряд специфических параметров (размер буфера, максимальная длина фразы и т.п.), подбор которых зависит от опыта автора работы, и эти параметры добираются таким образом, чтобы достичь оптимального соотношения времени работы алгоритма, коэффициента сжатия и перечня файлов, которые хорошо сжимаются.

Статистические алгоритмы (Хаффмана, Шеннона-Фано, арифметические) Статистические алгоритмы используют статистическую модель данных, и качество сжатия информации напрямую зависит от того, насколько хороша эта модель. Учет статистических свойств данных в простейшем случае означает использование для кодирования неравномерных кодов – часто встречающиеся символы кодируются короткими кодами, а редко – длинными. Т.е., такие алгоритмы нуждаются в знании вероятностей появления символов в изображении, оценкой чего может являться в простом случае частота появления символов во входных данных. Как правило, эти вероятности неизвестны. Целью кодирования является преобразование входного потока в поток бит минимальной длины, что достигается уменьшением энтропии (хаотичности) входного потока путем учета частот символов.

Длина кода, представляющего символы из алфавита потока должна быть пропорциональна объему информации входного потока, а длина символов потока в битах может быть не кратна 8 и даже переменной. Если распределение вероятностей частот появления символов из алфавита входного потока известно, то можно построить модель оптимального кодирования. Однако, ввиду существования огромного числа различных форматов файлов задача значительно усложняется, т.к. распределение частот символов данных заранее неизвестно. В таком случае используются два подхода.

Первый заключается в просмотре входного потока и построении кодирования на основании собранной статистики (при этом требуется два прохода по файлу - один для просмотра и сбора статистической информации, второй - для кодирования, что несколько ограничивает сферу применения таких алгоритмов, т.к., таким образом, исключается возможность однопроходного кодирования "на лету", применяемого в телекоммуникационных системах, где и объем данных, подчас, не известен, а их повторная передача или разбор может занять неоправданно много времени). В таком случае, в выходной поток записывается статистическая схема использованного кодирования. Данный метод известен как статическое кодирование Хаффмена. Вместе со сжатым файлом передается таблица символов. Такие алгоритмы достаточно неплохо сжимают большинство файлов, но необходимая дополнительная передача таблицы частот символов, а также необходимость двух проходов исходного файла для набора статистики и сжатия.

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

С учетом этого статистические алгоритмы можно разделить на три класса:

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

2. Полуадаптивные - для каждого файла строится таблица частот символов и на основе неё сжимают файл. Вместе со сжатым файлом передается таблица символов. Такие алгоритмы достаточно неплохо сжимают большинство файлов, но необходимая дополнительная передача таблицы частот символов, а также необходимость двух проходов исходного файла для набора статистики и сжатия.

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

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

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

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



Рекомендуем почитать

Наверх