Московский государственный университет имени М.В.Ломоносова
Опубликован: 10.10.2007 | Доступ: свободный | Студентов: 1480 / 160 | Оценка: 4.36 / 4.18 | Длительность: 14:22:00
Специальности: Программист
Лекция 6:

Проблемы алгоритмов архивации с потерями

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >

Как работает алгоритм

Итак, рассмотрим алгоритм подробнее. Пусть мы сжимаем 24-битное изображение.

Шаг 1.

Переводим изображение из цветового пространства RGB, с компонентами, отвечающими за красную (Red), зеленую (Green) и синюю (Blue) составляющие цвета точки, в цветовое пространство YCrCb (иногда называют YUV ).

В нем Y - яркостная составляющая, а Cr, Cb - компоненты, отвечающие за цвет (хроматический красный и хроматический синий). За счет того, что человеческий глаз менее чувствителен к цвету, чем к яркости, появляется возможность архивировать массивы для Cr и Cb компонент с большими потерями и, соответственно, большими степенями сжатия. Подобное преобразование уже давно используется в телевидении. На сигналы, отвечающие за цвет, там выделяется более узкая полоса частот.

Упрощенно перевод из цветового пространства RGB в цветовое пространство YCrCb можно представить с помощью матрицы перехода:

\matrix{
   {\left| {\matrix{
   {\rm{Y}}  \cr 
   {{\rm{Cb}}}  \cr 
   {{\rm{Cr}}}  \cr 
 } } \right|} \hfill &  =  \hfill & {\matrix{
   {\left| {\matrix{
   {0.299} & {0.587} & {0.114}  \cr 
   {0.5} & { - 0.4187} & { - 0.0813}  \cr 
   {0.1687} & { - 0.3313} & {0.5}  \cr 
 } } \right|} & * & {\left| {\matrix{
   {\rm{R}}  \cr 
   {\rm{G}}  \cr 
   {\rm{B}}  \cr 
 } } \right|}  \cr 
 } } \hfill  \cr 
 }  + \left| {\matrix{
   0  \cr 
   {128}  \cr 
   {128}  \cr 
 } } \right|

Обратное преобразование осуществляется умножением вектора YUV на обратную матрицу.

\matrix{
   {\left| {\matrix{
   {\rm{R}}  \cr 
   {\rm{G}}  \cr 
   {\rm{B}}  \cr 
 } } \right|} \hfill &  =  \hfill & {\matrix{
   {\left| {\matrix{
   1 & 0 & {1.402}  \cr 
   1 & { - 0.34414} & { - 0.71414}  \cr 
   1 & {1.772} & 0  \cr 
 } } \right|} & * & {\left( {\left| {\matrix{
   {\rm{Y}}  \cr 
   {{\rm{Cb}}}  \cr 
   {{\rm{Cr}}}  \cr 
 } } \right| - \left| {\matrix{
   0  \cr 
   {128}  \cr 
   {128}  \cr 
 } } \right|} \right)}  \cr 
 } } \hfill  \cr 
 }

Шаг 2.

Разбиваем исходное изображение на матрицы 8х8. Формируем из каждой три рабочие матрицы ДКП - по 8 бит отдельно для каждой компоненты. При больших степенях сжатия этот шаг может выполняться чуть сложнее. Изображение делится по компоненте Y - как и в первом случае, а для компонент Cr и Cb матрицы набираются через строчку и через столбец. Т.е. из исходной матрицы размером 16x16 получается только одна рабочая матрица ДКП. При этом, как нетрудно заметить, мы теряем 3/4 полезной информации о цветовых составляющих изображения и получаем сразу сжатие в два раза. Мы можем поступать так благодаря работе в пространстве YCrCb. На результирующем RGB изображении, как показала практика, это сказывается несильно.

Шаг 3.

В упрощенном виде ДКП при n=8 можно представить так:

Y[u,v]\matrix{
    =  & {{1 \over 4}}  \cr 
 } \matrix{
   {\sum\limits_{i = 0}^7 {\sum\limits_{j = 0}^7 {C{\rm{(}}i{\rm{,}}u{\rm{)}} \times C{\rm{(}}j{\rm{,}}v{\rm{)}} \times } } } & {y[i,j]}  \cr 
 }

где

C(i,u) = \matrix{
   {A(u) \times } & {\cos \left( {{\textstyle{{(2 \times i + 1) \times u \times \pi } \over {2 \cdot n}}}} \right)}  \cr 
 }

A(u) = \left\{ {\matrix{
   {{\textstyle{1 \over {\sqrt 2 }}}\matrix{
   , & {\matrix{
   {{\rm{for}}} & {\matrix{
   {\matrix{
   {\rm{u}} &  \equiv   \cr 
 } } & 0  \cr 
 } }  \cr 
 } }  \cr 
 } } \hfill  \cr 
   {\matrix{
   {{\rm{1}}{\rm{,}}} \hfill & {{\rm{ for}}} \hfill & {{\rm{u}} \ne {\rm{0}}} \hfill  \cr 
 } } \hfill  \cr 
 } } \right.

Применяем ДКП к каждой рабочей матрице. При этом мы получаем матрицу, в которой коэффициенты в левом верхнем углу соответствуют низкочастотной составляющей изображения, а в правом нижнем - высокочастотной. Понятие частоты следует из рассмотрения изображения как двумерного сигнала (аналогично рассмотрению звука как сигнала). Плавное изменение цвета соответствует низкочастотной составляющей, а резкие скачки - высокочастотной.

Шаг 4.

Производим квантование. В принципе, это просто деление рабочей матрицы на матрицу квантования поэлементно. Для каждой компоненты ( Y, U и V ), в общем случае, задается своя матрица квантования q[u,v] (далее МК).

Yq[u,v] = \matrix{
   {{\rm{IntegerRound}}} & {\left( {{{Y[u,v]} \over {q[u,v]}}} \right)}  \cr 
 }

На этом шаге осуществляется управление степенью сжатия, и происходят самые большие потери. Понятно, что, задавая МК с большими коэффициентами, мы получим больше нулей и, следовательно, большую степень сжатия.

В стандарт JPEG включены рекомендованные МК, построенные опытным путем. Матрицы для большей или меньшей степени сжатия получают путем умножения исходной матрицы на некоторое число gamma.

С квантованием связаны и специфические эффекты алгоритма. При больших значениях коэффициента gamma потери в низких частотах могут быть настолько велики, что изображение распадется на квадраты 8х8. Потери в высоких частотах могут проявиться в так называемом "эффекте Гиббса", когда вокруг контуров с резким переходом цвета образуется своеобразный "нимб".

Шаг 5.

Переводим матрицу 8x8 в 64-элементный вектор при помощи "зигзаг"-сканирования, т.е. берем элементы с индексами (0,0), (0,1), (1,0), (2,0)... (рис. 6.1)


Рис. 6.1.

Таким образом, в начале вектора мы получаем коэффициенты матрицы, соответствующие низким частотам, а в конце - высоким.

Шаг 6.

Свертываем вектор с помощью алгоритма группового кодирования. При этом получаем пары типа (пропустить, число), где "пропустить" является счетчиком пропускаемых нулей, а "число" - значение, которое необходимо поставить в следующую ячейку. Так, вектор 42 3 0 0 0 -2 0 0 0 0 1 ... будет свернут в пары (0,42) (0,3) (3,-2) (4,1) ....

Шаг 7.

Свертываем получившиеся пары кодированием по Хаффману с фиксированной таблицей.

Процесс восстановления изображения в этом алгоритме полностью симметричен. Метод позволяет сжимать некоторые изображения в 10-15 раз без серьезных потерь. (рис. 6.2)

Конвейер операций, используемый в алгоритме JPEG

Рис. 6.2. Конвейер операций, используемый в алгоритме JPEG

Существенными положительными сторонами алгоритма является то, что:

  1. Задается степень сжатия.
  2. Выходное цветное изображение может иметь 24 бита на точку.

Отрицательными сторонами алгоритма является то, что:

  1. При повышении степени сжатия изображение распадается на отдельные квадраты (8x8). Это связано с тем, что происходят большие потери в низких частотах при квантовании, и восстановить исходные данные становится невозможно.
  2. Проявляется эффект Гиббса - ореолы по границам резких переходов цветов

Как уже говорилось, стандартизован JPEG относительно недавно - в 1991 году. Но уже тогда существовали алгоритмы, сжимающие сильнее при меньших потерях качества. Дело в том, что действия разработчиков стандарта были ограничены мощностью существовавшей на тот момент техники. То есть даже на персональном компьютере алгоритм должен был работать меньше минуты на среднем изображении, а его аппаратная реализация должна быть относительно простой и дешевой. Алгоритм должен был быть симметричным (время разархивации примерно равно времени архивации).

Выполнение последнего требования сделало возможным появление таких устройств, как цифровые фотоаппараты, снимающие 24-битовые фотографии на 8-256 Мб флэш карту. Потом эта карта вставляется в разъем на вашем ноутбуке и соответствующая программа позволяет считать изображения. Не правда ли, если бы алгоритм был несимметричен, было бы неприятно долго ждать, пока аппарат "перезарядится" - сожмет изображение.

Не очень приятным свойством JPEG является также то, что нередко горизонтальные и вертикальные полосы на дисплее абсолютно не видны и могут проявиться только при печати в виде муарового узора. Он возникает при наложении наклонного растра печати на горизонтальные и вертикальные полосы изображения. Из-за этих сюрпризов JPEG не рекомендуется активно использовать в полиграфии, задавая высокие коэффициенты матрицы квантования. Однако при архивации изображений, предназначенных для просмотра человеком, он на данный момент незаменим.

Широкое применение JPEG долгое время сдерживалось, пожалуй, лишь тем, что он оперирует 24-битными изображениями. Поэтому для того, чтобы с приемлемым качеством посмотреть картинку на обычном мониторе в 256-цветной палитре, требовалось применение соответствующих алгоритмов и, следовательно, определенное время. В приложениях, ориентированных на придирчивого пользователя, таких, например, как игры, подобные задержки неприемлемы. Кроме того, если имеющиеся у вас изображения, допустим, в 8-битном формате GIF перевести в 24-битный JPEG, а потом обратно в GIF для просмотра, то потеря качества произойдет дважды при обоих преобразованиях. Тем не менее, выигрыш в размерах архивов зачастую настолько велик (в 3-20 раз), а потери качества настолько малы, что хранение изображений в JPEG оказывается очень эффективным.

Несколько слов необходимо сказать о модификациях этого алгоритма. Хотя JPEG и является стандартом ISO, формат его файлов не был зафиксирован. Пользуясь этим, производители создают свои, несовместимые между собой форматы, и, следовательно, могут изменить алгоритм. Так, внутренние таблицы алгоритма, рекомендованные ISO, заменяются ими на свои собственные. Кроме того, легкая неразбериха присутствует при задании степени потерь. Например, при тестировании выясняется, что "отличное" качество, "100%" и "10 баллов" дают существенно различающиеся картинки. При этом, кстати, "100%" качества не означают сжатие без потерь. Встречаются также варианты JPEG для специфических приложений.

Как стандарт ISO JPEG начинает все шире использоваться при обмене изображениями в компьютерных сетях. Поддерживается алгоритм JPEG в форматах Quick Time, PostScript Level 2, Tiff 6.0 и, на данный момент, занимает видное место в системах мультимедиа.

Характеристики алгоритма JPEG:

Степень сжатия: 2-200 (Задается пользователем).

Класс изображений: Полноцветные 24 битные изображения или изображения в градациях серого без резких переходов цветов (фотографии).

Симметричность: 1

Характерные особенности: В некоторых случаях, алгоритм создает "ореол" вокруг резких горизонтальных и вертикальных границ в изображении (эффект Гиббса). Кроме того, при высокой степени сжатия изображение распадается на блоки 8х8 пикселов.

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >