Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_TRPO / G6Tetrar.doc
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
498.69 Кб
Скачать

6. Тетрарные деревья

Тетрарные деревья представляют структуру данных, которая широко используется и в машинной графике и в обработке изображений. Ее применение удобно, когда изображение представляет квадратную матрицу А, размеры которой определяются некоторой степенью числа 2, скажем, 2n. Матрицу А можно разбить на четыре квадратные матрицы: А0 А1 А2 А3, размеры которых в два раз меньше размеров матрицы А. Процесс такого разбиения можно рекурсивно повторять n раз до тех пор, пока не будет достигнут уровень выделения одного пикселя. Эти уровни можно пронумеровать, начиная с нуля, которым обозначается изображение в целом, вплоть до n, соответствующего отдельным пикселям. Каждый выделяемый квадрат можно пометить одним из четырех символов – 0, 1, 2 или 3, приписываемых посредством конкатенации к метке породившего его квадрата. В результате отдельные пиксели будут снабжены метками, состоящими из n символов. Эту конструкцию можно представить в виде дерева, вершины которого соответствуют отдельным квадратам. Вершины дерева соединяются, если квадрат, соответствующий одной из них, непосредственно содержится в квадрате, соответствующем другой. Корень дерева соответствует изображению в целом, листья – отдельным пикселям, а все остальные вершины характеризуются степенью, равной 4. Дерево такого вида обычно называют деревом четвертой степени или тетрарным деревом. Такое дерево представлено на рис. 9.1. Рассмотрим применение тетрарных деревьев для кодирования бинарных (черно-белых) изображений.

В памяти ЭВМ тетрарное дерево может быть представлено различными способами:

1) древовидной структурой со ссылками;

2) линейной структурой в виде массива;

3) списком листьев, соответствующему поиску в глубину.

9.1. Древовидная структура со ссылками

В древовидной структуре со ссылками вершина дерева описывается следующим образом:

Type u = ^uzl;

uzl = Record {тип для вершин дерева}

С : Byte; {цвет квадрата}

L :Array[0..3] Of u; {ссылки на вершины следующего уровня}

End;

Var h :u; {корень дерева}

Рекурсивная процедура кодирования черно-белого изображения приведена ниже. Считается, что изображение задано на экране монитора. (Перед первым вызовом процедуры необходимо создать корень: New(h); ).

Procedure Code1 ( h :u; x, y, a :Integer);

{x,y – координаты левого верхнего угла квадрата; а – размер квадрата;}

Var dx, dy, i :Integer;

Begin

h^. C := SqColor( x, y, a ); {определили цвет квадрата}

If ( a = 1 ) Or ( h^. C < > 255 ) { если квадрат предельный или однотонный,

Then For i:=0 to 3 Do h^. L[ i ] := Nil то размечаем его как лист,

Else Begin иначе движение вниз }

a := a Div 2; {получили размер квадрата следующего уровня

For dy := 0 To 1 Do и исследуем

For dx := 0 To 1 Do Begin его 4 –х потомков}

i := 2*dy + dx; {получаем порядковый номер квадранта 0..3 }

New ( h^. L[ i ] ); создаем новую вершину-потомка}

Code1 ( h^. L[ i ], x + a*dx, y + a*dy, a ); {дальнейшее разбиение}

End;

End;

End;

Вспомогательная функция SqColor возвращает цвет квадрата ( 1 – квадрат целиком белый; 0 – квадрат целиком черный; 255 – квадрат содержит как черные, так и белые пиксели ).

Function SqColor ( x, y, a :Integer) :Byte;

Var i, j :Integer; c0 :Byte;

Begin SqColor := 255;

c0 := GetPixel ( x, y );

For i := y To y + a - 1 Do

For j := x To x + a - 1 Do If GetPixel( j, i ) < > c0 Then Exit;

SqColor := c0;

End;

Далее приведена рекурсивная процедура Decode1 восстановления изображения. Как и в процедуре кодирования осуществляется обход дерева и выделяются листья дерева (квадраты). Они воспроизводятся на экране процедурой DrawBar ( x, y, a, c ), на вход которой подаются координаты x, y квадрата, размер квадрата а и его цвет с.

Procedure Decode1 ( h :u; x,y,a :Integer);

Var dx,dy :Integer;

Begin

If h^. C < >255 Then DrawBar ( x, y, a, h^.C ){вывод квадрата, если это лист,

Else Begin a:=a Div 2; иначе идем вниз

For dy:=0 To 1 Do и исследуем потомков}

For dx:=0 To 1 Do Decode( h^. L[ 2*dy+dx], x+a*dx, y+a*dy, a );

End;

End;

Число вершин тетрарного дерева при представлении изображения может быть весьма значительным – иногда большим, чем число пикселей изображения. Действительно, k-й уровень состоит из 4k квадратов, общее число вершин равно

.

Следовательно, число вершин приблизительно на 33% превышает число пикселей. Кроме того у всех терминальных вершин (листьев) ссылочные поля имеют значение Nil, что тоже увеличивает расход памяти для представления дерева. Поэтому представление тетрарного дерева с использованием древовидной структуры имеет недостаток, заключающийся в требовании большого объема памяти.

Соседние файлы в папке Lektsii_TRPO