Комплексное использование алгоритма кодирования длин серий и арифметического кодирования для сжатия изображений

Самохвалов А.В.

КОМПЛЕКСНОЕ ИСПОЛЬЗОВАНИЕ АЛГОРИТМА КОДИРОВАНИЯ ДЛИН СЕРИЙ И АРИФМЕТИЧЕСКОГО КОДИРОВАНИЯ ДЛЯ СЖАТИЯ ИЗОБРАЖЕНИЙ

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

Алгоритм группового кодирования RLE.

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

Рассмотрим первый вариант алгоритма RLE.

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

Соответственно оставшиеся 6 бит расходуются на счетчик, который может принимать значения от 1 до 64. Строку из 64 повторяющихся байтов мы превращаем в два байта, т.е. сожмем в 32 раза. Данный алгоритм реализован в формате PCX. Максимальное количество цветов изображения, сжимаемого данным алгоритмом 2(8 2) = 26 = 64 цвета.

Рис. 1. Структура данных первого варианта алгоритма RLE

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

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

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

0 7 бит Что пропускать Что пропускать

1 7 бит Что повторять

Рис. 2. Структура данных второго варианта алгоритма RLE

Как можно легко подсчитать, в лучшем случае этот алгоритм сжимает файл в 64 раза (а не в 32 раза, как в предыдущем варианте), в худшем увеличивает на 1/128. Средние показатели степени компрессии данного алгоритма находятся на уровне показателей первого варианта. Максимальное количество цветов изображения,

сжимаемого данным алгоритмом 28 = 256 цветов.

Второй вариант алгоритма RLE предпочтителен для сжатия более сложных по структуре изображений. Первый вариант данного алгоритма для 8-битных изображений вообще не применим.

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

а т й а б а е м о н \—і ГО Ю 'sO г- со ОЛ о \—1 \—1 \—1 1—1 ГО 1—1 \—1 Ю 1—1 'sO 1—1 г-1—1 со \—1 ОЛ 1—1 о \—1 ГО Ю 'sO г- СО ОЛ О ГО

е и н о У а н з о 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 о 0 СТЇ 1 0 СТЇ 1 0 СТЇ 1 0 СТЇ 1 0 СТЇ 1 0 СТЇ 1 о 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 о 0 1 0 1 0 1 О 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 5 Ю 2 О

Рис. 3. Значения пикселов тестовой строки изображения гистограммы

Результат работы первого варианта алгоритма группового кодирования над данной строкой:

(11_6, 255) (00_0) (11_6, 190) (00_0) (11_4, 255) (00_0) (11_3, 120) (00_0) (11_5, 255) (00_0), где

00_у - метка непосредственного значения у, 11_x - метка счетчика повтора, x

Коэффициент сжатия первого варианта алгоритма RLE для данной строки равен

(11_5, 255) счетчик.

30байт

16байт

1,875

Результат работы второго варианта алгоритма над данной строкой, приведено на рис. 3:

где 0_x -метка счетчика пропуска, 1_x - метка счетчика повтора, x - счетчик.

30байт „

Коэффициент сжатия второго варианта алгоритма RLE для данной строки равен -----------------« 1,37 .

22байта

(0_1, 0) (0_1, 0),

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

Арифметическое кодирование.

Арифметическое сжатие - достаточно изящный метод, в основе которого лежит очень простая идея. Мы представляем кодируемый данные в виде дроби, при этом строим дробь таким образом, чтобы наш текст был представлен как можно компактнее. Для примера рассмотрим построение такой дроби на интервале [0; 1) (0 -

включается, 1 - нет). Интервал [0; 1) выбран потому, что он удобен для объяснений. Мы разбиваем его на

подынтервалы с длинами, равными вероятностям появления символов в потоке. [2]

На первом этапе следует вычислить или, по крайней мере, оценить частоты возникновения каждого символа алфавита. Наилучшего результата можно добиться, прочитав весь входной файл на первом проходе алгоритма сжатия, состоящего из двух проходов [3] (рис. 4.). Однако если программа может получить хорошие оценки частот символов из другого источника, первый проход можно опустить [3] (рис. 5.).

Статистические

данные

Рис. 4. Арифметическое кодирование с получением статистики

Перед началом работы соответствующий входным данным интервал есть [0; 1). При обработке очередного символа его ширина сужается за счет выделения этому символу части интервала. Например, применим к тексту "еа^ !" алфавита { а,е,^о,и,! } модель с постоянными вероятностями, заданными в таблице 1.

И кодировщику, и декодировщику известно, что в самом начале интервал есть [0; 1). После просмотра первого символа "е", кодировщик сужает интервал до [0.2; 0.5) (рис. 6), который модель выделяет этому символу. Второй символ "а" сузит этот новый интервал до первой его пятой части, поскольку для "а" выделен фиксированный интервал [0.0; 0.2). В результате получим рабочий интервал [0.2; 0.26), т.к.

предыдущий интервал имел ширину в 0.3 единицы и одна пятая от него есть 0.06. Следующему символу ’Ч" соответствует фиксированный интервал [0.5; 0.6), что применительно к рабочему интервалу [0.2; 0.26)

суживает его до интервала [0.23; 0.236). Промежуточные и конечный интервалы, полученные при работе

алгоритма, представлены в таблице 2.

Известная

статистика

Входные

данные

Арифметическое кодирование входных данных

Закодированные

данные

Рис. 5. Арифметическое кодирование с известной статистикой Таблица 1

Пример постоянной модели для алфавита { а,е,^о,и,! }.

Символ Вероятность Интервал

а 0,2 [0.0 0.2)

е 0,3 [0.2 0.5)

