SSP

Материал из Кафедра АСОИУ
Перейти к: навигация, поиск

Содержание

Введение

Целью данной курсовой работы по дисциплине «Информатика» является разработать алгоритм сжатия изображений без потерь и реализовать его. В процессе работы были изучены теоретические основы алгоритма SSP, проанализированы результаты, даваемые этим алгоритмом, а также был разработан свой алгоритм сжатия изображений на основе алгоритма SSP, который был реализован на объектно–ориентированном языке высокого уровня Java. По окончании работы было произведено тестирование разработанного алгоритма, позволившее оценить его эффективность.

Описание алгоритмов

Компрессия изображения

Компрессия изображения содержит следующие этапы:

  1. изображение декодируется в RGB массив;
  2. производится фильтрация изображения фильтром Paeth;
  3. выполняется прямое преобразование BWT;
  4. производится сжатие полученных данных с помощью алгоритма LZW.

Декомпрессия изображения

Декомпрессия изображения содержит следующие этапы:

  1. производится декомпрессия данных с помощью алгоритма LZW;
  2. выполняется обратное преобразование BWT;
  3. производится дефильтрация данных фильтром Paeth;
  4. полученные данные кодируются в массив пикселей.

Фильтр Paeth[1]

В системе этот фильтр применяется отдельно для каждого канала цвета. Это преобразование выполняется для всех пикселей, кроме пикселей первой строки и первого столбца. Обозначим пиксели исходного изображения: x - текущий пиксель, a - пиксель, находящийся западнее текущего, b - пиксель, находящийся севернее текущего, c - пиксель, находящийся северо-западнее текущего. Следующая таблица иллюстрирует расположение четырёх соседних пикселей:

cb
ax


При фильтрации получим новую матрицу пикселей. Обозначим пиксели фильтрованного изображения: x1, a1, b1, c1.

c1b1
a1x1


Фильтрация

Для каждого фильтруемого пикселя необходимо посчитать три значения:
pa = |b-c|
pb = |a-c|
pc = |a+b-2∗c|
Значение пикселя x1 определяется из трёх условий:
Если pa ≤ pb и pa ≤ pc, то x1 = x-a
Если pb ≤ pc, то x1 = x-b
Если pb ≥ pc, то x1 = x-c

Дефильтрация

Для каждого дефильтруемого пикселя необходимо посчитать три значения:
pa = |b-c|
pb = |a-c|
pc = |a+b-2∗c|
Значение пикселя x определяется из трёх условий:
Если pa ≤ pb и pa ≤ pc, то x = x1+a
Если pb ≤ pc, то x = x1+b
Если pb ≥ pc, то x = x1+c

Преобразование BWT (Преобразование Барроуза — Уилера)[2]

Преобразование Барроуза — Уилера (Burrows-Wheeler transform, BWT) — это алгоритм, используемый в техниках сжатия данных для преобразования исходных данных.

Прямое преобразование

Преобразование выполняется в три этапа. На первом этапе составляется таблица всех циклических сдвигов входной строки. На втором этапе производится лексикографическая сортировка строк таблицы. На третьем этапе в качестве выходной строки выбирается последний столбец таблицы преобразования. Следующий пример иллюстрирует описанный алгоритм: Пусть нам дана исходная строка s=«ABACABA».
http://habrastorage.org/storage1/7ce4ce91/292b10ed/55483ae4/49f57c59.png
Результат вкратце запишем так: BWT(s)=(«BCABAAA», 3), где 3 — это номер исходной строки в отсортированной матрице, так как он может понадобиться для обратного преобразования.

Обратное преобразование

Пусть нам дано: BWT(s)=(«BCABAAA», 3). Тогда выпишем в столбик нашу преобразованную последовательность символов «BCABAAA». Запишем её как последний столбик предыдущей матрицы (при прямом преобразовании Барроуза — Уилера), при этом все предыдущие столбцы оставляем пустыми. Далее построчно отсортируем матрицу, затем в предыдущий столбец запишем «BCABAAA». Опять построчно отсортируем матрицу. Продолжая таким образом, можно восстановить полный список всех циклических перестановок строки, которую нам надо найти. Выстроив полный отсортированный список перестановок, выберем строку с номером, который нам был изначально дан. В итоге мы получим искомую строку. Алгоритм обратного преобразования описан в таблице ниже:
http://habrastorage.org/storage1/c0b2f7fe/f90b0af8/9ccead14/70a91cc7.png

