44548 (663381)

Файл №663381 44548 (Алгоритмы выделения контуров)44548 (663381)2016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

Белорусский Государственный Университет Информатики и Радиоэлектроники.

Контрольная работа

по дисциплине

«МАТИ»

Выполнил студент группы 500501

Балахонов Е. В.

Алгоритмы выделения контуров.

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

1. Отслеживающие алгоритмы на примере алгоритма «жука».

    1. Общее описание алгоритма.

Отслеживающие алгоритмы основаны на том, что на изображении отыскивается объект (первая встретившаяся точка объекта) и контур объекта отслеживается и векторизуется. Достоинством данных алгоритмов является их простота, к недостаткам можно отнести их последовательную реализацию и некоторую сложность при поиске и обработке внутренних контуров. Пример отслеживающего алгоритма - "алгоритма жука" - приведен на рис. 5.12. Жук начинает движение с белой области по направлению к черной, Как только он попадает на черный элемент, он поворачивает налево и переходит к следующему элементу. Если этот элемент белый, то жук поворачивается направо, иначе - налево. Процедура повторяет­ся до тех пор, пока жук не вернется в исходную точку. Координаты точек перехода с черного на белое и с белого на черное и описывают границу объекта.

На рис. 1 показана схема работы такого алгоритма.

Рис. 1. Схема работы отслеживающего алгоритма «жука».

1.2 Создание программы, реализующий данный алгоритм.

Данная программа реализована в среде программирования Borland C++ Builder 4.

Общий вид главного окна программы в исходном положении показан на рис. 2.

Рис. 2. Главное окно программы в исходном положении.

Слева находится исходное изображение, справа находится изображение на котором будут рисоваться выделяемые контуры объекта.

Исходные тексты формы представлены в листинге 1.

В листингах 2 и 3 находятся исходные тексты главного модуля программы и модуля главной формы.

В листинге 4 представлен модуль, содержащий в себе функции выделения контуров объектов.

На рис. 3 можно увидеть результат работы алгоритмов выделения контуров.

Рис. 3. Результат работы отслеживающего алгоритма выделения контуров.

2. Сканирующие алгоритмы.

2.2. Общее описание алгоритма.

Сканирующие алгоритмы основаны на просмотре (сканировании) всего изображения и выделения контурных точек без отслеживания контура объекта.

Рассмотрим алгоритм, осно­ванный на разработанной схеме хранения полосы изображения в памяти ЭВМ и нахождения контурных точек в процессе движения полосы по всему изображению. Для обработки информации в полосе различают два случая: выявление ситуации в полосе изображения и ее разрешение. В полосе одновременно хранятся две строки изображения (текущая и предыдущая). Анализируются Х координаты черных серий обеих строк в порядке их возрастания (слева направо) и выявляются пять ситуаций, которые могут возникнуть.

Ситуация "начало" возникает в том случае, когда черная серия текущей строки полностью покрывается белой серией предыдущей строки (рис. 4, а).

Для ситуации "продолжение" характерно частичное перекрытие черных серий обеих строк (рис.4,б).

Если две соседние черные серии текущей строки покрываются черной серией предыдущей строки, возникает ситуация "ветвление"(рис. 4, в).

Ситуация "слияние" выявляется в том случае, когда черная серия текущей строки касается двух соседних черных серий предыдущей строки (рис.4, г).

Ситуация "конец" возникает, когда белая серия текущей строки полностью покрывает черную серию предыдущей строки (рис.4, д).

Рис. 4. Ситуации.

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

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

При обнаружении ситуации "продолжение" в буферы, адреса ко­торых выбираются из описания верхней строки, дописываются координаты новых точек и уточняются геометрические параметры. Одновременно производится полигональная аппроксимация веток. В случае заполнения буфера метрическое описание соответствующего участка контура записывается в выходной файл, а в буфере сохраняется адрес записанного участка, что дает возможность связать ссылками участки одного контура.

При выявлении ситуации "ветвление" точки ветвления обрабаты­ваются по аналогии с ситуацией "начало".

