Рассмотрим пример прогрессирующего сжатия изображений
Деление этого числа на 4 для вычисления среднего и округление до целого вновь приводит к 8 разрядам, но с возможной потерей точности. Если потеря точности нежелательна, то можно представить наш пиксел второго слоя в виде 10-ти битовых чисел, а пиксел первого слоя - с помощью 12 разрядов. Получится число 80 с небольшой ошибкой. Лучшее решение заключается в использовании родителя группы при вычислении его четырех потомков. Это можно делать, вычисляя разность между родителем и его потомками и записывая эту разность (после подходящего кодирования) в слой сжатого файла.
Декодер восстанавливает разность и использует родителя из слоя для вычисления значений четырех пикселов. Для кодирования разностей можно применять метод Хаффмана или арифметическое кодирование. Если все слои вычислены и находятся в памяти, то можно найти статистическое распределение этих разностей, которое можно использовать для достижения наилучшего статистического сжатия. Если в памяти нет места для всех слоев, можно применить простую адаптивную модель. Она начинается присвоением счетчика 1 каждому значению разности (чтобы избегнуть проблему нулевой вероятности. После вычисления очередной разности, ей присваивается некоторая вероятность, и она кодируется, исходя из ее счетчика. После чего счетчик обновляется. Неплохо делать увеличение счетчика не не единицу, а на большее число. Тогда исходные единичные значения счетчиков быстро станут незначимыми.
Родительский пиксел не обязан быть равен среднему значению группы. Можно, например, выбрать в качестве родительского максимальный (или минимальный) пиксел группы. Преимущество такого метода заключается в том, что родительский пиксел равен одному из его потомков. Кодер просто закодирует три пиксела группы, а декодер декодирует три пиксела (или их разности) и дополнит группу четвертым родительским пикселом. При кодировании последовательных групп слоя, кодер должен выбирать поочередно максимальное или минимальное значение в качестве родителя, поскольку выбор только одного экстремума породит темнеющие или светлеющие слои. Три слоя для этого случая. В сжатом файле будут записаны числа 140, (0), 21, 72, 16, (3), 90, 72, 23, (3), 58, 33, 18, (0), 18, 32, 44, (3), 100, 70, 59, где число в скобках имеет длину в 2 бита. Оно говорит о том, в какой квадрант поместить родительский пиксел. Заметим, что квадранты занумерованы следующим образом.
Выбор медианы группы производится несколько медленнее нахождения максимума или минимума, но улучшает динамику проявления слоев при прогрессирующей декомпрессии. Нахождение медианы требует двух сравнений, а для вычисления среднего понадобится деление на 4 (или правый сдвиг). Если используется медиана при кодировании слоя — 1, то оставшиеся три пиксела можно кодировать в слое с помощью их разностей, за которыми следует 2-х битовый код, сообщающий, который из четырех был родительским. Другое небольшое преимущество использования медианы заключается в том, что когда декодер читает этот 2-х битовый код, то ему становится известно, сколько из трех пикселов больше медианы, а сколько - меньше.
Например, если этот код говорит, что один пиксел меньше медианы, а два другие - больше, а прочитанный пиксел меньше медианы, то декодер точно знает, что оставшиеся пикселы будут больше медианы. Полученная информация изменяет распределение разностей пикселов, и это преимущество может быть реализовано с помощью трех таблиц счетчиков для определения вероятностей при кодировании разностей. Одна таблица используется при кодировании пикселов при условии, что декодер знает, что они больше медианы. Другая таблица применяется для кодирования, если известно, что пиксел меньше медианы. А третья таблица работает, если декодер не знает заранее их соотношение с медианой. Это обстоятельство улучшает сжатие на несколько процентов и показывает, как добавление новых признаков в метод сжатия дает общее уменьшение сжатого файла.
- RSS
Наши услуги: