Разработка класса "Квадродерево" для реализации операций с квадродеревьями на Object Pascal

Определение понятия квадротомического дерева. Рассмотрение основных примеров квадродерева, его достоинств и недостатков. Визуализация квадротомированного изображения. Создание программы разбора бинарной, заполненной случайным образом, матрицы N на M.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.08.2015
Размер файла 392,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

Московский авиационный институт (национальный исследовательский университет) "МАИ"

Кафедра: 304 " Вычислительные машины, системы и сети"

Пояснительная записка к курсовой работе

Разработка класса "Квадродерево" для реализации операций с квадродеревьями на Object Pascal

Москва 2015

Оглавление

  • Введение
    • 1. Общие понятия
    • 2. Пример квадродерева
    • 3. Визуализация квадротомированного изображения
    • 4. Достоинства квадродерева
    • 5. Недостатки квадродерева
    • 6. Результаты
    • Вывод
    • Список источников и литературы

Введение

Для того чтобы объявить класс на Turbo Pascal'е необходимо воспользоваться ключевым словом Object. Так как класс всегда является типом, делать это можно лишь в Type части программы:

Type

Class1 = Object

{список полей} A: Byte; V: Real; {список методов} Procedure Nothing(Var K: Byte); End;

Легко заметить, что поля и методы (общее для них название - члены класса) объявляются очень похоже на поля записи и обычные процедуры/функции. Объекты класса объявляются так же, как и обычные переменные:

Var

Object1, Object2: Class1;

Соответственно, доступ к полям объекта некоторого класса производится аналогично доступу к полям записи:

Object1.V:= Object2.A;

Обращение к методам класса производится аналогичным образом:

Object1.Nothing(Object1.A);

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

1. Общие понятия

Квадродерево (квадротомическое дерево) - структура данных, используемая для представления двумерных пространственных данных. Существует несколько типов квадродеревьев в зависимости от базового типа данных (точки, площади, кривые, поверхности или объемы). Наиболее общим типом квадродерева является (см. рисунок 1).

Рис. 1: Пример квадродерева

Квадродерево растрового изображения (см. рисунок 2, рисунок 4 и рисунок 5 - Примеры изображения и его бинарного представления, блоков разбиения и квадродерева) [6]. Далее, для конкретности, под пространственными данными везде будем понимать растровое изображение.

Следуя [7], под двумерным изображением понимается массив элементов изображения (пикселов). Если каждый из пикселов имеет только два состояния - черный или белый (подсвечен или нет), то изображение называется монохромным.

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

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

Корневой узел соответствует изображению в целом и имеет четыре дочерних узла, которые ассоциируются с четырьмя квадрантами исходного изображения (обозначаемыми NW - северо-западный, NE - северо-восточный, SW - юго-западный, SE - юго-восточный). В свою очередь каждый из дочерних узлов корня дерева также имеет по четыре дочерних узла, исходного изображения. Дочерние узлы следующего уровня представляют собой шестьдесят четыре квадранта, составляющих исходное изображение и так далее до конца.

квадротомический дерево программа матрица

Рис. 2: (a) изображение (b) его бинарный образ (c) его квадротомическое разбиение

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

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

Рис. 3: Пример квадродерева

2. Пример квадродерева

Рис. 4: (a) первый этап разбиения (b) второй этап разбиния (c) третий этап разбиения (d) изображение полностью разбито

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

· 1) белый --> квадрант полностью белый. Обозначается белым квадратом.

· 2) черный --> квадрант полностью черный. Обозначается черным квадратом.

· 3) серый --> квадрант - смесь черного и белого. Обозначается белым кругом.

На нулевом этапе полному изображению (рисунок 2a) сопоставляется корневой узел дерева.

Далее четырем равновеликим квадрантам первого этапа разбиения (рисунок 4a) ставятся в соответствие дочерние узлы первого уровня.

В показанном на рисунках частном случае северо-западный NW-квадрант обозначен белым квадратом, а остальные три - серыми кругами (рисунок 5). На очередном этапе серые квадранты снова подвергаются разбиению (на рисунке 3b для простоты показано лишь разбиение SW-квадранта). Как видно по рисунку 3b SW-квадрант на этом этапе содержит два белых, один черный и один серый подквадранты. Они представлены в дереве на рисунке 5. узлами второго уровня. Единственный серый квадрант снова разбивается.

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

Подобным же образом обрабатываются и остальные квадранты изображения всех уровней.

Окончательный вид квадродерева показан на рисунке 5.

Рис. 5: Окончательный вид квадродерева

3. Визуализация квадротомированного изображения

Визуализация изображения, представленного квадродеревом, представляет собой простую рекурсивную процедуру.

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

Этот процесс продолжается до тех пор, пока не будут посещены все листья дерева.

