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

Алгоритмы сжатия изображений

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Аннотация: Эта лекция начинается с описания рекурсивного алгоритма, его особенностей и реализации. Оставшаяся часть лекции дает нам исчерпывающую информацию о формате JPEG-2000, о его отличительных особенностях, сферах применения и алгоритме архивации изображения

Рекурсивный (волновой) алгоритм

Английское название рекурсивного сжатия - wavelet. На русский язык оно переводится как волновое сжатие, как сжатие с использованием всплесков, а в последнее время и калькой вэйвлет-сжатие. Этот вид архивации известен довольно давно и напрямую исходит из идеи использования когерентности областей. Ориентирован алгоритм на цветные и черно-белые изображения с плавными переходами. Идеален для картинок типа рентгеновских снимков. Степень сжатия задается и варьируется в пределах 5-100. При попытке задать больший коэффициент на резких границах, особенно проходящих по диагонали, проявляется "лестничный эффект" - ступеньки разной яркости размером в несколько пикселов.

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

Так два числа {\rm{a}}_{{\rm{2i}}} и {\rm{a}}_{{\rm{2i + 1}}} всегда можно представить в виде {\rm{b}}^{\rm{1}} _{\rm{i}} {\rm{ = (a}}_{{\rm{2i}}} {\rm{ + a}}_{{\rm{2i}}} _{{\rm{ + 1}}} {\rm{)/2}}
и {\rm{b}}^{\rm{2}} _{\rm{i}} {\rm{ = (a}}_{{\rm{2i}}} {\rm{ - a}}_{{\rm{2i + 1}}} {\rm{)/2}}
. Аналогично последовательность {\rm{a}}_{\rm{i}} может быть попарно переведена в последовательность {\rm{b}}^{{\rm{1}}{\rm{,2}}} _{\rm{i}} .

Разберем конкретный пример: пусть мы сжимаем строку из 8 значений яркости пикселов ( {\rm{a}}_{\rm{i}} ): (220, 211, 212, 218, 217, 214, 210, 202). Мы получим следующие последовательности {\rm{b}}^{\rm{1}} _{\rm{i}}, и {\rm{b}}^{\rm{2}} _{\rm{i}} : (215.5, 215, 215.5, 206) и (4.5, -3, 1.5, 4). Заметим, что значения {\rm{b}}^{\rm{2}} _{\rm{i}} достаточно близки к 0. Повторим операцию, рассматривая {\rm{b}}^{\rm{1}} _{\rm{i}} как {\rm{a}}_{\rm{i}}. Данное действие выполняется как бы рекурсивно, откуда и название алгоритма. Мы получим из (215.5, 215, 215.5, 206): (215.25, 210.75) (0.25, 4.75). Полученные коэффициенты, округлив до целых и сжав, например, с помощью алгоритма Хаффмана с фиксированными таблицами, мы можем поместить в файл.

Заметим, что мы применяли наше преобразование к цепочке только два раза. Реально мы можем позволить себе применение wavelet - преобразования 4-6 раз. Более того, дополнительное сжатие можно получить, используя таблицы алгоритма Хаффмана с неравномерным шагом (т.е. нам придется сохранять код Хаффмана для ближайшего в таблице значения). Эти приемы позволяют достичь заметных степеней сжатия.

Упражнение: Мы восстановили из файла цепочку (215, 211) (0, 5) (5, -3, 2, 4) (см. пример). Постройте строку из восьми значений яркости пикселов, которую воссоздаст алгоритм волнового сжатия.

Алгоритм для двумерных данных реализуется аналогично. Если у нас есть квадрат из 4 точек с яркостями {\rm{a}}_{{\rm{2i}}{\rm{,2j}}} {\rm{, a}}_{{\rm{2i + 1}}{\rm{, 2j}}} {\rm{, a}}_{{\rm{2i}}{\rm{, 2j + 1}}} {\rm{, и a}}_{{\rm{2i + 1}}{\rm{, 2j + 1}}} , то

& b_{i,j}^1  = (a_{2i,2j}  + a_{2i + 1,2j}  + a_{2i,2j + 1}  + a_{2i + 1,2j + 1} )/4 \\
  & b_{i,j}^2  = (a_{2i,2j}  + a_{2i + 1,2j}  - a_{2i,2j + 1}  - a_{2i + 1,2j + 1} )/4  \\
  & b_{i,j}^3  = (a_{2i,2j}  - a_{2i + 1,2j}  + a_{2i,2j + 1}  - a_{2i + 1,2j + 1} )/4  \\
  & b_{i,j}^4  = (a_{2i,2j}  - a_{2i + 1,2j}  - a_{2i,2j + 1}  + a_{2i + 1,2j + 1} )/4

(см. рис. 7.1)


Рис. 7.1.

Используя эти формулы, мы для изображения 512х512 пикселов получим после первого преобразования 4 матрицы размером 256х256 элементов: (рис. 7.2)


Рис. 7.2.

В первой, как легко догадаться, будет храниться уменьшенная копия изображения. Во второй - усредненные разности пар значений пикселов по горизонтали. В третьей - усредненные разности пар значений пикселов по вертикали. В четвертой - усредненные разности значений пикселов по диагонали. По аналогии с двумерным случаем мы можем повторить наше преобразование и получить вместо первой матрицы 4 матрицы размером 128х128. Повторив наше преобразование в третий раз, мы получим в итоге: 4 матрицы 64х64, 3 матрицы 128х128 и 3 матрицы 256х256. На практике при записи в файл, значениями, получаемыми в последней строке b_{i,j}^4, обычно пренебрегают (сразу получая выигрыш примерно на треть размера файла - 1- 1/4 - 1/16 - 1/64...).

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

В отличие от JPEG и фрактального алгоритма данный метод не оперирует блоками, например, 8х8 пикселов. Точнее, мы оперируем блоками 2х2, 4х4, 8х8 и т.д. Однако за счет того, что коэффициенты для этих блоков мы сохраняем независимо, мы можем достаточно легко избежать дробления изображения на "мозаичные" квадраты.

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

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

Класс изображений: Как у фрактального и JPEG.

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

Характерные особенности: Кроме того, при высокой степени сжатия изображение распадается на отдельные блоки.

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