Реферат: Алгоритмы выделения контуров
Рис. 4. Ситуации.
Обрабатываемые строки представлены в виде массивов структур, куда входит координата Х начала/конца черной серии и адрес буфера, предназначенного для сбора и хранения информации по одной ветке (части контура), которая пересекает обрабатываемую строку. В буфере содержатся тип ветки (левая или правая в зависимости от расположения черной серии связной компоненты), ее внутренний номер, параметры отслеженной части контура (длина, площадь, габариты) и ее координатное описание, адрес буфера парной ветки, которая является частью того же контура и некоторые другие параметры.
При выявлении ситуации "начало" из стека свободных буферов выбирают два (для левой и правой веток). Каждая пара веток имеет свой уникальный номер, который возрастает по мере появления новых веток.
При обнаружении ситуации "продолжение" в буферы, адреса которых выбираются из описания верхней строки, дописываются координаты новых точек и уточняются геометрические параметры. Одновременно производится полигональная аппроксимация веток. В случае заполнения буфера метрическое описание соответствующего участка контура записывается в выходной файл, а в буфере сохраняется адрес записанного участка, что дает возможность связать ссылками участки одного контура.
При выявлении ситуации "ветвление" точки ветвления обрабатываются по аналогии с ситуацией "начало".
Ситуация "слияние" возникает тогда, когда закончено отслеживание внутреннего контура, и когда объединяются ветки одного контура. В первом случае происходит объединение информации обеих веток и запись в выходную структуру. Во втором случае ветка с меньшим номером "поглощает" ветку с большим номером и ее пару. Объединенная информация сохраняется в буфере ветки с меньшим номером, а в текущей строке адрес буфера парной ветки меняется на адрес буфера оставшейся ветки. В обоих случаях буферы
"поглощенной" пары освобождаются.
Ситуация "конец" свидетельствует о том. что либо закончилось отслеживание внешнего контура, либо сливаются ветки одного контура. Обработка производится по аналогии с обработкой ситуации "слияние".
Рис. 6. Результат работы сканирующего алгоритма выделения контуров.
В листинге 4 представлен модуль, содержащий в себе функции выделения контуров объектов.
Листинг 2. Главный модуль программы:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("Graphics.res");
USEFORM("MainUnit.cpp", Form1);
USEUNIT("GraphicUnit.cpp");
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{