Визуализация полного изображения происходит по мере продвижения по квадродереву.

4. Достоинства квадродерева

Большинство приложений квадро деревьев к данным было сделано для изображений (Klinger, Dyer, 1976), но были проведены также современные алгоритмические разработки, которые дали результаты, сходные с теми, что используются при обработке географических данных. Сюда входят расчеты площадей, центороидные определения, распознавание образов [4], классификация изображений, оверлейные операции над изображениями, выявление связанных компонент, определение соседства [1], преобразование расстояний [7], разделение изображений, сглаживание данных и усиление краевых эффектов [4]. Вследствие этих преимуществ отдельные исследователи предложили использовать квадротомические деревья для хранения географических данных. Основное достоинство квадродеревьев состоит в компактном представлении изображения. Компактность квадродерева целиком зависит от изображения. Изображение с большими областями, окрашенными в один цвет представляются очень компактно, в то время как изображение, в котором все пикселы имеют разные цвета сводит на нет все преимущества квадродерева [10].

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

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

Поворот квадродерева на 90 градусов против часовой стрелки может быть осуществлен простым переприсваиванием узлов дерева в следующем порядке:

· Северо-западный (NW) -> Юго-западный (SW)

· Северо-восточный (NE) -> Северо-западный (NW)

· Юго-западный (SW) -> Юго-восточный (SE)

· Юго-восточный (SE) -> Северо-восточный (NE)

Поворот по часовой стрелке выполняется аналогично за исключением того, что переприсваивание производится в обратном порядке.

[6, 5] также упоминают о том, что квадродерево полезно при изменении разрешения объекта. Рассмотрим, например, квародерево на рисунке 4, которое представляет изображение, приведенное на рисунке 1.a. Если мы хотим изменить разрешение этого изображения, нам необходимо просто заменить все серые узлы второго уровня, на черные узлы. Результатом будет новое изображение, показанное на рисунке 5.

Рис. 5: Изображение с измененным при помощи квадродерева разрешением

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

5. Недостатки квадродерева

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

Алгоритмы поворота квадротомированного изображения ограничиваются лишь поворотами на углы, кратные 90 градусам. Повороты на любые другие углы невозможны.

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

Рис. 6: Исходное и повернутое изображения, различные квадродеревья

6. Результаты

program Project1;

uses Crt;

const

XMAX = 8;

YMAX = 8;

type

TMatrix = array[1..XMAX, 1..YMAX] of Byte;

TRect = record

Left, Top, Bottom, Right: Integer;

end;

TQScan = function(R: TRect): Byte;

PQTree = ^TQTree;

TQTree = object

Max: Byte;

Rect: TRect;

NW, NE, SW, SE: PQTree;

constructor Create(R: TRect; L: Integer; Hint: string; F: TQScan);

procedure View(Pad: Integer; S: string);

destructor Destroy;

end;

var

M: TMatrix;

Rect: TRect;

Root: PQTree;

procedure FillMatrix;

var

x, y: Integer;

begin

Randomize;

for x := 1 to XMAX do

for y := 1 to YMAX do

if Random(6) > 0 then

M[x, y] := 1

else

M[x, y] := 0;

end;

procedure WriteMatrix;

var

x, y: Integer;

begin

for x := 1 to XMAX do

begin

for y := 1 to YMAX do

Write(M[x, y], ' ');

WriteLn;

end;

end;

{$F+}

function ScanMatrix(R: TRect): Byte;

var

x, y: Integer;

WhiteFinded, BlackFinded: Boolean;

begin

ScanMatrix := 0;

WhiteFinded := False;

BlackFinded := False;

for x := R.Left to R.Right do

for y := R.Top to R.Bottom do

begin

if M[x, y] = 0 then

WhiteFinded := True;

if M[x, y] = 1 then

BlackFinded := True;

if WhiteFinded and BlackFinded then

Break;

end;

if WhiteFinded and BlackFinded then

ScanMatrix := 2

else if BlackFinded then

ScanMatrix := 1

else if WhiteFinded then

ScanMatrix := 0;

end;

{$F-}

constructor TQTree.Create(R: TRect; L: Integer; Hint: string; F: TQScan);

var

dx, dy: Integer;

TmpR: TRect;

begin

if (R.Right >= R.Left) and (R.Bottom >= R.Top) then

begin

Self.Max := F(R);

WriteLn('[', R.Left, ',', R.Right, '], [', R.Top, ',', R.Bottom, ']. Level=', L, ', ', Hint, ' > ', Self.Max);

if Self.Max < 2 then

begin

Self.NW := nil;

Self.NE := nil;

Self.SW := nil;

Self.SE := nil;

end

else

begin

dx := (R.Right - R.Left) div 2;

dy := (R.Bottom - R.Top) div 2;

{NW}

TmpR.Left := R.Left;

TmpR.Right := R.Left + dx;

TmpR.Top := R.Top;

TmpR.Bottom := R.Top + dy;

Self.NW := New(PQTree, Create(TmpR, L + 1, 'NW', F));

{NE}

TmpR.Left := R.Left + dx + 1;

TmpR.Right := R.Right;

TmpR.Top := R.Top;

TmpR.Bottom := R.Top + dy;

Self.NE := New(PQTree, Create(TmpR, L + 1, 'NE', F));

{SW}

TmpR.Left := R.Left;

TmpR.Right := R.Left + dx;

TmpR.Top := R.Top + dy + 1;

TmpR.Bottom := R.Bottom;

Self.SW := New(PQTree, Create(TmpR, L + 1, 'SW', F));

{SE}

TmpR.Left := R.Left + dx + 1;

TmpR.Right := R.Right;

TmpR.Top := R.Top + dy + 1;

TmpR.Bottom := R.Bottom;

Self.SE := New(PQTree, Create(TmpR, L + 1, 'SE', F));

end;

end;

end;

procedure TQTree.View(Pad: Integer; S: string);

var

i: Integer;

begin

if @Self <> nil then

begin

Self.NW^.View(Pad + 5, 'NW');

Self.NW^.View(Pad + 5, 'NE');

for i := 1 to Pad do

Write('-');

WriteLn(S, ':', Self.Max);

Self.NW^.View(Pad + 5, 'SW');

Self.NW^.View(Pad + 5, 'SE');

end;

end;

destructor TQTree.Destroy;

begin

if @Self <> nil then

begin

if Self.NW <> nil then

Dispose(Self.NW, Destroy);

if Self.NE <> nil then

Dispose(Self.NE, Destroy);

if Self.SW <> nil then

Dispose(Self.SW, Destroy);

if Self.SE <> nil then

Dispose(Self.SE, Destroy);

end;

end;

begin

ClrScr;

FillMatrix;

Writeln('Source matrix: ');

WriteMatrix;

ReadLn;

Writeln('Processing: ');

Rect.Left := 1;

Rect.Top := 1;

Rect.Right := XMAX;

Rect.Bottom := YMAX;

Root := New(PQTree, Create(Rect, 1, 'ROOT', ScanMatrix));

ReadLn;

Writeln('Tree: ');

Root^.View(1, 'ROOT');

ReadLn;

Dispose(Root, Destroy);

end.

Вывод

Использование квадродерева продемонстрировано на классической задаче разбора бинарной матрицы N на M.

Для примера в программе используется матрица 8 на 8, которая заполняется случайным образом.

Сначала выводится матрица, потом выводятся данные по ходу формирования дерева, затем выводится само дерево.

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

Квадрант помечается цифрой 1 или цифрой 0, если он содержит только единицы или только нули соответственно.

Пометки обозначают:

Root - корень,

NW - северо-запад, NE - северо-восток,

SW - юго-запад, SE - юго-восток.

TQTree - класс

TMatrix, TRect и TQScan - это обычные типы, которые описывают другие вспомогательные структуры

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

Список источников и литературы

Литература

1. Кошкарев А.В., Тикунов В.С. Геоинформатика. Москва, Картгеоцентр-Геоиздат, 1993. С. 55-57.

2. Tobler, W., Zi-tan Chen. (1986) A quadtree for global Information Storage. - "Geographical Analysis", 1986, October, Vol. 18, No. 4. Существует перевод: Тоблер В., Зи-тан Чен. Квадротомическое дерево для глобального хранения информации. // Картография. Вып. 4. Геоинформационные системы: Сб. перев. статей/Сост., ред и предисл. А.М. Берлянт и В.С. Тикунов. - М.: Картгеоцентр - Геоиздат, 1994. C. 89-101.

3. Mark D.M. (1986) Construction of Quadtrees and Octtrees from Reaster Data. A new algorithm Based on Run-Encoding. - "The Australian Computer Journal", 1986, August, Vol. 18, No. 3, p 115-119. Существует перевод: Марк Д.М. Построение квадротомических и октотомических деревьев на базе растровых данных: новый алгоритм быстрого кодирования. // Картография. Вып. 4. Геоинформационные системы: Сб. перев. статей/Сост., ред и предисл. А.М. Берлянт и В.С. Тикунов. - М.: Картгеоцентр - Геоиздат, 1994. C. 102-109.

4. Bell, S.B., B.M. Diaz, and F.C. Holroyd. (1988) Digital Image Processing in Remote Sensing. Capturing Image Syntax using Tesseral addressing and arithmetic. Taylor & Francis Ltd: USA.

5. Hunter G.M. and Stiglitz K. (1979) IEEE Transactions on Pattern Analysis and Machine Intelligence. Operations on Images Using Quad Trees. April: 145-153.

6. Samet,H. (1990) The Design and Analysis of Spatial Data Structures. Addison-Wesley Publishing Company, Inc: Reading.

7. Samet H.(1981) Computer Graphics and Image processing. Neighbor Finding Techniques for Imagees Represented Quadtrees. Academic Press 18: 35-57.

8. Samet H. and M. Tamminen.(1985) IEEE Transaction on Patter Analysis and Machine Intelligence. Computing Geometric Properties of Images Represented by Linear Quadtrees. March: 229-240.

9. Burroughs,P.A. (1986) Principles of Geographical Information Systems for Land Resources Assessment. Clarendon Press: Oxford.

10. Foley J.D. and A. Van Dam(1982) Fundamentals of Interactive Computer Graphics. Addison Wesley.

11. Carlbom I., I. Chakravarty and D. Vanderschel (1985) A Hierarchical Data Structure for Representing the Spatial Decomposition of 3D Objects. In: Frontiers in Computer Graphics (T.L. Kunii ed.), pp. 2-12. Springer-Verlag: New York.

12. Burger, P. and D. Gillies (1989) Interactive Computer Graphics: Functional, Procedural and Device-level Methods. Addison-Wesley Publishing Company: Sydney.

Ссылки на интернет ресурсы

13. http://loi.sscc.ru/gis/QuadTree/QuadTree.html

14. http://www.kolasc.net.ru/cdo/metod/programmer'scourse/language/oop_pas.htm

15. https://ru.wikipedia.org/wiki/Заглавная_страница

Размещено на Allbest.ru


Подобные документы

  • Методы грамматического разбора. Разработка структуры учебного транслятора на базовом языке программирования Object Pascal в среде объектно-ориентированного визуального программирования Borland DELPHI 6.0 с использованием операционной системы Windows XP.

    курсовая работа [493,8 K], добавлен 12.05.2013

  • Разработка алгоритма и написание программы на языке Object Pascal, предназначенной для расчета траверса крюка мостового крана на изгиб. Определение расчетных размеров крана с помощью табличного процессора Microsoft Excel. Блок-схема и алгоритм расчета.

    курсовая работа [519,3 K], добавлен 03.06.2010

  • GetMatrDop как процедура определяет значение элемента транспонированной матрицы дополнений. Знакомство с этапами разработки в среде Turbo Pascal программы сортировки элементов, находящихся на главной диагонали матрицы. Особенности тестирования программы.

    курсовая работа [780,4 K], добавлен 20.11.2014

  • Реализация программы для решения матричных игр. Задание матрицы игры вручную и случайным образом, нахождение оптимальных стратегий игроков итерационным и методом чистых стратегий. Проектирование и листинг программного кода, сохранение матрицы игры.

    контрольная работа [716,7 K], добавлен 11.06.2011

  • Основные понятия и структура обработчика на языке Pascal. Элективные курсы по информатике в системе профильного обучения. Элективный курс "Программирование в среде Delphi". Методические материалы по изучению программирования на языке Object Pascal.

    методичка [55,4 K], добавлен 08.12.2010

  • Описание алгоритма решения задачи по вычислению суммы элементов строк матрицы с использованием графического способа. Детализация укрупненной схемы алгоритма и разработка программы для решения задачи в среде Turbo Pascal. Листинг и тестирование программы.

    курсовая работа [446,0 K], добавлен 19.06.2014

  • Обзор основных используемых языков программирования (С++, Java, Pascal). Анализ существующих методов шифрования паролей. Основные понятия объектно-ориентированного программирования. Реализация приложения для генерирования паролей на языке Object Pascal.

    курсовая работа [822,4 K], добавлен 07.07.2012

  • Разработка программы на языке Pascal. Описание переменных. Действия, которые должна выполнить программа согласно выбранного алгоритма. Детализация графической части программы. Листинг и тестирование программы. Вывод массива данных на экран монитора.

    контрольная работа [360,4 K], добавлен 13.06.2012

  • Решения задачи графическим и программным способами. Описание алгоритма решения графическим способом, укрупненная схема алгоритма. Ввод элементов двумерного массива, вывод преобразованного массива, разработка программы на языке pascal, листинг программы.

    курсовая работа [115,5 K], добавлен 22.05.2010

  • Free Pascal как свободная реализация языка Паскаль, совместимая с Borland Pascal и Object Pascal - Delphi, но при этом обладающая и некоторыми дополнительными возможностями. Основы алгоритмизации и программирования, создание визуальных приложений.

    учебное пособие [4,2 M], добавлен 13.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.