Метод сжатия JPEG-LS и коды Голомба
Метод сжатия JPEG-LS использует коды Голомба, поэтому мы дадим краткое описание этих мало известных кодов. Код Голомба неотрицательного целого числа n [Golomb 66] может быть эффективным кодом Хаффмана. Этот код зависит от выбора некоторого параметра b. Прежде всего необходимо вычислить две величины, а затем построить код из двух частей; первая часть - это число n, закодированное с помощью унарного кода, а вторая - двоичное выражение для n, состоящее из [log26J бит (для малых остатков) или из [log2b] бит (для больших).
Имея такие данные на входе, легко породить наилучшие коды переменной длины, не прибегая к алгоритму Хаффмана.
Основы метода JPEG-LS.
Мода без потерь данных метода JPEG весьма неэффективна, и часто ее даже не включают в конкретные приложения, использующие JPEG. В результате ISO в кооперации с IEC разработали новый стандарт для сжатия без потерь (и почти без потерь) непрерывно-тоновых изображений. Этот метод официально известен как рекомендация ISO/IEC CD 14495, но его принято называть JPEG-LS. Здесь рассматриваются основные принципы этого метода, который не является расширением или модификацией метода JPEG. Это совершенно новый метод, простой и быстрый. Он не использует ни DCT, ни арифметическое кодирование.
Применяется слабое квантование и только в моде почти без потерь. JPEG-LS основан на идеях, развитых в [Weinberger и др. 96] для метода компрессии LOCO-I. JPEG-LS (1) изучает несколько предыдущих соседей текущего пиксела, (2) рассматривает их как контекст этого пиксела, (3) использует контекст для прогнозирования пиксела и для выбора распределения вероятностей из нескольких имеющихся, и (4) применяет это распределение для кодирования ошибки прогноза с помощью специального кода Голомба. Имеется также серийная мода, когда длина серии одинаковых пикселов кодируется подходящим образом.
Кодер изучает пикселы контекста и устанавливает, в какой моде кодировать данный пиксел х, в серийной или в регулярной. Если контекст указывает, что пикселы у и г, следующие за х, скорее всего будут совпадать, то выбирается серийная мода. В противном случае, используется регулярная мода. Если включена опция «почти без потерь», то выбор моды делается несколько иначе. Если контекст предполагает, что следующие пикселы будут почти совпадать (в соответствии с параметром допустимого отклонения NEAR), то декодер выбирает серийную моду. Если нет, то берется регулярная мода. Дальнейшее кодирование зависит от выбранной моды.
В регулярной моде кодер использует величины пикселов a, b и с для вычисления прогноза пиксела х. Этот прогноз вычитается из х, в результате чего получается ошибка прогноза, которая обозначается через Errval. Затем ошибка прогноза корректируется некоторым членом, зависящим от контекста (корректировка делается с целью компенсирования систематического отклонения прогноза), и потом она кодируется с помощью кодов Голомба. Код Голомба зависит от всех четырех пикселов контекста, а также от ошибок прогноза этих же самых пикселов (эта информация хранится в массивах А и N. При компрессии почти без потерь ошибка прогноза еще дополнительно квантуется перед кодированием.
В серийной моде кодер начинает с пиксела х и находит в этой строке наибольшую длину серии пикселов, совпадающих с контекстным пикселом а. Кодер не расширяет эту серию за пределы текущей строки. Поскольку все символы серии совпадают с а (а этот пиксел известен декодеру), то достаточно закодировать длину серии, что делается с помощью массива J из 32 элементов. (При сжатии почти без потерь, кодер выбирает серию пикселов, близких к а с помощью параметра NEAR.) Декодер мало отличается от кодера, поэтому JPEG-LS можно считать почти симметричным методом сжатия.
Сжатый файл состоит из сегментов данных (содержащих коды Голомба и длины серий), сегментов маркеров (с информацией, необходимой декодеру) и просто маркеров (в качестве которых используются некоторые зарезервированные маркеры JPEG). Маркером является байт из одних единиц, за которым следует специальный код, сигнализирующий о начале нового сегмента. Если за маркером следует байт, у которого старший бит равен 1, то этот байт является началом сегмента маркеров. В противном случае, начинается сегмент данных.
- RSS
Наши услуги: