Методы сжатия изображений

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

Разбить на страницы
Показывать лекцию целиком

Первыми для архивации изображений стали применяться привычные алгоритмы. Те, что использовались и используются в системах резервного копирования, при создании дистрибутивов и т.п. Эти алгоритмы архивировали информацию без изменений. Однако основной тенденцией в последнее время стало использование новых классов изображений. Старые алгоритмы перестали удовлетворять требованиям, предъявляемым к архивации. Многие изображения практически не сжимались, хотя "на взгляд" обладали явной избыточностью. Это привело к созданию нового типа алгоритмов - сжимающих с потерей информации. Как правило, степень сжатия и, следовательно, степень потерь качества в них можно задавать. При этом достигается компромисс между размером и качеством изображений.

Одна из серьезных проблем машинной графики заключается в том, что до сих пор не найден адекватный критерий оценки потерь качества изображения. А теряется оно постоянно - при оцифровке, при переводе в ограниченную палитру цветов, при переводе в другую систему цветопредставления для печати, и, что для нас особенно важно, при архивации с потерями. Можно привести пример простого критерия: среднеквадратичное отклонение значений пикселов ( $${\rm{l}}_{\rm{2}}$$ мера, или root mean square - RMS ):

$$d(x,y) = \sqrt {{{\sum\limits_{i = 1,j = 1}^{n,n} {\left( {x_{ij} - y_{ij} } \right)^2 } } \over {n^2 }}} $$

По нему изображение будет сильно испорчено при понижении яркости всего на 5% (глаз этого не заметит - у разных мониторов настройка яркости варьируется гораздо сильнее). В то же время изображения со "снегом" - резким изменением цвета отдельных точек, слабыми полосами или "муаром" будут признаны "почти не изменившимися" (Объясните, почему?). Свои неприятные стороны есть и у других критериев.

Рассмотрим, например, максимальное отклонение:

$$d(x,y) = \mathop {\max }\limits_{i,j} \left| {x_{ij} - y_{ij} } \right|$$

Эта мера, как можно догадаться, крайне чувствительна к биению отдельных пикселов. Т.е. во всем изображении может существенно измениться только значение одного пиксела (что практически незаметно для глаза), однако согласно этой мере изображение будет сильно испорчено.

Мера, которую сейчас используют на практике, называется мерой отношения сигнала к шуму ( peak-to-peak signal-to-noise ratio - PSNR ).

$$d(x,y) = 10 \cdot \log _{10} {{255^2 \cdot n^2 } \over {\sum\limits_{i = 1,j = 1}^{n,n} {\left( {x_{ij} - y_{ij} } \right)^2 } }}$$

Данная мера, по сути, аналогична среднеквадратичному отклонению, однако пользоваться ей несколько удобнее за счет логарифмического масштаба шкалы. Ей присущи те же недостатки, что и среднеквадратичному отклонению.

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

Алгоритм JPEG

JPEG - один из самых новых и достаточно мощных алгоритмов. Практически он является стандартом де-факто для полноцветных изображений [6.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 можно представить с помощью матрицы перехода:

$$\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)

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

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

  • Задается степень сжатия.
  • Выходное цветное изображение может иметь 24 бита на точку.
  • Отрицательными сторонами алгоритма является то, что:

  • При повышении степени сжатия изображение распадается на отдельные квадраты (8x8). Это связано с тем, что происходят большие потери в низких частотах при квантовании, и восстановить исходные данные становится невозможно.
  • Проявляется эффект Гиббса - ореолы по границам резких переходов цветов
  • Как уже говорилось, стандартизован 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 пикселов.

    Фрактальный алгоритм

    Идея метода

    Фрактальная архивация основана на том, что мы представляем изображение в более компактной форме - с помощью коэффициентов системы итерируемых функций ( Iterated Function System - далее по тексту как IFS ). Прежде, чем рассматривать сам процесс архивации, разберем, как IFS строит изображение, т.е. процесс декомпрессии.

    Строго говоря, IFS представляет собой набор трехмерных аффинных преобразований, в нашем случае переводящих одно изображение в другое. Преобразованию подвергаются точки в трехмерном пространстве (х_координата, у_координата, яркость).

    Наиболее наглядно этот процесс продемонстрировал Барнсли в своей книге " Fractal Image Compression ". Там введено понятие Фотокопировальной Машины, состоящей из экрана, на котором изображена исходная картинка, и системы линз, проецирующих изображение на другой экран: (рис. 6.3)

  • Линзы могут проецировать часть изображения произвольной формы в любое другое место нового изображения.
  • Области, в которые проецируются изображения, не пересекаются.
  • Линза может менять яркость и уменьшать контрастность.
  • Линза может зеркально отражать и поворачивать свой фрагмент изображения.
  • Линза должна масштабировать (причем только уменьшая) свой фрагмент изображения.
  • (рис 6.3) Машина Барнсли

    Расставляя линзы и меняя их характеристики, мы можем управлять получаемым изображением. Одна итерация работы Машины заключается в том, что по исходному изображению с помощью проектирования строится новое, после чего новое берется в качестве исходного. Утверждается, что в процессе итераций мы получим изображение, которое перестанет изменяться. Оно будет зависеть только от расположения и характеристик линз, и не будет зависеть от исходной картинки. Это изображение называется "неподвижной точкой" или аттрактором данной IFS. Соответствующая теория гарантирует наличие ровно одной неподвижной точки для каждой IFS.

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

    Наиболее известны два изображения, полученных с помощью IFS: "треугольник Серпинского" (рис. 6.4) и "папоротник Барнсли" рис. 6.5.

    (рис 6.4) Треугольник Серпинского. Задается 3 преобразованиями

    "Треугольник Серпинского" задается тремя, а "папоротник Барнсли" четырьмя аффинными преобразованиями (или, в нашей терминологии, "линзами"). Каждое преобразование кодируется буквально считанными байтами, в то время как изображение, построенное с их помощью, может занимать и несколько мегабайт.

    (рис 6.5) Папоротник Барнсли. Задается 4 преобразованиямиУпражнение: Укажите в изображении 4 области, объединение которых покрывало бы все изображение, и каждая из которых была бы подобна всему изображению (не забывайте о стебле папоротника).

    Из вышесказанного становится понятно, как работает архиватор, и почему ему требуется так много времени. Фактически, фрактальная компрессия - это поиск самоподобных областей в изображении и определение для них параметров аффинных преобразований (рис. 6.6).

    (рис 6.6)

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

    Далее приводятся основные определения и теоремы, на которых базируется фрактальная компрессия. Этот материал более детально и с доказательствами рассматривается в [6.3] и в [6.4].

    Определение. Преобразование $$w:R^2 \to R^2$$, представимое в виде

    $$w(\bar \rangle ) = w \left( \begin{array}{c} x \\ y \\ \end{array} \right) = \left( \begin{array}{cc} a b \\ c b \\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ \end{array} \right) $$

    где a, b, c, d, e, f действительные числа и $$\left( {\matrix{ x y \cr } } \right) \in R^2 $$ называется двумерным аффинным преобразованием.

    Определение. Преобразование , представимое в виде

    $$w(\bar \rangle ) = w \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) = \left( \begin{array}{ccc} a b t\\ c d u\\ r s p\\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ q \\ \end{array} \right) $$

    где a, b, c, d, e, f, p, q, r, s, t, u действительные числа и $$\left( {\matrix{ x y z \cr } } \right) \in R^3 $$ называется трехмерным аффинным преобразованием.

    Определение. Пусть $$f:{\rm X} \to {\rm X} $$ - преобразование в пространстве Х. Точка $$x_f \in {\rm X} $$ такая, что $$f(x_f ) = x_f $$ называется неподвижной точкой (аттрактором) преобразования.

    Определение. Преобразование $$f:{\rm X} \to {\rm X}$$ в метрическом пространстве (Х, d) называется сжимающим, если существует число s: $$0 \le s < 1 $$, такое, что

    $$d(f(x),f(y)) \le s \cdot d(x,y)\matrix{ {} {\forall \matrix{ {x,y \in {\rm X}} {} \cr } } \cr } $$

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

    Теорема. (О сжимающем преобразовании)

    Пусть $$f:{\rm X} \to {\rm X} $$ - сжимающее преобразование в полном метрическом пространстве (Х, d). Тогда существует в точности одна неподвижная точка $$x_f \in {\rm X}$$ этого преобразования, и для любой точки $$x \in {\rm X}$$ последовательность $$\left\{ {\left. {f^n (x)\matrix{ : {n = } \cr } \matrix{ {0,1,2...} {} \cr } } \right\}} \right$$. сходится к $$x_f $$.

    Более общая формулировка этой теоремы гарантирует нам сходимость.

    Определение. Изображением называется функция S, определенная на единичном квадрате и принимающая значения от 0 до 1 или $$S(x,y) \in \left[ {0...1} \right]\matrix{ {} {\forall x,y} \cr } \in \left[ {0...1} \right] $$

    Пусть трехмерное аффинное преобразование $$w_i :R^3 \to R^3$$, записано в виде

    $$w_i(\bar \rangle ) = w_i \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) = \left( \begin{array}{ccc} a b 0\\ c d 0\\ 0 0 p\\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ q \\ \end{array} \right) $$

    и определено на компактном подмножестве $$D_i$$ декартова квадрата [0..1]x[0..1] (мы пользуемся особым видом матрицы преобразования, чтобы уменьшить размерность области определения с $$R^3$$ до $$R^2$$ ). Тогда оно переведет часть поверхности S в область $$R_i,$$ расположенную со сдвигом (e,f) и поворотом, заданным матрицей

    $$\left( \begin{array}{ccc} a b 0\\ c d 0\\ 0 0 0\\ \end{array} \right) .$$

    При этом, если интерпретировать значения функции $$S(x,y) \in \left[ {0...1} \right] $$ как яркость соответствующих точек, она уменьшится в p раз (преобразование обязано быть сжимающим) и изменится на сдвиг q.

    Определение. Конечная совокупность W сжимающих трехмерных аффинных преобразований $$w_i$$, определенных на областях $$D_i$$, таких, что $$w_i (D_i ) = R_i$$ и $$R_i \cap R_j = \matrix{ {\not o} {\forall i \ne j} \cr } $$, называется системой итерируемых функций (IFS).

    Системе итерируемых функций однозначно сопоставляется неподвижная точка - изображение. Таким образом, процесс компрессии заключается в поиске коэффициентов системы, а процесс декомпрессии - в проведении итераций системы до стабилизации полученного изображения (неподвижной точки IFS). На практике бывает достаточно 7-16 итераций. Области $$R_i$$ в дальнейшем будут именоваться ранговыми, а области $$D_i$$ - доменными.

    Построение алгоритма

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

    В учебном варианте алгоритма рис. 6.7, изложенном далее, сделаны следующие ограничения на области:

  • Все области являются квадратами со сторонами, параллельными сторонам изображения. Это ограничение достаточно жесткое. Фактически мы собираемся аппроксимировать все многообразие геометрических фигур лишь квадратами.
  • При переводе доменной области в ранговую уменьшение размеров производится ровно в два раза. Это существенно упрощает как компрессор, так и декомпрессор, т.к. задача масштабирования небольших областей является нетривиальной.
  • Все доменные блоки - квадраты и имеют фиксированный размер. Изображение равномерной сеткой разбивается на набор доменных блоков.
  • Доменные области берутся "через точку" и по Х, и по Y, что сразу уменьшает перебор в 4 раза.
  • При переводе доменной области в ранговую поворот куба возможен только на 0, 90, 180 градусов или 270 градусов. Также допускается зеркальное отражение. Общее число возможных преобразований (считая пустое) - 8.
  • Масштабирование (сжатие) по вертикали (яркости) осуществляется в фиксированное число раз - в 0,75.
  • (рис 6.7)

    Эти ограничения позволяют:

  • Построить алгоритм, для которого требуется сравнительно малое число операций даже на достаточно больших изображениях.
  • Очень компактно представить данные для записи в файл. Нам требуется на каждое аффинное преобразование в IFS:
  • два числа для того, чтобы задать смещение доменного блока. Если мы ограничим входные изображения размером 512х512, то достаточно будет по 8 бит на каждое число.
  • три бита для того, чтобы задать преобразование симметрии при переводе доменного блока в ранговый.
  • 7-9 бит для того, чтобы задать сдвиг по яркости при переводе.
  • Информацию о размере блоков можно хранить в заголовке файла. Таким образом, мы затратили менее 4 байт на одно аффинное преобразование. В зависимости от того, каков размер блока, можно высчитать, сколько блоков будет в изображении. Таким образом, мы можем получить оценку степени компрессии.

    Например, для файла в градациях серого 256 цветов 512х512 пикселов при размере блока 8 пикселов аффинных преобразований будет 4096 (512/8 512/8). На каждое потребуется 3.5 байта. Следовательно, если исходный файл занимал 262144 (512 512) байт (без учета заголовка), то файл с коэффициентами будет занимать 14336 байт. Степень сжатия - 18 раз. При этом мы не учитываем, что файл с коэффициентами тоже может обладать избыточностью и архивироваться методом архивации без потерь, например LZW.

    Отрицательные стороны предложенных ограничений:

  • Поскольку все области являются квадратами, невозможно воспользоваться подобием объектов, по форме далеких от квадратов (которые встречаются в реальных изображениях достаточно часто.)
  • Аналогично мы не сможем воспользоваться подобием объектов в изображении, коэффициент подобия между которыми сильно отличается от 2.
  • Алгоритм не сможет воспользоваться подобием объектов в изображении, угол между которыми не кратен 900.
  • Такова плата за скорость компрессии и за простоту упаковки коэффициентов в файл.

    Сам алгоритм упаковки сводится к перебору всех доменных блоков и подбору для каждого соответствующего ему рангового блока. Ниже приводится схема этого алгоритма.

    for (all range blocks) {
        min_distance = MaximumDistance;
        Rij = image->CopyBlock(i,j);
        for (all domain blocks) { // С поворотами и отр.
          current=Координаты тек. преобразования;
          D=image->CopyBlock(current);
          current_distance = Rij.L2distance(D);
          if(current_distance < min_distance) {
            // Если коэффициенты best хуже: 
            min_distance = current_distance;
            best = current;
          }
        } // Next range block
        Save_Coefficients_to_file(best);
      } // Next domain block

    Как видно из приведенного алгоритма, для каждого рангового блока делаем его проверку со всеми возможными доменными блоками (в том числе с прошедшими преобразование симметрии), находим вариант с наименьшей мерой $${\rm{l}}_{\rm{2}}$$ (наименьшим среднеквадратичным отклонением) и сохраняем коэффициенты этого преобразования в файл. Коэффициенты - это (1) координаты найденного блока, (2) число от 0 до 7, характеризующее преобразование симметрии (поворот, отражение блока), и (3) сдвиг по яркости для этой пары блоков. Сдвиг по яркости вычисляется как:

    $$q = \left[ {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {d_{ij} } } } \right. - \left. {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {r_{ij} } } } \right]/n^2 $$

    где $$r_{ij}$$ - значения пикселов рангового блока (R), а $$d_{ij}$$ - значения пикселов доменного блока (D). При этом мера считается как:

    $$d(R,D) = \sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {(0.75r_{ij} + q - d_{ij} )^2 } }$$

    Мы не вычисляем квадратного корня из $${\rm{l}}_{\rm{2}}$$ меры и не делим ее на n, поскольку данные преобразования монотонны и не помешают нам найти экстремум, однако мы сможем выполнять на две операции меньше для каждого блока.

    Посчитаем количество операций, необходимых нам для сжатия изображения в градациях серого 256 цветов 512х512 пикселов при размере блока 8 пикселов (табл. 6.1):

    Часть программы Число операций
    for (all domain blocks) 4096 (=512/8 512/8)
    for (all range blocks) + symmetry transformation 492032 (=(512/2-8)* (512/2-8)*8)
    Вычисление q и d(R,D) > 3*64 операций "+"

    > 2*64 операций " "

    Итог: > 3* 128.983.236.608 операций "+"

    > 2* 128.983.236.608 операций " "

    Таким образом, нам удалось уменьшить число операций алгоритма компрессии до вполне вычисляемых (пусть и за несколько часов) величин.

    Схема алгоритма декомпрессии изображений

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

    В качестве начального может быть взято абсолютно любое изображение (например, абсолютно черное), поскольку соответствующий математический аппарат гарантирует нам сходимость последовательности изображений, получаемых в ходе итераций IFS, к неподвижному изображению (близкому к исходному). Обычно для этого достаточно 16 итераций.

    Прочитаем из файла коэффициенты всех блоков;
      Создадим черное изображение нужного размера;
      Until(изображение не станет неподвижным){
        For(every range (R)){
          D=image->CopyBlock(D_coord_for_R);
          For(every pixel(i,j) in the block{
            Rij = 0.75Dij + oR; 
          } //Next pixel
        } //Next block
      }//Until end

    Поскольку мы записывали коэффициенты для блоков $$r_{ij}$$ (которые, как мы оговорили, в нашем частном случае являются квадратами одинакового размера) последовательно, то получается, что мы последовательно заполняем изображение по квадратам сетки разбиения использованием аффинного преобразования.

    Как можно подсчитать, количество операций на один пиксел изображения в градациях серого при восстановлении необычайно мало ( N операций сложения "+" и N операций умножения "*", где N - количество итераций, т.е. 7-16). Благодаря этому, декомпрессия изображений для фрактального алгоритма проходит быстрее декомпрессии, например, для алгоритма JPEG. В простой реализации JPEG на точку приходится 64 операции сложения "+" и 64 операции умножения "*". При реализации быстрого ДКП можно получить, 7 сложений и 5 умножений на точку, но это без учета шагов RLE, квантования и кодирования по Хаффману. При этом для фрактального алгоритма умножение происходит на рациональное число, одно для каждого блока. Это означает, что мы можем, во-первых, использовать целочисленную рациональную арифметику, которая быстрее арифметики с плавающей точкой. Во-вторых, можно использовать умножение вектора на число - более простую и быструю операцию, часто закладываемую в архитектуру процессора (процессоры SGI, Intel MMX, векторные операции Athlon и т.д.). Для полноцветного изображения ситуация качественно не изменяется, поскольку перевод в другое цветовое пространство используют оба алгоритма.

    Оценка потерь и способы их регулирования

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

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

    Характеристики фрактального алгоритма:

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

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

    Симметричность: 100-100000

    Характерные особенности: Может свободно масштабировать изображение при разархивации, увеличивая его в 2-4 раза без появления "лестничного эффекта". При увеличении степени компрессии появляется "блочный" эффект на границах блоков в изображении.

    Страницы:

    Первыми для архивации изображений стали применяться привычные алгоритмы. Те, что использовались и используются в системах резервного копирования, при создании дистрибутивов и т.п. Эти алгоритмы архивировали информацию без изменений. Однако основной тенденцией в последнее время стало использование новых классов изображений. Старые алгоритмы перестали удовлетворять требованиям, предъявляемым к архивации. Многие изображения практически не сжимались, хотя "на взгляд" обладали явной избыточностью. Это привело к созданию нового типа алгоритмов - сжимающих с потерей информации. Как правило, степень сжатия и, следовательно, степень потерь качества в них можно задавать. При этом достигается компромисс между размером и качеством изображений.

    Одна из серьезных проблем машинной графики заключается в том, что до сих пор не найден адекватный критерий оценки потерь качества изображения. А теряется оно постоянно - при оцифровке, при переводе в ограниченную палитру цветов, при переводе в другую систему цветопредставления для печати, и, что для нас особенно важно, при архивации с потерями. Можно привести пример простого критерия: среднеквадратичное отклонение значений пикселов ( $${\rm{l}}_{\rm{2}}$$ мера, или root mean square - RMS ):

    $$d(x,y) = \sqrt {{{\sum\limits_{i = 1,j = 1}^{n,n} {\left( {x_{ij} - y_{ij} } \right)^2 } } \over {n^2 }}} $$

    По нему изображение будет сильно испорчено при понижении яркости всего на 5% (глаз этого не заметит - у разных мониторов настройка яркости варьируется гораздо сильнее). В то же время изображения со "снегом" - резким изменением цвета отдельных точек, слабыми полосами или "муаром" будут признаны "почти не изменившимися" (Объясните, почему?). Свои неприятные стороны есть и у других критериев.

    Рассмотрим, например, максимальное отклонение:

    $$d(x,y) = \mathop {\max }\limits_{i,j} \left| {x_{ij} - y_{ij} } \right|$$

    Эта мера, как можно догадаться, крайне чувствительна к биению отдельных пикселов. Т.е. во всем изображении может существенно измениться только значение одного пиксела (что практически незаметно для глаза), однако согласно этой мере изображение будет сильно испорчено.

    Мера, которую сейчас используют на практике, называется мерой отношения сигнала к шуму ( peak-to-peak signal-to-noise ratio - PSNR ).

    $$d(x,y) = 10 \cdot \log _{10} {{255^2 \cdot n^2 } \over {\sum\limits_{i = 1,j = 1}^{n,n} {\left( {x_{ij} - y_{ij} } \right)^2 } }}$$

    Данная мера, по сути, аналогична среднеквадратичному отклонению, однако пользоваться ей несколько удобнее за счет логарифмического масштаба шкалы. Ей присущи те же недостатки, что и среднеквадратичному отклонению.

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

    Алгоритм JPEG

    JPEG - один из самых новых и достаточно мощных алгоритмов. Практически он является стандартом де-факто для полноцветных изображений [6.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 можно представить с помощью матрицы перехода:

    $$\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)

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

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

  • Задается степень сжатия.
  • Выходное цветное изображение может иметь 24 бита на точку.
  • Отрицательными сторонами алгоритма является то, что:

  • При повышении степени сжатия изображение распадается на отдельные квадраты (8x8). Это связано с тем, что происходят большие потери в низких частотах при квантовании, и восстановить исходные данные становится невозможно.
  • Проявляется эффект Гиббса - ореолы по границам резких переходов цветов
  • Как уже говорилось, стандартизован 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 пикселов.

    Фрактальный алгоритм

    Идея метода

    Фрактальная архивация основана на том, что мы представляем изображение в более компактной форме - с помощью коэффициентов системы итерируемых функций ( Iterated Function System - далее по тексту как IFS ). Прежде, чем рассматривать сам процесс архивации, разберем, как IFS строит изображение, т.е. процесс декомпрессии.

    Строго говоря, IFS представляет собой набор трехмерных аффинных преобразований, в нашем случае переводящих одно изображение в другое. Преобразованию подвергаются точки в трехмерном пространстве (х_координата, у_координата, яркость).

    Наиболее наглядно этот процесс продемонстрировал Барнсли в своей книге " Fractal Image Compression ". Там введено понятие Фотокопировальной Машины, состоящей из экрана, на котором изображена исходная картинка, и системы линз, проецирующих изображение на другой экран: (рис. 6.3)

  • Линзы могут проецировать часть изображения произвольной формы в любое другое место нового изображения.
  • Области, в которые проецируются изображения, не пересекаются.
  • Линза может менять яркость и уменьшать контрастность.
  • Линза может зеркально отражать и поворачивать свой фрагмент изображения.
  • Линза должна масштабировать (причем только уменьшая) свой фрагмент изображения.
  • (рис 6.3) Машина Барнсли

    Расставляя линзы и меняя их характеристики, мы можем управлять получаемым изображением. Одна итерация работы Машины заключается в том, что по исходному изображению с помощью проектирования строится новое, после чего новое берется в качестве исходного. Утверждается, что в процессе итераций мы получим изображение, которое перестанет изменяться. Оно будет зависеть только от расположения и характеристик линз, и не будет зависеть от исходной картинки. Это изображение называется "неподвижной точкой" или аттрактором данной IFS. Соответствующая теория гарантирует наличие ровно одной неподвижной точки для каждой IFS.

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

    Наиболее известны два изображения, полученных с помощью IFS: "треугольник Серпинского" (рис. 6.4) и "папоротник Барнсли" рис. 6.5.

    (рис 6.4) Треугольник Серпинского. Задается 3 преобразованиями

    "Треугольник Серпинского" задается тремя, а "папоротник Барнсли" четырьмя аффинными преобразованиями (или, в нашей терминологии, "линзами"). Каждое преобразование кодируется буквально считанными байтами, в то время как изображение, построенное с их помощью, может занимать и несколько мегабайт.

    (рис 6.5) Папоротник Барнсли. Задается 4 преобразованиямиУпражнение: Укажите в изображении 4 области, объединение которых покрывало бы все изображение, и каждая из которых была бы подобна всему изображению (не забывайте о стебле папоротника).

    Из вышесказанного становится понятно, как работает архиватор, и почему ему требуется так много времени. Фактически, фрактальная компрессия - это поиск самоподобных областей в изображении и определение для них параметров аффинных преобразований (рис. 6.6).

    (рис 6.6)

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

    Далее приводятся основные определения и теоремы, на которых базируется фрактальная компрессия. Этот материал более детально и с доказательствами рассматривается в [6.3] и в [6.4].

    Определение. Преобразование $$w:R^2 \to R^2$$, представимое в виде

    $$w(\bar \rangle ) = w \left( \begin{array}{c} x \\ y \\ \end{array} \right) = \left( \begin{array}{cc} a b \\ c b \\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ \end{array} \right) $$

    где a, b, c, d, e, f действительные числа и $$\left( {\matrix{ x y \cr } } \right) \in R^2 $$ называется двумерным аффинным преобразованием.

    Определение. Преобразование , представимое в виде

    $$w(\bar \rangle ) = w \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) = \left( \begin{array}{ccc} a b t\\ c d u\\ r s p\\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ q \\ \end{array} \right) $$

    где a, b, c, d, e, f, p, q, r, s, t, u действительные числа и $$\left( {\matrix{ x y z \cr } } \right) \in R^3 $$ называется трехмерным аффинным преобразованием.

    Определение. Пусть $$f:{\rm X} \to {\rm X} $$ - преобразование в пространстве Х. Точка $$x_f \in {\rm X} $$ такая, что $$f(x_f ) = x_f $$ называется неподвижной точкой (аттрактором) преобразования.

    Определение. Преобразование $$f:{\rm X} \to {\rm X}$$ в метрическом пространстве (Х, d) называется сжимающим, если существует число s: $$0 \le s < 1 $$, такое, что

    $$d(f(x),f(y)) \le s \cdot d(x,y)\matrix{ {} {\forall \matrix{ {x,y \in {\rm X}} {} \cr } } \cr } $$

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

    Теорема. (О сжимающем преобразовании)

    Пусть $$f:{\rm X} \to {\rm X} $$ - сжимающее преобразование в полном метрическом пространстве (Х, d). Тогда существует в точности одна неподвижная точка $$x_f \in {\rm X}$$ этого преобразования, и для любой точки $$x \in {\rm X}$$ последовательность $$\left\{ {\left. {f^n (x)\matrix{ : {n = } \cr } \matrix{ {0,1,2...} {} \cr } } \right\}} \right$$. сходится к $$x_f $$.

    Более общая формулировка этой теоремы гарантирует нам сходимость.

    Определение. Изображением называется функция S, определенная на единичном квадрате и принимающая значения от 0 до 1 или $$S(x,y) \in \left[ {0...1} \right]\matrix{ {} {\forall x,y} \cr } \in \left[ {0...1} \right] $$

    Пусть трехмерное аффинное преобразование $$w_i :R^3 \to R^3$$, записано в виде

    $$w_i(\bar \rangle ) = w_i \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) = \left( \begin{array}{ccc} a b 0\\ c d 0\\ 0 0 p\\ \end{array} \right) \left( \begin{array}{c} x \\ y \\ z \\ \end{array} \right) + \left( \begin{array}{c} e \\ f \\ q \\ \end{array} \right) $$

    и определено на компактном подмножестве $$D_i$$ декартова квадрата [0..1]x[0..1] (мы пользуемся особым видом матрицы преобразования, чтобы уменьшить размерность области определения с $$R^3$$ до $$R^2$$ ). Тогда оно переведет часть поверхности S в область $$R_i,$$ расположенную со сдвигом (e,f) и поворотом, заданным матрицей

    $$\left( \begin{array}{ccc} a b 0\\ c d 0\\ 0 0 0\\ \end{array} \right) .$$

    При этом, если интерпретировать значения функции $$S(x,y) \in \left[ {0...1} \right] $$ как яркость соответствующих точек, она уменьшится в p раз (преобразование обязано быть сжимающим) и изменится на сдвиг q.

    Определение. Конечная совокупность W сжимающих трехмерных аффинных преобразований $$w_i$$, определенных на областях $$D_i$$, таких, что $$w_i (D_i ) = R_i$$ и $$R_i \cap R_j = \matrix{ {\not o} {\forall i \ne j} \cr } $$, называется системой итерируемых функций (IFS).

    Системе итерируемых функций однозначно сопоставляется неподвижная точка - изображение. Таким образом, процесс компрессии заключается в поиске коэффициентов системы, а процесс декомпрессии - в проведении итераций системы до стабилизации полученного изображения (неподвижной точки IFS). На практике бывает достаточно 7-16 итераций. Области $$R_i$$ в дальнейшем будут именоваться ранговыми, а области $$D_i$$ - доменными.

    Построение алгоритма

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

    В учебном варианте алгоритма рис. 6.7, изложенном далее, сделаны следующие ограничения на области:

  • Все области являются квадратами со сторонами, параллельными сторонам изображения. Это ограничение достаточно жесткое. Фактически мы собираемся аппроксимировать все многообразие геометрических фигур лишь квадратами.
  • При переводе доменной области в ранговую уменьшение размеров производится ровно в два раза. Это существенно упрощает как компрессор, так и декомпрессор, т.к. задача масштабирования небольших областей является нетривиальной.
  • Все доменные блоки - квадраты и имеют фиксированный размер. Изображение равномерной сеткой разбивается на набор доменных блоков.
  • Доменные области берутся "через точку" и по Х, и по Y, что сразу уменьшает перебор в 4 раза.
  • При переводе доменной области в ранговую поворот куба возможен только на 0, 90, 180 градусов или 270 градусов. Также допускается зеркальное отражение. Общее число возможных преобразований (считая пустое) - 8.
  • Масштабирование (сжатие) по вертикали (яркости) осуществляется в фиксированное число раз - в 0,75.
  • (рис 6.7)

    Эти ограничения позволяют:

  • Построить алгоритм, для которого требуется сравнительно малое число операций даже на достаточно больших изображениях.
  • Очень компактно представить данные для записи в файл. Нам требуется на каждое аффинное преобразование в IFS:
  • два числа для того, чтобы задать смещение доменного блока. Если мы ограничим входные изображения размером 512х512, то достаточно будет по 8 бит на каждое число.
  • три бита для того, чтобы задать преобразование симметрии при переводе доменного блока в ранговый.
  • 7-9 бит для того, чтобы задать сдвиг по яркости при переводе.
  • Информацию о размере блоков можно хранить в заголовке файла. Таким образом, мы затратили менее 4 байт на одно аффинное преобразование. В зависимости от того, каков размер блока, можно высчитать, сколько блоков будет в изображении. Таким образом, мы можем получить оценку степени компрессии.

    Например, для файла в градациях серого 256 цветов 512х512 пикселов при размере блока 8 пикселов аффинных преобразований будет 4096 (512/8 512/8). На каждое потребуется 3.5 байта. Следовательно, если исходный файл занимал 262144 (512 512) байт (без учета заголовка), то файл с коэффициентами будет занимать 14336 байт. Степень сжатия - 18 раз. При этом мы не учитываем, что файл с коэффициентами тоже может обладать избыточностью и архивироваться методом архивации без потерь, например LZW.

    Отрицательные стороны предложенных ограничений:

  • Поскольку все области являются квадратами, невозможно воспользоваться подобием объектов, по форме далеких от квадратов (которые встречаются в реальных изображениях достаточно часто.)
  • Аналогично мы не сможем воспользоваться подобием объектов в изображении, коэффициент подобия между которыми сильно отличается от 2.
  • Алгоритм не сможет воспользоваться подобием объектов в изображении, угол между которыми не кратен 900.
  • Такова плата за скорость компрессии и за простоту упаковки коэффициентов в файл.

    Сам алгоритм упаковки сводится к перебору всех доменных блоков и подбору для каждого соответствующего ему рангового блока. Ниже приводится схема этого алгоритма.

    for (all range blocks) {
        min_distance = MaximumDistance;
        Rij = image->CopyBlock(i,j);
        for (all domain blocks) { // С поворотами и отр.
          current=Координаты тек. преобразования;
          D=image->CopyBlock(current);
          current_distance = Rij.L2distance(D);
          if(current_distance < min_distance) {
            // Если коэффициенты best хуже: 
            min_distance = current_distance;
            best = current;
          }
        } // Next range block
        Save_Coefficients_to_file(best);
      } // Next domain block

    Как видно из приведенного алгоритма, для каждого рангового блока делаем его проверку со всеми возможными доменными блоками (в том числе с прошедшими преобразование симметрии), находим вариант с наименьшей мерой $${\rm{l}}_{\rm{2}}$$ (наименьшим среднеквадратичным отклонением) и сохраняем коэффициенты этого преобразования в файл. Коэффициенты - это (1) координаты найденного блока, (2) число от 0 до 7, характеризующее преобразование симметрии (поворот, отражение блока), и (3) сдвиг по яркости для этой пары блоков. Сдвиг по яркости вычисляется как:

    $$q = \left[ {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {d_{ij} } } } \right. - \left. {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {r_{ij} } } } \right]/n^2 $$

    где $$r_{ij}$$ - значения пикселов рангового блока (R), а $$d_{ij}$$ - значения пикселов доменного блока (D). При этом мера считается как:

    $$d(R,D) = \sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {(0.75r_{ij} + q - d_{ij} )^2 } }$$

    Мы не вычисляем квадратного корня из $${\rm{l}}_{\rm{2}}$$ меры и не делим ее на n, поскольку данные преобразования монотонны и не помешают нам найти экстремум, однако мы сможем выполнять на две операции меньше для каждого блока.

    Посчитаем количество операций, необходимых нам для сжатия изображения в градациях серого 256 цветов 512х512 пикселов при размере блока 8 пикселов (табл. 6.1):

    Часть программы Число операций
    for (all domain blocks) 4096 (=512/8 512/8)
    for (all range blocks) + symmetry transformation 492032 (=(512/2-8)* (512/2-8)*8)
    Вычисление q и d(R,D) > 3*64 операций "+"

    > 2*64 операций " "

    Итог: > 3* 128.983.236.608 операций "+"

    > 2* 128.983.236.608 операций " "

    Таким образом, нам удалось уменьшить число операций алгоритма компрессии до вполне вычисляемых (пусть и за несколько часов) величин.

    Схема алгоритма декомпрессии изображений

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

    В качестве начального может быть взято абсолютно любое изображение (например, абсолютно черное), поскольку соответствующий математический аппарат гарантирует нам сходимость последовательности изображений, получаемых в ходе итераций IFS, к неподвижному изображению (близкому к исходному). Обычно для этого достаточно 16 итераций.

    Прочитаем из файла коэффициенты всех блоков;
      Создадим черное изображение нужного размера;
      Until(изображение не станет неподвижным){
        For(every range (R)){
          D=image->CopyBlock(D_coord_for_R);
          For(every pixel(i,j) in the block{
            Rij = 0.75Dij + oR; 
          } //Next pixel
        } //Next block
      }//Until end

    Поскольку мы записывали коэффициенты для блоков $$r_{ij}$$ (которые, как мы оговорили, в нашем частном случае являются квадратами одинакового размера) последовательно, то получается, что мы последовательно заполняем изображение по квадратам сетки разбиения использованием аффинного преобразования.

    Как можно подсчитать, количество операций на один пиксел изображения в градациях серого при восстановлении необычайно мало ( N операций сложения "+" и N операций умножения "*", где N - количество итераций, т.е. 7-16). Благодаря этому, декомпрессия изображений для фрактального алгоритма проходит быстрее декомпрессии, например, для алгоритма JPEG. В простой реализации JPEG на точку приходится 64 операции сложения "+" и 64 операции умножения "*". При реализации быстрого ДКП можно получить, 7 сложений и 5 умножений на точку, но это без учета шагов RLE, квантования и кодирования по Хаффману. При этом для фрактального алгоритма умножение происходит на рациональное число, одно для каждого блока. Это означает, что мы можем, во-первых, использовать целочисленную рациональную арифметику, которая быстрее арифметики с плавающей точкой. Во-вторых, можно использовать умножение вектора на число - более простую и быструю операцию, часто закладываемую в архитектуру процессора (процессоры SGI, Intel MMX, векторные операции Athlon и т.д.). Для полноцветного изображения ситуация качественно не изменяется, поскольку перевод в другое цветовое пространство используют оба алгоритма.

    Оценка потерь и способы их регулирования

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

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

    Характеристики фрактального алгоритма:

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

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

    Симметричность: 100-100000

    Характерные особенности: Может свободно масштабировать изображение при разархивации, увеличивая его в 2-4 раза без появления "лестничного эффекта". При увеличении степени компрессии появляется "блочный" эффект на границах блоков в изображении.

    Вернуться к учебному плану