Ситуация "слияние" возникает тогда, когда закончено отслежи­вание внутреннего контура, и когда объединяются ветки одного контура. В первом случае происходит объединение информации обеих веток и запись в выходную структуру. Во втором случае ветка с меньшим номером "поглощает" ветку с большим номером и ее пару. Объединенная информация сохраняется в буфере ветки с меньшим номером, а в текущей строке адрес буфера парной ветки меняется на адрес буфера оставшейся ветки. В обоих случаях буферы

"поглощенной" пары освобождаются.

Ситуация "конец" свидетельствует о том. что либо закончилось отслеживание внешнего контура, либо сливаются ветки одного контура. Обработка производится по аналогии с обработкой ситуации "слияние".

Рис. 6. Результат работы сканирующего алгоритма выделения контуров.

В листинге 4 представлен модуль, содержащий в себе функции выделения контуров объектов.

Листинг 2. Главный модуль программы:

//---------------------------------------------------------------------------

#include

#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)

{

Application->ShowException(&exception);

}

return 0;

}

//---------------------------------------------------------------------------

Листинг 3. Модуль главной формы

Файл заголовка:

//---------------------------------------------------------------------------

#ifndef MainUnitH

#define MainUnitH

//---------------------------------------------------------------------------

#include

#include

#include

#include

#include

#include

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TPanel *Panel1;

TImage *FromImage;

TPanel *Panel2;

TImage *ToImage;

TButton *Button1;

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

cpp файл:

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "MainUnit.h"

#include "GraphicUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

AlgorithmBeatle(FromImage->Picture->Bitmap,

ToImage->Picture->Bitmap);

ToImage->Visible = false;

ToImage->Visible = true;

}

//---------------------------------------------------------------------------

Листинг 4. Модуль выделения контуров.

Файл заголовка:

//---------------------------------------------------------------------------

#ifndef GraphicUnitH

#define GraphicUnitH

//---------------------------------------------------------------------------

#include

extern void AlgorithmBeatle(Graphics::TBitmap* FromImage,

Graphics::TBitmap* ToImage);

extern void AlgorithmScan(Graphics::TBitmap* FromImage,

Graphics::TBitmap* ToImage);

#endif

cpp файл:

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "GraphicUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#include

/*

Отслеживающий алгоритм выделения контуров

"Алгоритм жука"

*/

void AlgorithmBeatle(Graphics::TBitmap* FromImage,

Graphics::TBitmap* ToImage)

{

typedef enum {North, East, South, West} TDirectional;

int X,Y; // Координаты первой встречи с объектом

int cX,cY; // Текущие координаты маркера

Byte *Line, *ToLine; // Обрабатываемые линии

Byte B; // Значение текущего пиксела

TDirectional Direct; // Направление движения жука

// Идем до тех пор, пока не встретим черную область

for (Y = 0; Y Height; Y++)

{

Line = (Byte*)FromImage->ScanLine[Y];

for (X = 0; X Width; X++)

{

B = Line[X];

if (B < 255)

break;

}

// Если встречен объект, отличающийся от цвета фона (255 - белый)

// прервать поиск

if (X != FromImage->Width)

break;

}

// Если не нашли ни одного черного пиксела, то выходим из процедуры

if ((X == FromImage->Width) && (Y == FromImage->Height))

return;

// Если все нормально, начинаем обход по алгоритму жука

ToLine = (Byte*)ToImage->ScanLine[Y];

ToLine[X] = 0;

// Поворачиваем налево (новое направление - север)

cX = X;

cY = Y - 1;

Direct = North;

Line = (Byte*)FromImage->ScanLine[cY];

// Пока не придем в исходную точку, выделяем контур объекта

while ((cX != X) || (cY != Y))

{

// В зависимости от текущего направления движения жука

switch (Direct)

{

// Север

case North:

{

B = Line[cX];

// Если элемент "черный", поворачиваем снова "налево"

if (B < 255)

{

ToLine = (Byte*)ToImage->ScanLine[cY];

ToLine[cX] = 0;

Direct = West;

cX--;

}

// Иначе поворачиваем "направо"

else

{

Direct = East;

cX++;

}

}

break;

// Восток

case East:

{

Характеристики

Тип файла
Документ
Размер
1,69 Mb
Тип материала
Учебное заведение
Неизвестно

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

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

Список файлов реферата

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6510
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее