160 likes | 387 Views
Сжатие информации. Сжатие - более эффективное представление информации, другими словами “выжимание воздуха” из данных Сжатие бывает без потерь и с потерями Сжатие без потерь . Изображение, полученное после декодирования, полностью совпадает с первоначальным
E N D
Сжатие информации Сжатие - более эффективное представление информации, другими словами “выжимание воздуха” из данных Сжатие бывает без потерь и с потерями • Сжатие без потерь. Изображение, полученное после декодирования, полностью совпадает с первоначальным • Сжатие с потерями. Часть информации теряется в процессе сжатия. Принцип сжатия с потерями основан на ограниченных возможностях человеческого зрения. Все потери информации лежат в границах, когда человеческий глаз не видит разницу между первоначальным изображением и декомпрессированным сжатым изображением, содержащим ошибки сжатия с потерями
Сжатие без потерь • Групповое сжатие • Кодирование методом Хаффмана • Схема сжатия LZW • Арифметическое сжатие
Групповое сжатие • Серии повторяющихся величин заменяются единственной величиной и количеством • Например: abbbbbbccdddttddd => 1a6b2c3d2t3d • Этот алгоритм просто реализуется и хорошо работает с длинными сериями повторяющихся величин. • Например: для изображений с большими областями постоянной яркости или цвета
Одна из популярных реализаций группового сжатия – PackBits, используемая для bitmap данных на Apple Macintosh. Предполагая 8-битные данные, PackBits кодирует регулярные величины двумя битами. Для повторяющихся величин первый байт содержит n, (от (-127) до (-1)) количество повторений (-n+1). Второй байт содержит повторяющуюся величину. • Неповторяющиеся величины обозначаются однобайтовым кодом m (от 0 до 127), он представляет длину последовательности минус 1 (abcde m=4). Далее сама последовательность. • Групповое кодирование используется в таких форматах, как MacPaint, TIFF, GEM, PCX, FLI
Кодирование методом Хоффмана (1952) • Данные заменяются более эффективнымикодами • Этот подход, созданный для текстовыхфайлов, породил множество вариантов • Основная схема – присвоение двоичного кодакаждой уникальной величине, причем длинаэтих кодов различна • Более короткие коды неиспользуются для более часто появляющихсявеличин
Значение кодов хранятся в таблице перекодировки Например: abbbcccddeeeeeeeeef Частота, с которой повторяются уникальные величины a:1 b:3 c:3 d:2 e:9 f:1
a:1 b:3 c:3 d:2 e:9 f:1 Для формирования минимального кода используется двоичное дерево. Алгоритм объединяет вместе элементы, появляющиеся наименее часто; затем пара рассматривается как один элемент и их частоты объединяются. Это повторяется до тех пор, пока все элементы не объединяются в пары Наиболее редко используемые значения a и f, так что они становятся первой парой; a - присваивается нулевая ветвь, а f - первая. Это означает, что 0 и 1 будут младшими битами кодов для а и f. Более старшие биты будут получены из дерева по мере того, как оно будет построено. Затем частоты этих первых двух суммируются 1+1=2. Поскольку частота (этих а и f) = 2, объединяем пару с d у которой частота тоже 2. Исходной паре присваивается нулевая ветвь дерева, а - ветвь 1. Таким образом код для а заканчивается на 00, f - 01; d - заканчивается на 1 и будет на один бит короче по сравнению с кодами для а и f
Эффективность алгоритма Хаффмана изменяется с точностью алгоритма и типом изображения. Алгоритм достигает сжатия 8:1. • Кодирование по Хаффману нуждается в точной статистике, поэтому для обеспечения правильной работы, алгоритм часто реализуется в два прохода: • в первый проход создается статистическая модель; • во второй - кодируются данные • В результате, и благодаря тому, что коды переменной длины требуют больше времени для обработки компрессии и декомпрессии сжатие по Хаффману сравнительно медленный процесс
Схема сжатия LZW (1984) • LZW - более современный алгоритм сжатия. В отличие от схемы Хаффмана, перед кодированием не требуется создавать таблицу кодов. Начиная с простой таблицы кодов алгоритм формирует более эффективную таблицу по мере продвижения. Этот алгоритм является адаптивным • LZW начинается с таблицы с одним элементом кода для каждой возможной величины (для восьми бит - 256 элементов). Затем она добавляет в таблицу данные для каждого уникального имени, которое обнаруживает. Необходимо формировать максимальную длину таблицы потому необходимо знать, какой длины код может быть представлен. (Некоторые реализации LZW допускают переменную длину)
Например: ababaaacaaaad • Для простоты: каждая буква - два бита (всего четыре буквы). Начальная кодовая таблица: а:00, b:01, c:10, d:11. LZW ищет самую длинную последовательность. Он находит а и распознает, затем проверяет ab и не распознает. Тогда он заводит код для этой величины. а(000) и делает новый элемент для величин, которые не распознает a:000, b 001, c:010, d:011, ab:100 • Шифратор затем берет последнюю величину b и проверяет последовательность со следующей величиной. ba - не распознается. Заводится код для ba. • Теперь время для “хорошего этапа”. Шифратор и дешифратор могут определить следующий элемент ab. Трехбитный код заменяет два двухбитных • Типичные коэффициенты сжатия при LZW от 1:1 до 3:1, хотя некоторые изображения сжимаются 10:1. Изображение с “шумом” плохо сжимаются. • LZW используется в gif и tiff
Арифметическое сжатие • Арифметическое сжатие, подобно кодированию Хаффману, использует более короткие коды для часто появляющихся участков и более длинные для редко появляющихся. Это более эффективный алгоритм, хотя он (подобно LZW) сжимает последовательность величин, а не сами величины. Арифметическое сжатие близко подходит к теоретическим пределом для алгоритмов сжатия без потерь • Возьмем для примера, множество значений пикселей представленных буквами. Предположим, что каждый пиксель в 1900-пикселовом изображение имеет одну из шести величин, и они появляются с частотами: a:100, b:300, c:300, d:200, f:100
a:100, b:300, c:300, е:900 d:200, f:100 • Один из способов определения состояния этой последовательности задание вероятностей с которой появляются эти пиксели P(a)=0.0526 P(b)=0.1579 P(c)=0.1579 P(d)=0.1052 P(e)=0.4737 P(f)=0.0526 • Серия пикселей, например eb, будет иметь вероятность P(e) x P(b)
Проблема, возникающая при этом задании в том, что вероятности не уникальны P(b)=P(c) x P(eb)=P(ec) • Однако, если вероятность рассматривать как длину, то величину b можно представить сегментом от 0,0526 до 0,2105. Длина этого сегмента вероятность P(b). • Величина c имеет ту же вероятность, что и b, но в другом диапазоне от 0,2105 до 0,3684. Теперь можно представить однозначно любую величину числом, любым, но принадлежащим выбранному диапазону. Например, 0,25 указывает величину c. • В данном случае достаточно двух цифр • Для е от 0.4736 до 0.9473 можно выбрать 0.5 • Более широкий диапазон, больше вероятность, следовательно, меньше знаков
Для представления последовательности из двух символов, необходимо разбить интервал для первого символа • Для ebот 0.4986 до 0.5733 • Для кодирования достаточно 0,50
Так же как и код Хаффмана, арифметическое кодирование эффективно представляет изображения с более часто появляющимися последовательностями пикселей (более вероятные величины) с помощью меньшего количества бит • Арифметическое сжатие может эффективно уменьшать размер файла в зависимости от распределения интенсивности и от точности используемой статистической модели. Иногда сжатие бывает 100:1