- •Общие положения алгоритмов сжатия изображений Введение
- •Классы изображений
- •Классы приложений Примеры приложений, использующих алгоритмы компрессии графики
- •Требования приложений к алгоритмам компрессии
- •Критерии сравнения алгоритмов
- •Контрольные вопросы к разделу
- •Алгоритмы архивации без потерь Алгоритм rle Первый вариант алгоритма
- •Второй вариант алгоритма
- •АлгоритмLzw
- •Алгоритм lz
- •Алгоритм lzw
- •Алгоритм Хаффмана Классический алгоритм Хаффмана
- •Алгоритм Хаффмана с фиксированной таблицей ccittGroup 3
- •Lossless jpeg
- •Заключение
- •Контрольные вопросы к разделу
- •Алгоритмы архивации с потерями Проблемы алгоритмов архивации с потерями
- •АлгоритмJpeg
- •Как работает алгоритм
- •Конвейер операций, используемый в алгоритме jpeg.
- •Фрактальный алгоритм Идея метода
- •Папоротник Барнсли. Задается 4 преобразованиями.
- •Построение алгоритма
- •Оценка потерь и способы их регулирования
- •Рекурсивный (волновой) алгоритм
- •Заключение
- •Контрольные вопросы к разделу
- •Различия между форматом и алгоритмом
- •Указатель терминов
- •Литература Литература по алгоритмам сжатия
- •Литература по форматам изображений
- •Приложение. Таблицы сравнения алгоритмов Архивация двуцветного изображения
- •Архивация16-цветного изображения
- •Архивация изображения в градациях серого
- •Архивация полноцветного изображения
АлгоритмJpeg
JPEG — один из самых новых и достаточно мощных алгоритмов. Практически он является стандартом де-факто для полноцветных изображений [1]. Оперирует алгоритм областями 8х8, на которых яркость и цвет меняются сравнительно плавно. Вследствие этого, при разложении матрицы такой области в двойной ряд по косинусам (см. формулы ниже) значимыми оказываются только первые коэффициенты. Таким образом, сжатие в JPEG осуществляется за счет плавности изменения цветов в изображении.
Алгоритм разработан группой экспертов в области фотографии специально для сжатия 24-битных изображений. JPEG —Joint Photographic Expert Group— подразделение в рамках ISO — Международной организации по стандартизации. Название алгоритма читается ['jei'peg]. В целом алгоритм основан на дискретном косинусоидальном преобразовании (в дальнейшем ДКП), применяемом к матрице изображения для получения некоторой новой матрицы коэффициентов. Для получения исходного изображения применяется обратное преобразование.
ДКП раскладывает изображение по амплитудам некоторых частот, таким образом, при преобразовании мы получаем матрицу, в которой многие коэффициенты либо близки, либо равны нулю. Кроме того, человеческая система цветового восприятия слабо распознает определенные частоты. Поэтому можно аппроксимировать некоторые коэффициенты более грубо без заметной потери качества изображения.
Для этого используется квантование коэффициентов (quantization). В самом простом случае — это арифметический побитовый сдвиг вправо. При этом преобразовании теряется часть информации, но могут достигаться большие коэффициенты сжатия.
Как работает алгоритм
Итак, рассмотрим алгоритм подробнее. Пусть мы сжимаем 24-битное изображение.
Шаг 1.
Переводим изображение из цветового пространства RGB, с компонентами, отвечающими за красную (Red), зеленую (Green) и синюю (Blue) составляющие цвета точки, в цветовое пространство YCrCb(иногда называют YUV).
В нем Y — яркостная составляющая, а Cr, Cb— компоненты, отвечающие за цвет (хроматический красный и хроматический синий). За счет того, что человеческий глаз менее чувствителен к цвету, чем к яркости, появляется возможность архивировать массивы дляCrиCbкомпонент с большими потерями и, соответственно, большими коэффициентами сжатия. Подобное преобразование уже давно используется в телевидении. На сигналы, отвечающие за цвет, там выделяется более узкая полоса частот.
Упрощенно перевод из цветового пространства RGB в цветовое пространство YCrCbможно представить так:
Обратное преобразование осуществляется умножением вектора YUV на обратную матрицу.
Шаг 2.
Разбиваем исходное изображение на матрицы 8х8. Формируем из каждой три рабочие матрицы ДКП — по 8 бит отдельно для каждой компоненты. При больших коэффициентах сжатия, этот шаг может выполняется чуть сложнее. Изображение делится по компоненте Y — как и в первом случае, а для компонентCrиCb матрицы набираются через строчку и через столбец. Т.е. из исходной матрицы размером 16x16 получается только одна рабочая матрица ДКП. При этом, как нетрудно заметить, мы теряем 3/4 полезной информации о цветовых составляющих изображения и получаем сразу сжатие в два раза. Мы можем поступать так благодаря работе в пространстве YCrCb. На результирующем RGB изображении, как показала практика, это сказывается не сильно.
Шаг 3.
Применяем ДКП к каждой рабочей матрице. При этом мы получаем матрицу, в которой коэффициенты в левом верхнем углу соответствуют низкочастотной составляющей изображения, а в правом нижнем - высокочастотной.
В упрощенном виде это преобразование можно представить так:
где
Шаг 4.
Производим квантование. В принципе это просто деление рабочей матрицы на матрицу квантования поэлементно. Для каждой компоненты (Y, U иV), в общем случае, задается своя матрица квантованияq[u,v] (далее МК).
На этом шаге осуществляется управление степенью сжатия, и происходят самые большие потери. Понятно, что, задавая МК с большими коэффициентами, мы получим больше нулей и, следовательно, большую степень сжатия.
В стандарт JPEG включены рекомендованные МК, построенные опытным путем. Матрицы для большего или меньшего коэффициентов сжатия получают путем умножения исходной матрицы на некоторое число gamma.
С квантованием связаны и специфические эффекты алгоритма. При больших значениях коэффициента gamma потери в низких частотах могут быть настолько велики, что изображение распадется на квадраты 8х8. Потери в высоких частотах могут проявиться в так называемом “эффекте Гиббса”, когда вокруг контуров с резким переходом цвета образуется своеобразный“нимб”.
Шаг 5.
Переводим матрицу 8x8 в 64-элементный вектор при помощи “зигзаг”-сканирования, т.е. берем элементы с индексами (0,0), (0,1), (1,0), (2,0)...
Таким образом, в начале вектора мы получаем коэффициенты матрицы, соответствующие низким частотам, а в конце — высоким.
Шаг 6.
Свертываем вектор с помощью алгоритма группового кодирования. При этом получаем пары типа (пропустить, число), где “пропустить” является счетчиком пропускаемых нулей, а “число” — значение, которое необходимо поставить в следующую ячейку. Так, вектор 42 3 0 0 0 -2 0 0 0 0 1 ... будет свернут в пары (0,42) (0,3) (3,-2) (4,1) ... .
Шаг 7.
Свертываем получившиеся пары кодированием по Хаффману с фиксированной таблицей.
Процесс восстановления изображения в этом алгоритме полностью симметричен. Метод позволяет сжимать некоторые изображения в 10-15 раз без серьезных потерь.