i 0,1 [0.5 0.6)

о 0,2 [0.6 0.8)

и 0,1 [0.8 0.9)

! 0,1 [0.9 1.0)

Предположим, что все что декодировщик знает о тексте, это конечный интервал [0.23354; 0.2336). Он сразу же понимает, что первый закодированный символ есть "е", т.к. итоговый интервал целиком лежит в интервале, выделенном моделью этому символу согласно таблице 1. Теперь повторим действия кодировщика:

Сначала [0.0; 1.0)

После просмотра "е" [0.2; 0.5)

Таблица 2

Интервалы, полученные при работе алгоритма

Этап Интервал

Начало [0.0; 1.0 )

после просмотра символа «е» [0.2; 0.5 )

после просмотра символа «а» [0.2; 0.26 )

после просмотра символа «Ъ> [0.23; 0.236 )

после просмотра символа «Ъ> [0.233; 0.2336)

после просмотра символа «!» [0.23354; 0.2336)

Отсюда ясно, что второй символ - это "а", поскольку это приведет к интервалу [0.2; 0.26), который полностью вмещает итоговый интервал [0.23354; 0.233 6). Продолжая работать таким же образом, деко-

дировщик извлечет весь текст.

Декодировщику нет необходимости знать значения обеих границ итогового интервала, полученного от кодировщика. Даже единственного значения, лежащего внутри него, например 0.23355, уже достаточно. (Другие числа - 0.23354, 0.23357 или даже 0.23354321 - вполне годятся). Од-

нако, чтобы завершить процесс, декодировщику нужно вовремя распознать конец текста. Кроме того, одно и то же число 0. 0 можно представить и как "а", и как "аа", "ааа" и т.д. Для устранения неясности мы должны обозначить завершение каждого текста специальным символом ЕОЕ, известным и кодировщику, и декодировщику. Для алфавита из таблицы 1 для этой цели, и только для нее, будет использоваться символ "! ". Когда декодировщик встречает этот символ, он прекращает свой процесс.

Рис. 6. Пример работы алгоритма арифметического кодирование на входном слове «eaii!»

Для фиксированной модели, задаваемой моделью, представленной в таблице 1, энтропия 5-символьного текста "eaii!" будет:

- log 0.3 - log 0.2 - log 0.1 - log 0.1 - log 0.1 = - log 0.00006 ~ 4.22.

(Здесь применяем логарифм по основанию 10, т.к. вышерассмотренное кодирование выполнялось для десятичных чисел). Это объясняет, почему требуется 5 десятичных цифр (для десятичного числа 23355 потребуется 15 бит) для кодирования этого текста. По сути, ширина итогового интервала есть 0.2336 -

0.23354 = 0.00006, а энтропия - отрицательный десятичный логарифм этого числа. Конечно, обычно мы работаем с двоичной арифметикой, передаем двоичные числа и измеряем энтропию в битах.

Пяти десятичных цифр кажется слишком много для кодирования текста из 4-х гласных! Однако, ясно, что разные модели дают разную энтропию. Лучшая модель, построенная на анализе отдельных символов текста "eaii!", есть следующее множество частот символов:

{ "e"(0.2), "a"(0.2), "i"(0.4), "!"(0.2) }.

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

Результат применения алгоритма арифметического кодирования с вычислением статистики для тестовой строки изображения, представленной на рис. 3, следующий: 0,197109367222194. Для представления данного десятичного числа в двоичной форме нам потребуется 48 битов (ровно 6 байт). Таким образом, алгоритм арифметического сжатия демонстрирует очень высокую степень компрессии (для алгоритмов без поте-

(30байт * 8)бит с

ри качества), равную ------------------ = 5.

р р 48бит

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

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

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

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

Арифметическое сжатие

Статистические

Предобработка входных данных данные Арифметическое кодирование входных данных

Групповое кодирование (RLE) 1 ,

1

1 Входные

Рис. 7. Алгоритм комплексного использования арифметического кодирования и RLE

данные

Рис. 8. Улучшение алгоритм комплексного использования арифметического кодирования и RLE Выходные данные: 0,1653504269202. Для представления данного десятичного числа в двоичной форме

нам потребуется 41 бит. Таким образом, алгоритм арифметического сжатия с использованием алгоритма ЯЬЕ на этапе предобработки демонстрирует лучшую степень компрессии, нежели тот же алгоритм без ЯЬЕ-

{30байт * 8)бит _ __

предобработки. Коэффициент компрессии в данном случае равен -----------------------= 5, 85 и, таким образом,

41бит

он увеличился на 17% по сравнению с коэффициентом компрессии простого арифметического сжатия.

Следует отметить, что в качестве тестовых данных использовалась лишь строка изображения. При обработке изображения целиком коэффициенты компрессии будут несколько изменятся от представленных в данной статье. Также следует учитывать, что применения алгоритма ЯЬЕ подразумевает ограничение класса сжимаемых изображений рамками деловой и научной графики. Использование алгоритма ЯЬЕ для других

классов изображений менее эффективно, а порой может привести к некоторому увеличению объема изображения.

ЛИТЕРАТУРА

1. Jeff Prosise. How Computer Graphics Work. - Ziff-Davis Press, 1994. - 182 р.

2. Ватолин Д., А. Ратушняк, М. Смирнов, В. Юкин. Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео. - М.: Диалог-МИФИ , 2002. - 384с.

3. Сэломон Д. Сжатие данных изображений и звука. - М.: Техносфера, 2004. - 368с.

4. Moffat A., Neal R., Witten I.H. Arithmetic Coding Revisited // ACM Transactions on Information

Systems, 16(3), 1998, р. 256-294.