Идея метода
Фрактальное сжатие основано на том, что мы представляем изображение в более компактной форме - с помощью коэффициентов системы итерируемых функций (Iterated Function System - далее по тексту как IFS). Прежде чем рассматривать сам процесс архивации, разберем, как IFS строит изображение, т. е. процесс декомпрессии.
Строго говоря, IFS представляет собой набор трехмерных аффинных преобразований, в нашем случае переводящих одно изображение в другое. Преобразованию подвергаются точки в трехмерном пространстве ^координата, у_координата, яркость).
Наиболее наглядно этот процесс продемонстрировал М. F. Barnsley в книге . Там введено понятие "фотокопировальной машины", состоящей из экрана, на котором изображена исходная картинка, и системы линз, проецирующих изображение на другой экран (рис. 2.2):
■ линзы могут проецировать часть изображения произвольной формы
в
любое другое место нового изображения;
■ области, в которые
проецируются изображения, не пересекаются;
линза может менять яркость и уменьшать контрастность;
■ линза может зеркально отражать и поворачивать свой фрагмент изображения;
■ линза должна масштабировать (причем только уменьшая) свой фрагмент изображения.
Исходное
/ изображение
Получаемое изображение
Рис. 2.2. Машина Барнсли
Расставляя линзы и меняя их характеристики, мы можем управлять получаемым изображением. Одна итерация работы машины заключается в том, что по исходному изображению с помощью проектирования строится новое, после чего новое берется в качестве исходного. Утверждается, что в процессе итераций мы получим изображение, которое перестанет изменяться. Оно будет зависеть только от расположения и характеристик линз и не будет зависеть от исходной картинки. Это изображение называется неподвижной точкой или аттрактором данной IFS. Соответствующая теория гарантирует наличие ровно одной неподвижной точки для каждой IFS.
Поскольку отображение линз является сжимающим, каждая линза в явном виде задает самоподобные области в нашем изображении. Благодаря самоподобию мы получаем сложную структуру изображения при любом увеличении. Таким образом, интуитивно понятно, что система итерируемых функций задает фрактал (нестрого - самоподобный математический объект).
Наиболее известны два изображения, полученные с помощью IFS: треугольник Серпинского (рис. 2.3) и папоротник Барнсли (рис. 2.4).
Треугольник Серпинского задается тремя, а папоротник Барнсли - четырьмя аффинными преобразованиями (или, в нашей терминологии, "линзами"). Каждое преобразование кодируется буквально считанными байтами, в то время как изображение, построенное с их помощью, может занимать и несколько мегабайт.
Рис. 2.3. Треугольник Серпинского Рис 2.4. Папоротник Барнсли
Упражнение. Укажите в изображении 4 области, объединение которых покрывало бы все изображение и каждая из которых была бы подобна всему изображению (не забывайте о стебле папоротника).
Из вышесказанного становится понятно, как работает архиватор и почему ему требуется так много времени. Фактически фрактальная компрессия -это поиск самоподобных областей в изображении и определение для них параметров аффинных преобразовании (рис. 2.5).
Рис. 2.5. Самоподобные области изображения
В худшем случае, если не будет применяться оптимизирующий алгоритм, потребуется перебор и сравнение всех возможных фрагментов изображения разного размера. Даже для небольших изображений при учете дискретности мы получим астрономическое число перебираемых вариантов. Причем даже резкое сужение классов преобразований, например за счет
масштабирования только в определенное количество раз, не дает заметного выигрыша во времени. Кроме того, при этом теряется качество изображения. Подавляющее большинство исследований в области фрактальной компрессии сейчас направлены на уменьшение времени архивации, необходимого для получения качественного изображения.
Определение. Преобразование w: R 1 -> Л 2 , представимое в виде где а, Ъ, с, d, e,f- действительные числа и (х у)еЯ г - называется двумерным аффинным преобразованием.
Определение. Преобразование w : Л 3 -» Д 3 , представимое в виде
w(x) = w
где a, b, c, d, e,f,p, q, r, s,t,u- действительные числа и (дс у z)eR 3 , называется трехмерным аффинным преобразованием.
Определение. Пусть /:Х->Х - преобразование в пространстве X.
Точка x f eX, такая, что f(x f) = x f , называется неподвижной точкой (аттрактором) преобразования.
Определение. Преобразование /:Х->Х в метрическом пространстве
(X, d) называется сжимающим, если существует число S: 0 £ s < 1, такое, что
d(f(x),f(y))
Замечание. Формально мы можем использовать любое сжимающее отображение при фрактальной компрессии, но реально используются лишь трехмерные аффинные преобразования с достаточно сильными ограничениями на коэффициенты.
Теорема. (О сжимающем преобразовании.) Пусть f: X -> X - сжимающее преобразование в полном метрическом пространстве (X, d). Тогда существует в точности одна неподвижная точка x f e X этого преобразования и для любой точки хеХ последовательность \f"(x):n = 0,1,2...} сходится к x f .
Более общая формулировка этой теоремы гарантирует нам сходимость.
Определение. Изображением называется функция S, определенная на единичном квадрате и принимающая значения от 0 до 1 или S(xo0eVx.>e.
Пусть трехмерное аффинное преобразование w,: R 3 -> R 3 , записано в виде Y и определено на компактном подмножестве £>. декартова квадрата
х (мы пользуемся особым видом матрицы преобразования, чтобы уменьшить размерность области определения с R 3 до R 2). Тогда оно переведет часть поверхности S в область Л, расположенную со сдвигом (ej) и поворотом, заданным матрицей r. При этом, если интерпретировать значения функции 5(л:,^)е как
яркость соответствующих точек, она уменьшится в р раз (преобразование обязано быть сжимающим) и изменится на сдвиг q.
Определение. Конечная совокупность W сжимающих трехмерных аффинных преобразований W t , определенных на областях D t , таких, что w,(Ј>,) = R, и J?,. r\Rj=
V/ * j , называется системой итерируемых функций (IFS).
Системе итерируемых функций однозначно ставятся в соответствие неподвижная точка- изображение. Таким образом, процесс компрессии заключается в поиске коэффициентов системы, а процесс декомпрессии - в проведении итераций системы до стабилизации полученного изображения (неподвижной точки IFS). На практике бывает достаточно 7-16 итераций. Области R i в дальнейшем будут именоваться ранговыми, а области D, -доменными (рис. 2.6).
Построение алгоритма
Как уже стало очевидным из изложенного выше, основной задачей при компрессии фрактальным алгоритмом является нахождение соответствующих аффинных преобразований. В самом общем случае мы можем переводить любые по размеру и форме области изображения, однако в этом случае получается астрономическое число перебираемых вариантов разных фрагментов, которое невозможно обработать на текущий момент даже на суперкомпьютере.
В учебном варианте алгоритма, изложенном далее, сделаны следующие ограничения на области:
1. Все области являются квадратами со сторонами, параллельными сторонам изображения. Это ограничение достаточно жесткое. Фактически мы собираемся аппроксимировать все многообразие геометрических фигур лишь квадратами.
2. При переводе доменной области в ранговую уменьшение размеров производится ровно в 2 раза (см. рис. 2.6). Это существенно упрощает как компрессор, так и декомпрессор, так как задача масштабирования небольших областей является нетривиальной.
3. Все доменные блоки- квадраты и имеют фиксированный размер. Изображение равномерной сеткой разбивается на набор доменных блоков.
4. Доменные области берутся "через точку" и по I и по У, что сразу уменьшает перебор в 4 раза.
5. При переводе доменной области в ранговую поворот куба возможен только на О, 90, 180 или 270°. Также допускается зеркальное отражение. Общее число возможных преобразований (считая пустое) - 8.
6. Масштабирование (сжатие) по вертикали (яркости) осуществляется в фиксированное число раз - 0.75.
Эти ограничения позволяют: 1. Построить алгоритм, для которого требуется сравнительно малое число операций даже на достаточно больших изображениях.
7. Очень компактно представить данные для записи в файл. Нам требуется на каждое аффинное преобразование в IFS:
♦ Два числа для того, чтобы задать смещение доменного блока. Если мы ограничим входные изображения размером 512x512, то достаточно будет по 8 бит на каждое число.
♦ Три бита для того, чтобы задать преобразование симметрии при переводе доменного блока в ранговый.
♦ 7-9 бит для того, чтобы задать сдвиг по яркости при переводе.
Информацию о размере блоков можно хранить в заголовке файла. Таким образом, мы затратили менее 4 байт на одно аффинное преобразование. В зависимости от того, каков размер блока, можно высчитать, сколько блоков будет в изображении. Таким образом, мы можем получить оценку степени компрессии.
Например, для файла в градациях серого 256 цветов 512x512 пикселов при размере блока 8 пикселов аффинных преобразований будет 4096 (512/8-512/8). На каждое потребуется 3.5 байта. Следовательно, если исходный файл занимал 262144 (512-512) байт (без учета заголовка), то файл с коэффициентами будет занимать 14336 байт. Степень сжатия- 18 раз. При этом мы не учитываем, что файл с коэффициентами тоже может обладать избыточностью и сжиматься без потерь с помощью, например, LZW.
Отрицательные стороны предложенных ограничений:
1. Поскольку все области являются квадратами, невозможно воспользоваться подобием объектов, по форме далеких от квадратов (которые встречаются в реальных изображениях достаточно часто.)
2. Аналогично мы не сможем воспользоваться подобием объектов в изображении, коэффициент подобия между которыми сильно отличается от двух.
3. Алгоритм не сможет воспользоваться подобием объектов в изображении, угол между которыми не кратен 90°.
Такова плата за скорость компрессии и за простоту упаковки коэффициентов в файл.
Сам алгоритм упаковки сводится к перебору всех доменных блоков и подбору для каждого соответствующего ему рангового блока. Ниже приводится схема этого алгоритма.
for (all range blocks) {
min_distance = MaximumDistance;
R^j = image->CopyBlock(i, j) ;
for (all domain blocks) { // С поворотами и отр.
current=KoopflMHaTH тек. преобразования;
D=image->CopyBlock(current);
current_distance = R_jj.L2distance(D) ; if(current_distance < min_distance) {
// Если коэффициенты best хуже: min_distance = current_distance; best = current; } }
// Next domain block Save_Coefficients_to_file(best);
// Next range block
Как видно из приведенного алгоритма, для каждого рангового блока делаем его проверку со всеми возможными доменными блоками (в том числе с прошедшими преобразование симметрии), находим вариант с наименьшей мерой L 2 (наименьшим среднеквадратичным отклонением) и сохраняем коэффициенты этого преобразования в файл. Коэффициенты - это (1) координаты найденного блока, (2) число от 0 до 7, характеризующее преобразование симметрии (поворот, отражение блока), и (3) сдвиг по яркости для этой пары блоков. Сдвиг по яркости вычисляется как b для r-,j - значения пикселов рангового блока (К), a dy - значения пикселов доменного блока (D). При этом мера считается как
rf(tf,D) = ££(,;,+S-0.754,) 2 .
Мы не вычисляем квадратного корня из L 2 меры и не делим ее на л, поскольку данные преобразования монотонны и не помешают нам найти экстремум, однако мы сможем выполнять на две операции меньше для каждого блока.
Посчитаем количество операций, необходимых нам для сжатия изображения в градациях серого 256 цветов 512x512 пикселов при размере блока 8 пикселов:
Число операций
4096 (=512/8-512/8)
492032 (=(512/2-8)* (512/2-8)*8)
> 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}