Алгоритм LZW (Алгоритм Лемпеля — Зива — Велча)[3]

Алгоритм Лемпеля — Зива — Велча (Lempel-Ziv-Welch, LZW) — это универсальный алгоритм сжатия данных без потерь.

Кодирование

Процесс сжатия выглядит следующим образом. Последовательно считываются символы входного потока и происходит проверка, существует ли в созданном словаре строк такая строка. Если такая строка существует, считывается следующий символ, а если строка не существует, в поток заносится код для предыдущей найденной строки, строка заносится в словарь, а поиск начинается снова.
Например, если сжимают байтовые данные, то при инициализации словаря в нём окажется 256 строк (от «0» до «255»). Новые строки формируют словарь последовательно. Алгоритм генерирует однозначно декодируемый код за счет того, что каждый раз, когда генерируется новый код, новая строка добавляется в таблицу строк. LZW постоянно проверяет, является ли строка уже известной, и, если так, выводит существующий код без генерации нового. Таким образом, каждая строка будет храниться в единственном экземпляре и иметь свой уникальный номер.

Декодирование

Декодер начинает с заполнения словаря первыми символами алфавита (в нашем случае их 256). Затем он читает входной файл, который состоит из номеров строк в словаре, использует каждый номер для того, чтобы восстановить несжатые символы из словаря и записать их в выходной файл. Кроме того, он строит словарь тем же методом, что и кодер.
Особенность LZW заключается в том, что для декодирования не нужно сохранять словарь строк в файл для распаковки. Алгоритм построен таким образом, что восстановить словарь строк возможно используя только поток кодов.

Описание разработанной системы

Разработанная система представляет собой консольное приложение, написанное на объектно–ориентированном языке высокого уровня Java. Это приложение позволяет сжимать изображения формата PNG с глубиной цвета равной 24 бита.

Результаты тестирования

Для тестирования использовался набор тестовых изображений[4]:

http://www.researchandtechnology.net/pcif/images/thumbnails/frymire.jpghttp://r0k.us/graphics/kodak/thumbs/kodim05t.jpghttp://r0k.us/graphics/kodak/thumbs/kodim20t.jpghttp://www.researchandtechnology.net/pcif/images/thumbnails/monarch.jpghttp://www.researchandtechnology.net/pcif/images/thumbnails/peppers.jpghttp://www.researchandtechnology.net/pcif/images/thumbnails/sail.jpghttp://www.researchandtechnology.net/pcif/images/thumbnails/tulips.jpg
frymire.pngkodim05.pngkodim20.pngmonarch.pngpeppers.pngsail.pngtulips.png


Все изображения имеют глубину цвета равную 24 бита. Каждый файл сжимался три раза, время выполнения сжатия вычислялось как среднее арифметическое между полученными значениями. Средний коэффициент сжатия составил 1,32. Полученные результаты представлены в таблице:

Название файлаРазмер оригинального файла, пикселиОбъём оригинального файла, КБОбъём сжатого файла, КБКоэффициент сжатияВремя выполнения сжатия, с
frymire.png1118∗1105361524-40,44
kodim05.png768∗5127676411,208,09
kodim20.png768∗5124803301,458,37
monarch.png768∗5126214791,307,67
peppers.png512∗5124413311,334,73
sail.png768∗5127776291,247,76
tulips.png768∗5126914971,397,15


Все изображения, за исключением изображения flymire.png, были сжаты. Такой результат можно объяснить тем, что эффективность сжатия, конечно же, зависит от сжимаемых данных. Изображение flymire.png “составлено” из других изображений и не имеет повторяющихся фрагментов. Такой случай является наихудшим для используемых алгоритмов. Именно этим можно объяснить увеличение объёма сжатого файла по сравнению с исходным.

Личные инструменты