Система автоматизованого аналізу просторової структури зображень Підсистема лінійної сегментації

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Федеральне агентство з освіти
Державна освітня установа
вищої професійної освіти
«Іжевський державний технічний університет»
Факультет «Інформатика і обчислювальна техніка»
Кафедра "Програмне забезпечення"
ПОЯСНЮВАЛЬНА ЗАПИСКА
до дипломної роботи на тему:
«Система автоматизованого аналізу просторової структури зображень. Підсистема лінійної сегментації »
Дипломник
студент групи 10-19-2
Ю.Н. Данилов
Керівник
провідний інженер кафедри
«Програмне забезпечення»
Л.М. Левицька
Консультант з економічної частини
к.е.н., доцент
І.І. Радигіна
Консультант з безпеки та екологічності
к.б.н., доцент
Г.Ф. Якименко
Нормоконтроль
В.П. Соболєва
Рецензент
провідний інженер АТ «Аксион»
В.Н. Захаров
Завідувач кафедрою
«Програмне забезпечення»
д.т.н., професор
А.І. Муринов
Іжевськ 2006

РЕФЕРАТ
Пояснювальна записка до дипломної роботи на тему «Система автоматизованого аналізу просторової структури зображень. Підсистема лінійної сегментації »оформлена на 119 аркушах, містить 34 рисунка, 10 таблиць.
Підсистема призначена для аналізу графічних зображень, що містять різного роду пересічні лінії. Вона включає в себе модуль пошуку і виділення вузлів перетинань, модуль пошуку і виділення сегментів ліній, заданих даних вузлів, модуль виведення координат вузлів і напрямків кодування сегментів для подальшого застосування в якості вхідних даних підсистеми ланцюгового кодування. Також в підсистему входить модуль перегляду і редагування зображень, що представляє собою базовий графічний редактор і модуль імпорту / експорту, дозволяє відкривати і зберігати зображення як в стандартному форматі графічних файлів (BMP), так і у вигляді файлів масивів точок.
Метою даної роботи була розробка підсистеми лінійної сегментації, яка буде інтегрована до складу Системи автоматизованого аналізу просторової структури зображень і буде взаємодіяти з іншими підсистемами, такими як підсистема фільтрації і підсистема ланцюгового кодування.
Результатом роботи є підсистема, що дозволяє приймати на вході результати обробки різних підсистем фільтрації зображень, при необхідності вносити додаткові зміни до зображення, проводити аналіз структури зображення, виділяючи в ньому вузли перетину ліній, сегменти, утворені між цими вузлами і отримувати на виході координати вузлів, сегментів і направляючих координат, дозволяючи зберігати як проміжні, так і кінцеві результати і передавати їх для обробки в інші підсистеми.
Здійснюється можливість покрокової обробки вхідного зображення: окреме виділення вузлів, виділення сегментів, висновок координат, висновок послідовного коду ліній. Також всі кроки можуть бути виконані послідовно автоматично, отримуючи на виході результат, готовий для передачі в інші підсистеми, що дозволяє використовувати підсистему в автоматичному режимі роботи всієї системи.
У підсистему вбудований модуль візуалізації, що дозволяє інтерактивно на самому зображенні спостерігати результати його обробки. Це дозволяє наочно вивчати роботу підсистеми і оцінювати характеристики її роботи.
Система реалізована для персональних електронно-обчислювальних машин, що працюють під управлінням Microsoft Windows 98/Me/2000/XP/NT і вище, не вимагає установки додаткових інструментів і не вимоглива до системних ресурсів.

ЗМІСТ
\ T "Заголовок 14 TNR; 1; Тема 14 TNR підпункт 3; 3; Тема 14 TNR підпункти 2; 2" ВСТУП ........................ .................................................. .................. 7
1. РОЗРОБКА «ПІДСИСТЕМИ ЛІНІЙНОЇ СЕГМЕНТАЦІЇ» У СКЛАДІ «СИСТЕМИ АВТОМАТИЗОВАНОГО аналізу просторової структури ЗОБРАЖЕНЬ ».................................. ................................. 9
1.1. Обгрунтування доцільності розробки системи ................... 9
1.1.1. Призначення системи ................................................ ..................... 9
1.1.2. Обгрунтування мети створення системи ......................................... 10
1.1.3. Призначення «Підсистеми лінійної сегментації »................... 11
1.1.4. Характеристика організаційної та функціональної структури 11
1.1.5. Обгрунтування складу автоматизуються завдань ........................ 11
1.1.6. Обгрунтування застосування типових і оригінальних рішень 12
1.1.7. Загальна оцінка економічної доцільності створення підсистеми 13
1.2. Основні вимоги до «підсистеми лінійної сегментації» ... 13
1.2.1. Основні цілі створення підсистеми ........................................ 13
1.2.2. Функціональне призначення підсистеми ................................. 14
1.2.3. Вимоги до функціональної структури підсистеми ............ 14
1.2.4. Вимоги до технічного забезпечення ................................. 15
1.2.5. Вимоги до інформаційного забезпечення ........................ 15
1.2.6. Вимоги до програмного забезпечення .............................. 16
1.3. Основні технічні рішення проекту підсистеми «Лінійна сегментація »......................................... .................................................. ............................. 16
1.3.1. Рішення з комплексу технічних засобів ............................. 16
1.3.2. Опис організації інформаційної бази ........................ 17
2. РОЗРОБКА ЗАВДАННЯ «ПОШУК ВУЗЛІВ ».................................. 19
2.1. Опис постановки завдання ............................................... ......... 19
2.1.1. Характеристика задачі ................................................ .............. 19
2.1.2. Вхідна інформація ................................................ ................. 19
2.1.3. Вихідна інформація ................................................ ............... 19
2.1.4. Математична постановка задачі ........................................... 20
2.1.5. Спеціальні вимоги до технічного забезпечення ........... 23
2.2. Опис алгоритму «Пошук вузлів »............................................ 23
2.2.1. Призначення і характеристика ............................................... ..... 23
2.2.2. Використовувана інформація ................................................ ........ 24
2.2.3. Результати рішення ................................................ ................... 24
2.2.4. Алгоритм рішення ................................................ ..................... 24
2.2.6. Умовні позначення ................................................ ............... 25
2.3. Опис програми «Пошук вузлів ».......................................... 26
2.3.1. Вступна частина ................................................ ............................. 26
2.3.2. Функціональне призначення ................................................ ...... 26
2.3.3. Опис інформації ................................................ ............... 27
2.3.4. Використовувані підпрограми ................................................ ... 27
2.3.5. Опис логіки ................................................ ......................... 27
2.3.6. Налаштування програмних засобів .............................................. 28
3. РОЗРОБКА ЗАВДАННЯ «ПОШУК СЕГМЕНТІВ »....................... 30
3.1. Опис постановки завдання ............................................... ......... 30
3.1.1. Характеристика задачі ................................................ .............. 30
3.1.2. Вхідна інформація ................................................ ................. 31
3.1.3. Вихідна інформація ................................................ ............... 31
3.1.4. Математична постановка задачі ........................................... 31
3.1.5. Спеціальні вимоги до технічного забезпечення ........... 34
3.2. Опис алгоритму «Пошук сегментів »..................................... 34
3.2.1. Призначення і характеристика ............................................... ..... 34
3.2.2. Використовувана інформація ................................................ ........ 35
3.2.3. Результати рішення ................................................ ................... 35
3.2.4. Алгоритм рішення ................................................ ..................... 35
3.2.5. Вимоги до контрольного прикладу ...................................... 36
3.2.6. Умовні позначення ................................................ ............... 36
3.3. Опис програми «Пошук сегментів ».................................... 37
3.3.1. Вступна частина ................................................ ............................. 37
3.3.2. Функціонально призначення ................................................ ....... 37
3.3.3. Опис інформації ................................................ ............... 37
3.3.4. Використовувані підпрограми ................................................ ... 38
3.3.5. Опис логіки ................................................ ......................... 38
3.3.6. Налаштування програмних засобів .............................................. 38
4. РОЗРОБКА ЗАВДАННЯ «ОБРОБКА І КОДУВАННЯ СЕГМЕНТІВ ».......................................... .................................................. ............................ 40
4.1. Опис постановки завдання ............................................... ......... 40
4.1.1. Характеристика задачі ................................................ .............. 40
4.1.2. Вхідна інформація ................................................ ................. 40
4.1.3. Вихідна інформація ................................................ ............... 40
4.1.4. Математична постановка задачі ........................................... 41
4.1.5. Спеціальні вимоги до технічного забезпечення ........... 42
4.2. Опис алгоритму «Обробка та кодування сегментів ».... 42
4.2.1. Призначення і характеристика ............................................... ..... 42
4.2.2. Використовувана інформація ................................................ ........ 42
4.2.3. Результати рішення ................................................ ................... 43
4.2.4. Алгоритм рішення ................................................ ..................... 43
4.2.5. Вимоги до контрольного прикладу ...................................... 44
4.2.6. Список умовних позначень ............................................... ... 44
4.3. Опис програми «Обробка та кодування сегментів» ... 45
4.3.1. Вступна частина ................................................ ............................. 45
4.3.2. Функціональне призначення ................................................ ...... 45
4.3.3. Опис інформації ................................................ ............... 45
4.3.4. Використовувані підпрограми ................................................ ... 46
4.3.5. Опис логіки ................................................ ......................... 47
4.3.6. Налаштування програмних засобів .............................................. 48
4.4. Опис контрольного прикладу ............................................... .. 48
4.4.1. Призначення ................................................. ................................. 48
4.4.2. Вихідні дані ................................................ ....................... 49
4.4.3. Результати розрахунку ................................................ ..................... 51
4.4.4. Результати випробування програми ............................................ 54
5. ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ЧАСТИНА .................... 56
5.1. Розрахунок витрат на розробку «Підсистеми лінійної сегментації» 56
6. ЕКОЛОГІЧНІСТЬ І БЕЗПЕКА ПРОЕКТУ ................... 61
6.1. Актуальність безпеки праці ............................................... . 61
6.2. Аналіз небезпечних і шкідливих виробничих факторів .......... 62
6.3. Техніка безпеки при роботі з комп'ютером ...................... 64
6.4. Організація робочого місця оператора ...................................... 68
6.5. Розрахунок захисного заземлення ............................................... ........ 69
6.6. Вимоги до параметрів мікроклімату .................................... 73
6.7. Пожежна ................................................. .................... 73
6.8. Висновки ................................................. ......................................... 74
ВИСНОВОК ................................................. ................................... 75
СПИСОК ЛІТЕРАТУРИ ................................................ .................... 77
ДОДАТОК 1 КЕРІВНИЦТВО ПРОГРАМІСТА .................. 79
ДОДАТОК 2 КЕРІВНИЦТВО ОПЕРАТОРА ........................... 85
ДОДАТОК 3 ТЕКСТ ПРОГРАМИ ......................................... 96

ВСТУП
Комп'ютерна графіка та обробка зображень за допомогою електронно-обчислювальних машин в даний час є одними з найбільш важливих аспектів використання ЕОМ у всіх сферах людської діяльності. Зорове сприйняття людиною інформації є одним з найбільш інформативних способів передачі інформації, в той же час, будучи найбільш зручним для людини способом представлення і розуміння. Не випадково і основним інтерфейсом спілкування людини і машини обраний графічний. Поточний стан розвитку обчислювальних потужностей обладнання дозволяють використовувати їх не тільки для передачі інформації від машини до людини, але і розробляти алгоритми, що дають ЕОМ можливість приймати і розуміти інформацію в тій формі, в якій її сприймає людина, роблячи спілкування між людиною і машиною зручним і не вимагає додаткових перетворень інформації. Це дозволяє ще більше збільшити область застосування ЕОМ, як в науці та промисловості, так і на побутовому рівні.
Система автоматизованого аналізу просторової структури зображень дозволяє виділяти у вихідному зображенні структурні елементи, попередньо піддаючи зображення різного роду фільтрація для виділення критично важливих ділянок. Вона також дозволяє проводити синтез зображень за описами, отриманим у результаті їх аналізу. Тут слід відзначити істотну різницю у вимогах до обсягу, необхідного для зберігання зображень, представлених у вихідній (растрової) формі і зображень, а точніше їх описів, отриманих в результаті обробки їх у системі. Рівень стиснення інформації за допомогою аналізу структурних одиниць і подальшого їх кодування є виграшним в порівнянні з сучасними технологіями стиснення зображень. Також потрібно додати, що спосіб зберігання інформації у вигляді, описаному вище, дозволяє відтворювати зображення без погіршення якості, будучи різновидом векторного способу представлення графічної інформації.
Підсистема лінійної сегментації дозволяє виділяти ділянки (сегменти) ліній, утворених в результаті перетину різного роду кривих, а також виділяти вузли утворюються за рахунок цих перетинів, отримуючи координати необхідних точок і передаючи їх в іншу підсистему для представлення у вигляді ланцюгових кодів. Підсистема тісно пов'язана з багатьма іншими підсистемами, такими, як підсистема фільтрації, що дозволяє усунути шуми і отримати зображення в найбільш зручній для обробки формі, а також підсистемою ланцюгового кодування, що представляє лінії у вигляді ланцюгових кодів - коди, що дозволяють використовувати відносні значення сусідніх точок, тим самим займаючи значно менший обсяг інформації в порівнянні з растровим зображенням.

1. РОЗРОБКА «ПІДСИСТЕМИ ЛІНІЙНОЇ СЕГМЕНТАЦІЇ» У СКЛАДІ «СИСТЕМИ АВТОМАТИЗОВАНОГО аналізу просторової структури ЗОБРАЖЕНЬ»
1.1. Обгрунтування доцільності розробки системи
if (Image1-> Canvas-> Pixels [x-1] [y] == c0 & & x> 0) n + = 1; / / l = 4
if (Image1-> Canvas-> Pixels [x +1] [y] == c0 & & x <w) n + = 1; / / r = 5
if (Image1-> Canvas-> Pixels [x-1] [y +1] == c0 & & x> 0 & & y <h) n + = 1; / / ld = 6
if (Image1-> Canvas-> Pixels [x] [y +1] == c0 & & y <h) n + = 1; / / d = 7
if (Image1-> Canvas-> Pixels [x +1] [y +1] == c0 & & x <w & & y <h) n + = 1; / / rd = 8
return (n);
}
//------------------------------------------------ ---------------------------
int TfrmLineSeg:: VectMove (int & x, int & y, int vect)
{
int res = 0;
if (vect> 0) wlog ("VectMove: new point");
else if (vect <0 & & vect> -10) wlog ("VectMove: new node");
else if (vect <-10 & & vect> -20) wlog ("VectMove: existing node");
else wlog ("VectMove: ERROR POINT");
int amvect = abs (vect)% 10;
switch (amvect)
{
/ / Точка належить лінії
case 1: x-= 1; y-= 1; res = 1; break;
case 2: y-= 1; res = 1; break;
case 3: x + = 1; y-= 1; res = 1; break;
case 4: x-= 1; res = 1; break;
case 5: x + = 1; res = 1; break;
case 6: x-= 1; y + = 1; res = 1; break;
case 7: y + = 1; res = 1; break;
case 8: x + = 1; y + = 1; res = 1; break;
}
return res;
}
void __fastcall TfrmLineSeg:: FormCanResize (TObject * Sender, int & NewWidth,
int & NewHeight, bool & Resize)
{
if (NewHeight <300) Resize = false;
}
//------------------------------------------------ ---------------------------
void TfrmLineSeg:: ZoomTo (double z)
{
if (z <0.1) zoom = 0.1f;
else if (z> maxzoom) zoom = maxzoom;
else zoom = z;
Image1-> Width = int (Image1-> Picture-> Width * zoom);
Image1-> Height = int (Image1-> Picture-> Height * zoom);
DrawGrid ();
ShowInfo (-1, -1);
}
//------------------------------------------------ ---------------------------
AnsiString TfrmLineSeg:: VectToStr (int v)
{
switch (v)
{
case 1: return ("LU");
case 2: return ("U");
case 3: return ("RU");
case 4: return ("L");
case 5: return ("R");
case 6: return ("LD");
case 7: return ("D");
case 8: return ("RD");
case -1: return ("LUn");
case -2: return ("Un");
case -3: return ("RUn");
case -4: return ("Ln");
case -5: return ("Rn");
case -6: return ("LDn");
case -7: return ("Dn");
case -8: return ("RDn");
default: return ("");
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actNewFileExecute (TObject * Sender)
{
if (frmImgSize-> ShowModal () == mrOk)
{
try
{
w = StrToInt (frmImgSize-> edtWidth-> Text);
h = StrToInt (frmImgSize-> edtHeight-> Text);
Image1-> Picture-> Bitmap-> Width = w;
Image1-> Picture-> Bitmap-> Height = h;
Image1-> Width = w;
Image1-> Height = h;
Image1-> Canvas-> FillRect (Image1-> ClientRect);
zoom = 1.0f;
scb1-> Enabled = true;
for (int i = 0; i <= w-1; i + +) / / maxw-1
for (int j = 0; j <= h-1; j + +) / / maxh-1
{
apix [i] [j] [0] = Image1-> Canvas-> Pixels [i] [j] == c0? 1:0;
apix [i] [j] [1] = apix [i] [j] [2] =- 1;
}
}
catch (...)
{
MessageBox (Handle, "Невірно вказано число", "Помилка", MB_OK);
}
DrawGrid ();
ShowInfo (-1, -1);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actGridCheckExecute (TObject * Sender)
{
ValidateView ();
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actLightCheckExecute (TObject * Sender)
{
ValidateView ();
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actZoom10Execute (TObject * Sender)
{
ZoomTo ( 10.0f );
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actLineLightCheckExecute (TObject * Sender)
{
ValidateView ();
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void TfrmLineSeg:: wlog (AnsiString s)
{
if (logs)
if (s! = "")
MemoLog-> Lines-> Add (s);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actSegLightCheckExecute (TObject * Sender)
{
ValidateView ();
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void TfrmLineSeg:: ValidateView ()
{
Image2-> Visible = actGridCheck-> Checked
| | ActLightCheck-> Checked
| | ActLineLightCheck-> Checked
| | ActSegLightCheck-> Checked;
}
double TfrmLineSeg:: plDistance (double x, double y, double x1, double y1, double x2, double y2)
{
double R = 0.0f;
try
{
R = ((y1-y2) * x + (x2-x1) * y + (x1 * y2-x2 * y1)) / sqrt ((x2-x1) * (x2-x1) + (y2-y1) * (y2 -y1));
}
catch (...)
{}
return fabs (R);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actLockViewExecute (TObject * Sender)
{
ValidateView ();
}
//------------------------------------------------ ---------------------------
AnsiString TfrmLineSeg:: StrToLen (AnsiString str, int len)
{
AnsiString s = str;
while (s.Length () <len) s = "" + s;
return s;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: NeigNode (int x, int y, int n)
{
int i, j;
AnsiString s;
if (x <0 | | y <0 | | x> = w | | y> = h) return; / / якщо не належить області зображення
if (apix [x] [y] [0]! = 1) return; / / якщо не є точкою
if (apix [x] [y] [2]! =- 1) return; / / якщо вже оброблена на приналежність вузлу
if (NeigCount (x, y) <= 2) return; / / якщо мало сусідів для сегментації
if (apix [x] [y] [2] ==- 1) / / якщо точка не оброблена
apix [x] [y] [2] = n; / / точка буде належати вузла n
/ / Wlog (IntToStr (x )+","+ IntToStr (y));
/ / Обробляємо її сусідів
NeigNode (x-1, y-1, n); NeigNode (x, y-1, n); NeigNode (x +1, y-1, n);
NeigNode (x-1, y, n); NeigNode (x +1, y, n);
NeigNode (x-1, y +1, n); NeigNode (x, y +1, n); NeigNode (x +1, y +1, n);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actAnalyzeNodeExecute (TObject * Sender)
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Пошук вузлів ...";
AnsiString s;
TPoint p;
int i, j, x, y, x1, y1, x2, y2, ssize, nsegs, v, oldv;
for (i = 0; i <= w-1; i + +) / / maxw-1
for (j = 0; j <= h-1; j + +) / / maxh-1
apix [i] [j] [2] =- 1;
i = 0; j = 0;
nsegs = 0;
wlog ("Пошук вузлів ...");
while (j <h)
{
while (i <w)
{
if (apix [i] [j] [0] == 1 / / є точка
& & Apix [i] [j] [2] ==- 1 / / не оброблена на приналежність вузлу
& & NeigCount (i, j)> 2) / / є частиною вузла
{/ / Починаємо виділення вузла
nsegs + = 1;
wlog ("Знайдений вузол №" + IntToStr (nsegs));
/ / Wlog ("Точки в області вузла:");
NeigNode (i, j, nsegs); / / обробляємо точки навколо вузла
p = NodeCentre (nsegs);
wlog ("Координати вузла:" + IntToStr (px )+","+ IntToStr (h-1-py));
}
i + = 1;
} / / While i
i = 0; j + = 1;
} / / While j
DrawGrid ();
wlog ("Пошук вузлів завершено");
wlog ("ВСЬОГО ВУЗЛІВ:" + IntToStr (nsegs));
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: NeigLine (int x, int y, int n)
{
int nc = NeigCount (x, y);
if (nc == 1 | | nc == 2) / / якщо початок або продовження лінії
{
apix [x] [y] [1] = n;
wlog (IntToStr (x )+","+ IntToStr (h-1-y));
/ / Якщо (є точка І не оброблена на приналежність лінії)
if (apix [x-1] [y-1] [0] == 1 & & apix [x-1] [y-1] [1] ==- 1) NeigLine (x-1, y-1, n );
if (apix [x] [y-1] [0] == 1 & & apix [x] [y-1] [1] ==- 1) NeigLine (x, y-1, n);
if (apix [x +1] [y-1] [0] == 1 & & apix [x +1] [y-1] [1] ==- 1) NeigLine (x +1, y-1, n );
if (apix [x-1] [y] [0] == 1 & & apix [x-1] [y] [1] ==- 1) NeigLine (x-1, y, n);
if (apix [x +1] [y] [0] == 1 & & apix [x +1] [y] [1] ==- 1) NeigLine (x +1, y, n);
if (apix [x-1] [y +1] [0] == 1 & & apix [x-1] [y +1] [1] ==- 1) NeigLine (x-1, y +1, n );
if (apix [x] [y +1] [0] == 1 & & apix [x] [y +1] [1] ==- 1) NeigLine (x, y +1, n);
if (apix [x +1] [y +1] [0] == 1 & & apix [x +1] [y +1] [1] ==- 1) NeigLine (x +1, y +1, n );
}
else if (nc> 2) / / з'єднання з вузлом
{
apix [x] [y] [1] = n;
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actAnalyzeSegExecute (TObject * Sender)
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Пошук сегментів ліній ...";
AnsiString s;
int i, j, x, y, x1, y1, x2, y2, llen, nlines, v, oldv;
for (i = 0; i <= w-1; i + +) / / maxw-1
for (j = 0; j <= h-1; j + +) / / maxh-1
apix [i] [j] [1] =- 1;
i = 0; j = 0;
nlines = 0;
wlog ("Пошук сегментів ...");
while (j <h)
{
while (i <w)
{
if (apix [i] [j] [0] == 1 / / є точка
& & Apix [i] [j] [1] ==- 1 / / і вона не оброблена на приналежність сегменту лінії
& & (NeigCount (i, j) == 1 / / і є початком (1 сусід)
| | NeigCount (i, j) == 2)) / / чи продовженням лінії (2 сусіда)
{/ / Починаємо виділення сегменту
nlines + = 1;
wlog ("Знайдений сегмент №" + IntToStr (nlines) + ": [" + IntToStr (i )+","+ IntToStr (h-1-j )+"]");
wlog ("Точки сегмента:");
NeigLine (i, j, nlines); / / обробляємо сегмент лінії
}
i + = 1;
} / / While i
i = 0; j + = 1;
} / / While j
DrawGrid ();
wlog ("Пошук сегментів завершено");
wlog ("ВСЬОГО СЕГМЕНТІВ:" + IntToStr (nlines));
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actMatchLinesExecute (TObject * Sender)
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Пошук ліній ...";
int i, j, cline, cseg, x, y;
double dist, mindist;
TPoint p;
wlog ("Пошук ліній ...");
for (i = 0; i <= w-1; i + +) / / maxw-1
for (j = 0; j <= h-1; j + +) / / maxh-1
apix [i] [j] [3] =- 1;
i = 0; j = 0;
while (j <h)
{
while (i <w)
{
if (apix [i] [j] [1]> 0 & & apix [i] [j] [2]> 0 / / є з'єднання з сегментом
& & Apix [i] [j] [3] ==- 1 / / крапка не оброблена
)
{/ / Обробляємо крапку і виконуємо пошук їй відповідної
apix [i] [j] [3] = 1;
cline = apix [i] [j] [1]; / / поточна лінія
cseg = apix [i] [j] [2]; / / поточний сегмент
p = NodeCentre (cseg);
mindist = MAXDOUBLE;
x = y =- 1;
wlog ("Пошук відповідності фрагменту" + IntToStr (apix [i] [j] [1]) + "[" + IntToStr (i )+","+ IntToStr (j )+"]");
wlog ("Центр сегмента" + IntToStr (cseg) + "[" + IntToStr (px )+","+ IntToStr (py )+"]");
for (int j1 = 0; j1 <h; j1 + +) / / пошук точки відповідності
for (int i1 = 0; i1 <w; i1 + +)
{
if (apix [i1] [j1] [0] == 1 / / є точка
& & Apix [i1] [j1] [3] ==- 1 / / не оброблена на відповідність ліній
& & Apix [i1] [j1] [1]> 0 & & apix [i1] [j1] [2] == cseg / / є перетином цього сегмента з однією з ліній
)
{
if ((dist = plDistance (px, py, i, j, i1, j1)) <= mindist) / / якщо утворює найменше відхилення від центру сегмента
{/ / Запам'ятовуємо точку як найбільш підходящу
x = i1; y = j1;
mindist = dist;
wlog ("["+ IntToStr (i1 )+","+ IntToStr (j1) + "] - соотв.:" + FloatToStr (dist));
}
else
{
wlog ("["+ IntToStr (i1 )+","+ IntToStr (j1) + "] - не соотв:" + FloatToStr (dist));
}
}
}
if (x> 0 & & y> 0)
{
wlog ("Знайдено відповідність фрагментів:" + IntToStr (cline) + "і" + IntToStr (apix [x] [y] [1]));
apix [x] [y] [3] = 1; / / точка оброблена
FillLine (apix [x] [y] [1], cline); / / заповнюємо лінію
}
}
i + = 1;
} / / While i
i = 0; j + = 1;
} / / While j
DrawGrid ();
wlog ("Line matching end");
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: FillLine (int n1, int n2)
{
for (int i = 0; i <= w-1; i + +) / / maxw-1
for (int j = 0; j <= h-1; j + +) / / maxh-1
if (apix [i] [j] [1] == n1) apix [i] [j] [1] = n2;
}
//------------------------------------------------ ---------------------------
TPoint TfrmLineSeg:: NodeCentre (int n)
{
int i = 0, j = 0, cnt = 0, xsum = 0, ysum = 0, x = 0, y = 0;
while (j <h)
{
while (i <w)
{
if (apix [i] [j] [2] == n / / точка належить цьому вузлу
/ / & & Apix [i] [j] [1]> 0 / / є перетин з лінією
)
{
xsum + = i;
ysum + = j;
cnt + = 1;
}
i + = 1;
} / / While i
i = 0; j + = 1;
} / / While j
if (cnt> 0)
{
x = xsum / cnt;
y = ysum / cnt;
}
return Point (x, y);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actZoomWndExecute (TObject * Sender)
{
if (w> 0 | | h> 0)
{
zoom = min (scb1-> Width, scb1-> Height) / max (w, h);
ZoomTo (zoom);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: GetLineVect (int x, int y, int n)
{
TPoint p;
if (apix [x] [y] [1] == n & & apix [x] [y] [3] ==- 1) / / належить цій лінії і не оброблена в код
{
/ / Обробка поточної точки
apix [x] [y] [3] = 1;
if (linecode =="")
linecode + = IntToStr (x )+","+ IntToStr (y);
else
linecode +=","+ IntToStr (x )+","+ IntToStr (h-1-y);
/ / Обрабтка продовження лінії
if (apix [x] [y] [2]> 0) / / якщо перетин з сегментом
{/ / Обробка лінії усередині сегмента
p = FindMatch (x, y);
CodeLine (x, y, px, py); / / вивід коду лінії усередині сегмента
x = px;
y = py;
apix [x] [y] [3] = 1;
if (linecode =="")
linecode + = IntToStr (x )+","+ IntToStr (y);
else
linecode +=","+ IntToStr (x )+","+ IntToStr (h-1-y);
}
GetLineVect (x-1, y-1, n); GetLineVect (x, y-1, n); GetLineVect (x +1, y-1, n);
GetLineVect (x-1, y, n); GetLineVect (x +1, y, n);
GetLineVect (x-1, y +1, n); GetLineVect (x, y +1, n); GetLineVect (x +1, y +1, n);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: CodeLine (int x1, int y1, int x2, int y2)
{
wlog ("Кодування лінії [" + IntToStr (x1 )+","+ IntToStr (h-1-y1 )+"]-["+ IntToStr (x2 )+","+ IntToStr (h-1-y2) + "]:");
if (abs (x1-x2)> abs (y1-y2)) / / точок по x більше
{
wlog ("Цикл по осі x. Точки лінії:");
int x, y, xa = min (x1, x2), xb = max (x1, x2);
double k = double (y2-y1) / (x2-x1), b = y1-x1 * k;
x = xa +1;
while (x <xb)
{
y = k * x + b;
if (linecode =="")
linecode + = IntToStr (x )+","+ IntToStr (h-1-y);
else
linecode +=","+ IntToStr (x )+","+ IntToStr (h-1-y);
wlog (IntToStr (x )+","+ IntToStr (h-1-y));
x + = 1;
}
}
else / / точок по y більше
{
wlog ("Цикл по осі y. Точки лінії:");
int x, y, ya = min (y1, y2), yb = max (y1, y2);
double k = double (x2-x1) / (y2-y1), b = x1-y1 * k;
y = ya +1;
while (y <yb)
{
x = k * y + b;
if (linecode =="")
linecode + = IntToStr (x )+","+ IntToStr (h-1-y);
else
linecode +=","+ IntToStr (x )+","+ IntToStr (h-1-y);
wlog (IntToStr (x )+","+ IntToStr (h-1-y));
y + = 1;
}
}
}
//------------------------------------------------ ---------------------------
TPoint __fastcall TfrmLineSeg:: FindMatch (int x, int y)
{
int i, j;
TPoint p;
px = x;
py = y;
i = 0; j = 0;
while (j <h)
{
while (i <w)
{
if (apix [i] [j] [1] == apix [x] [y] [1] / / якщо належить тій же лінії
& & Apix [i] [j] [2] == apix [x] [y] [2] / / і належить тому ж сегменту
& & (I! = x | | j! = y) / / і це інша точка
)
{/ / Це шукана точка
px = i;
py = j;
}
i + = 1;
} / / While i
i = 0; j + = 1;
} / / While j
return p;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actMatchOutExecute (TObject * Sender)
{
int i, j, lineno, lnum;
sb1-> SimplePanel = true; sb1-> SimpleText = "Виведення коду ліній ...";
for (j = 0; j <h; j + +) / / ініціалізація масиву тимчасових атрибутів
for (i = 0; i <w; i + +)
apix [i] [j] [3] =- 1;
MemoOut-> Clear ();
lnum = 0;
for (j = 0; j <h; j + +)
for (i = 0; i <w; i + +)
{
if (apix [i] [j] [1]> 0 / / є лінія
& & Apix [i] [j] [3] ==- 1 / / і вона не оброблена
& & (NeigCount (i, j) == 1 / / точка є початком лінії
| | Apix [i] [j] [2]> 0) / / або вузлом
)
{/ / Формуємо код для цієї лінії
lineno = apix [i] [j] [1];
lnum + = 1;
linecode = "";
GetLineVect (i, j, lineno);
MemoOut-> Lines-> Add (IntToStr (lnum )+":"+ linecode);
wlog (IntToStr (lnum) + "(line #" + IntToStr (lineno )+"):"+ linecode);
}
}
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actOpenArrayExecute (TObject * Sender)
{
int i, j;
AnsiString s;
OpenDialog1-> Title = "Відкрити масив точок";
OpenDialog1-> Filter = "Файли масивів точок (*. dat) | *. dat | Всі файли (*.*)|*.*";
if (OpenDialog1-> Execute ())
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Відкриття масиву точок ...";
mArray-> Lines-> LoadFromFile (OpenDialog1-> FileName);
try
{
w = StrToInt (mArray-> Lines-> Strings [0]);
h = StrToInt (mArray-> Lines-> Strings [1]);
if (w> 0 & h> 0)
{
Image1-> Picture-> Bitmap-> Width = w;
Image1-> Picture-> Bitmap-> Height = h;
Image1-> Width = w;
Image1-> Height = h;
Image1-> Canvas-> FillRect (Image1-> ClientRect);
scb1-> Enabled = true;
ZoomTo (zoom);
for (j = 0; j <h; j + +)
{
s = mArray-> Lines-> Strings [j +2];
for (i = 0; i <w; i + +)
{
apix [i] [j] [1] = apix [i] [j] [2] = apix [i] [j] [3] =- 1;
if (s [i +1] == "1") / / є точка
{
apix [i] [j] [0] = 1;
Image1-> Canvas-> Pixels [i] [j] = c0;
}
else / / ні точки
{
apix [i] [j] [0] = 0;
Image1-> Canvas-> Pixels [i] [j] = c1;
}
}
}
}
else
throw Exception ("");
}
catch (...)
{
MessageBox (Handle, "Помилка відкриття масиву", "ПОМИЛКА", MB_OK);
}
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actSaveArrayExecute (TObject * Sender)
{
int i, j;
AnsiString s;
SaveDialog1-> Filter = "Файли масивів точок (*. dat) | *. dat | Всі файли (*.*)|*.*";
SaveDialog1-> DefaultExt = "*. dat";
SaveDialog1-> Title = "Зберегти масив точок";
if (SaveDialog1-> Execute ())
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Запис масиву точок ...";
mArray-> Clear ();
mArray-> Lines-> Add (IntToStr (w));
mArray-> Lines-> Add (IntToStr (h));
for (j = 0; j <h; j + +)
{
s = "";
for (i = 0; i <w; i + +)
{
s + = apix [i] [j] [0] == 1? '1 ': 0 ";
}
mArray-> Lines-> Add (s);
}
mArray-> Lines-> SaveToFile (SaveDialog1-> FileName);
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actOptionsExecute (TObject * Sender)
{
frmOptions-> Label1-> Font-> Color = c5;
frmOptions-> Label2-> Font-> Color = c2;
frmOptions-> Label3-> Font-> Color = c3;
frmOptions-> Label4-> Font = MemoLog-> Font;
frmOptions-> Label5-> Font = MemoOut-> Font;
frmOptions-> cbLogs-> Checked = logs;
if (frmOptions-> ShowModal () == mrOk)
{
try
{
c5 = frmOptions-> Label1-> Font-> Color;
c2 = frmOptions-> Label2-> Font-> Color;
c3 = frmOptions-> Label3-> Font-> Color;
MemoLog-> Font = frmOptions-> Label4-> Font;
MemoOut-> Font = frmOptions-> Label5-> Font;
logs = frmOptions-> cbLogs-> Checked;
}
catch (...)
{
MessageBox (Handle, "Невірно вказано число", "Помилка", MB_OK);
}
DrawGrid ();
ShowInfo (-1, -1);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actSaveCodeExecute (TObject * Sender)
{
SaveDialog1-> Filter = "Файли кодів ліній (*. lsc) | *. lsc | Всі файли (*.*)|*.*";
SaveDialog1-> DefaultExt = "*. lsc";
SaveDialog1-> Title = "Зберегти коди ліній";
if (SaveDialog1-> Execute ())
{
MemoOut-> Lines-> SaveToFile (SaveDialog1-> FileName);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: GetLineVect2 (int x, int y, int n)
{
TPoint p;
if (apix [x] [y] [1] == n & & apix [x] [y] [3] ==- 1) / / належить цій лінії і не оброблена в код
{
/ / Обробка поточної точки
if (NeigCount (x, y) == 1) / / якщо кінець лінії
{/ / Обробка кінця лінії
if (nodescnt == 0) / / якщо не було знайдено кінцевих точок
{
nodescnt + = 1;
xs1 = x; ys1 = 1; / / перша координата
}
else if (nodescnt == 1) / / якщо вже є одна кінцева точка
{
}
apix [x] [y] [3] = 1;
xs1 = x;
ys1 = y;
nodescnt + = 1;
}
else if (apix [x] [y] [2]> 0) / / якщо починається вузол
{
}
else / / продовження лінії, продовжуємо обробку
{
GetLineVect (x-1, y-1, n); GetLineVect (x, y-1, n); GetLineVect (x +1, y-1, n);
GetLineVect (x-1, y, n); GetLineVect (x +1, y, n);
GetLineVect (x-1, y +1, n); GetLineVect (x, y +1, n); GetLineVect (x +1, y +1, n);
}
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actSegCodeOutExecute (TObject * Sender)
{
int i, j, lineno, lnum;
sb1-> SimplePanel = true; sb1-> SimpleText = "Виведення коду сегментів ...";
for (j = 0; j <h; j + +) / / ініціалізація масиву тимчасових атрибутів
for (i = 0; i <w; i + +)
apix [i] [j] [3] =- 1;
MemoOut-> Clear ();
lnum = 0;
for (j = 0; j <h; j + +)
for (i = 0; i <w; i + +)
{
if (apix [i] [j] [1]> 0 / / є сегмент
& & Apix [i] [j] [3] ==- 1 / / і він не оброблений
& & (NeigCount (i, j) == 1 / / точка є початком сегмента
| | NeigCount (i, j) == 2) / / чи продовженням сегмента
)
{/ / Формуємо код для цієї лінії
xs1 = ys1 = xs2 = ys2 = xs3 = ys3 =- 1;
nodescnt = 0;
lineno = apix [i] [j] [1];
lnum + = 1;
linecode = "";
GetLineVect2 (i, j, lineno);
MemoOut-> Lines-> Add (IntToStr (lnum )+":"+ linecode);
wlog (IntToStr (lnum) + "(line #" + IntToStr (lineno )+"):"+ linecode);
}
}
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
//------------------------------------------------ ---------------------------
П .3.3. Текст модуля lsimgsize.h
//------------------------------------------------ ---------------------------
# Ifndef lsImgSizeH
# Define lsImgSizeH
//------------------------------------------------ ---------------------------
# Include <Classes.hpp>
# Include <Controls.hpp>
# Include <StdCtrls.hpp>
# Include <Forms.hpp>
//------------------------------------------------ ---------------------------
class TfrmImgSize: public TForm
{
__published: / / IDE-managed Components
TButton * btnOK;
TButton * btnCancel;
TEdit * edtWidth;
TEdit * edtHeight;
TLabel * Label1;
TLabel * Label2;
void __fastcall btnCancelClick (TObject * Sender);
private: / / User declarations
public: / / User declarations
__fastcall TfrmImgSize (TComponent * Owner);
};
//------------------------------------------------ ---------------------------
extern PACKAGE TfrmImgSize * frmImgSize;
//------------------------------------------------ ---------------------------
# Endif
П 3.4. Текст модуля lsimgsize.cpp
//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
# Include "LineSeg.h"
# Include "lsImgSize.h"
//------------------------------------------------ ---------------------------
# Pragma package (smart_init)
# Pragma resource "*. dfm"
TfrmImgSize * frmImgSize;
//------------------------------------------------ ---------------------------
__fastcall TfrmImgSize:: TfrmImgSize (TComponent * Owner)
: TForm (Owner)
{
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmImgSize:: btnCancelClick (TObject * Sender)
{
Close ();
}
//------------------------------------------------ ---------------------------
П .3.5. Текст модуля lsoptions.h
//------------------------------------------------ ---------------------------
# Ifndef lsOptionsH
# Define lsOptionsH
//------------------------------------------------ ---------------------------
# Include <Classes.hpp>
# Include <Controls.hpp>
# Include <StdCtrls.hpp>
# Include <Forms.hpp>
# Include <Dialogs.hpp>
//------------------------------------------------ ---------------------------
class TfrmOptions: public TForm
{
__published: / / IDE-managed Components
TButton * btnOk;
TButton * btnCancel;
TColorDialog * ColorDialog1;
TFontDialog * FontDialog1;
TCheckBox * cbLogs;
TGroupBox * gbColors;
TLabel * Label1;
TLabel * Label2;
TLabel * Label3;
TGroupBox * gbFonts;
TLabel * Label4;
TLabel * Label5;
void __fastcall btnCancelClick (TObject * Sender);
void __fastcall Label1MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Label2MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Label3MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Label4MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Label5MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
private: / / User declarations
public: / / User declarations
__fastcall TfrmOptions (TComponent * Owner);
};
//------------------------------------------------ ---------------------------
extern PACKAGE TfrmOptions * frmOptions;
//------------------------------------------------ ---------------------------
# Endif
П .3.6. Текст модуля lsoptions.cpp
//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
# Include "lsOptions.h"
//------------------------------------------------ ---------------------------
# Pragma package (smart_init)
# Pragma resource "*. dfm"
TfrmOptions * frmOptions;
//------------------------------------------------ ---------------------------
__fastcall TfrmOptions:: TfrmOptions (TComponent * Owner)
: TForm (Owner)
{
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: btnCancelClick (TObject * Sender)
{
Close ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: Label1MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ColorDialog1-> Color = Label1-> Font-> Color;
if (ColorDialog1-> Execute ())
Label1-> Font-> Color = ColorDialog1-> Color;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: Label2MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ColorDialog1-> Color = Label2-> Font-> Color;
if (ColorDialog1-> Execute ())
Label2-> Font-> Color = ColorDialog1-> Color;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: Label3MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ColorDialog1-> Color = Label3-> Font-> Color;
if (ColorDialog1-> Execute ())
Label3-> Font-> Color = ColorDialog1-> Color;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: Label4MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
FontDialog1-> Font = Label4-> Font;
if (FontDialog1-> Execute ())
Label4-> Font = FontDialog1-> Font;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmOptions:: Label5MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
FontDialog1-> Font = Label5-> Font;
if (FontDialog1-> Execute ())
Label5-> Font = FontDialog1-> Font;
}
//------------------------------------------------ ---------------------------
П .3.7. Текст модуля prjlineseg.cpp
//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
//------------------------------------------------ ---------------------------
USEFORM ("LineSeg.cpp", frmLineSeg);
USEFORM ("lsImgSize.cpp", frmImgSize);
USEFORM ("lsOptions.cpp", frmOptions);
//------------------------------------------------ ---------------------------
WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application-> Initialize ();
Application-> Title = "Лінійна сегментація";
Application-> CreateForm (__classid (TfrmLineSeg), & frmLineSeg);
Application-> CreateForm (__classid (TfrmImgSize), & frmImgSize);
Application-> CreateForm (__classid (TfrmOptions), & frmOptions);
Application-> Run ();
}
catch (Exception & exception)
{
Application-> ShowException (& exception);
}
catch (...)
{
try
{
throw Exception ("");
}
catch (Exception & exception)
{
Application-> ShowException (& exception);
}
}
return 0;
}
//------------------------------------------------ ---------------------------
1.1.1. Призначення системи
Система автоматизованого аналізу просторової структури зображень осуществляюет обробку різноманітного роду зображень, яка включає в себе їх фільтрацію, аналіз структурних елементів зображень, отримання опису зображень, візуалізацію, сегментацію і кодування отриманих даних про зображення. Узагальнена структурна схема системи представлена ​​на рис. 1.1.

Структурна схема системи автоматизованого аналізу
просторової структури зображень

Рис. 1.1
Процес обробки зображення починається з його фільтрації. На вході системи є зображення, отримане будь-яким способом і ще не підготовлене до обробки. На даному етапі в залежності від складу зображення виконується підбір фільтрів для обробки зображення. За допомогою різного роду вибраних фільтрів усуваються випадкові перешкоди, зайві крапки, не несуть інформації про структурні елементи зображення, виділяються основні елементи. Дана обробка здійснюється в підсистемах формування центроїдне фільтрів і центроїдне фільтрації. Після фільтрації зображення можна піддавати подальшій обробці в наступних підсистемах:
- Підсистема центроїдне релаксації, яка здійснює виділення кривих, кутів, кіл, визначення їх геометричних характеристик;
- Підсистема лінійної сегментації, що виконує обробку пересічних ліній, що утворюють вузли і сегменти;
- Підсистема ланцюгового кодування, що дозволяє в диференціальному кодованому вигляді подати лінії;
- Підсистема візуалізації, що здійснює графічне представлення файлів опису зображення, отриманих у результаті роботи підсистем розпізнавання зображень.
1.1.2. Обгрунтування мети створення системи
Кількість інформації, що обробляється на ЕОМ, незмінно збільшується. Це пов'язано і зі збільшенням вимог до якості даних, і зі збільшенням обсягів самих даних, обумовленим науково-технічним прогресом. Незважаючи на безперервне збільшення продуктивної потужності робочих станцій, каналів передачі даних, масивів зберігання інформації, обчислювальних ресурсів не завжди буває достатньо для своєчасної та якісної обробки інформації. У результаті відбувається збільшення обсягів оброблюваної інформації за рахунок погіршення її якості.
При обробці графічних даних постійно виникають питання, пов'язані з вимогами до електронно-обчислювальних ресурсів. Графічні зображення завжди вимагали обробки великих обсягів даних. Необхідно мати можливість оптимізувати ресурсомісткі операції з обробки зображень за рахунок розробки алгоритмів аналізу та розуміння даних, представлених в растровому вигляді, що дозволяють отримувати описи цих даних, приводячи їх до векторного увазі. Векторна і кодованих форми подання інформації мають ряд переваг:
- Значне зменшення обсягів збереженої інформації;
- Збільшення швидкості та якості синтезу зображень;
- Акумуляція інформації з метою подальшого використання.
1.1.3. Призначення «Підсистеми лінійної сегментації»
У процесі обробки будь-якого графічного зображення виникає необхідність виділення його структурних одиниць. Одними з основних таких одиниць є різного роду лінії, присутні майже в кожному зображенні. Лінії, у свою чергу можуть перетинатися, розділяючись таким чином на сегменти і утворюючи вузли перетину. Виявлення вузлів і сегментів є важливим завданням аналізу будь-якого зображення. Ця підсистема призначена для автоматизації алгоритму знаходження вузлів і ліній на растровому зображенні, перетворюючи точки растра в координати вузлів і сегментів ліній, утворених ними.
1.1.4. Характеристика організаційної та функціональної структури
Для синтезу зображення потрібно наявність опису елементів зображення, яке виходить в результаті розпізнавання його елементів. Для побудови зображення, що складається з різного роду ліній, потрібен опис цих ліній, яке може бути представлене у вигляді ланцюгових кодів. Для отримання даних кодів необхідно провести аналіз зображення на наявність вузлових точок, що визначають початок і кінець лінії, а також області перетину ліній. Дану обробку виробляє підсистема лінійної сегментації, структурна схема якої представлена ​​на рис. 1.2.

1.1.5. Обгрунтування складу автоматизуються завдань
Розробляється підсистема повинна виконувати автоматичну обробку вхідної інформації, придатну для використання в інших підсистемах без додаткової обробки. Вона повинна правильно виконувати лінійну сегментацію зображення, виділяючи необхідні сегменти ліній і освіти вузлів. Підсистема повинна дозволяти обробляти різного роду зображення, коректно обробляючи зображення, не повністю відповідають висунутим вимогам вхідної інформації підсистеми у зв'язку з передбаченим автоматичним режимом роботи всієї системи. Таким чином автоматизується завдання отримання опису сегментів ліній, які формують зображення і вузлів, сформованих перетинами ліній.
Структурна схема підсистеми лінійної сегментації

Рис. 1.2
1.1.6. Обгрунтування застосування типових і оригінальних рішень
В якості технічного забезпечення робочої станції використовується IBM-сумісний персональний комп'ютер, оснащений русифікованої клавіатурою, маніпулятором типу «миша», монітором, накопичувачами на жорсткому диску. Даний склад технічних засобів був вибраний виходячи з їх доступності та досить високій надійності при оптимальних цінах. В якості цільової операційної системи обрана платформа Windows 2000/XP, що є на даний момент найбільш широко поширеною платформою загального призначення. Засобом розробки обрана система C + + Builder 6 фірми Borland. Вибір цієї мови обумовлений наявністю розвиненої середовища програмування і налагодження, його високою ефективністю створення робочих програм, і легкістю створення користувальницького інтерфейсу програми.
1.1.7. Загальна оцінка економічної доцільності створення підсистеми
Метою створення підсистеми лінійної сегментації є інтеграція її з іншими підсистемами в складі єдиної системи автоматизованого аналізу графічних зображень. Підсистема є невід'ємною частиною всієї системи, метою створення якої є можливість отримання описів графічних даних для зменшення обсягів збереженої і переданої інформації. Істотне практичне значення має завдання передачі графічної інформації з каналів зв'язку. В даний час широко використовується мережа Інтернет, проте передача інформації на великі відстані вимагає матеріальних витрат, безпосередньо залежать від обсягів переданої інформації. Передача графічних зображень у звичайному растровому вигляді завжди пов'язана з великими витратами. Великі обсяги інформації також позначаються на швидкості передачі даних, що впливає на оперативність та своєчасність отримання інформації.
Створення системи дозволить змінити такі показники, як:
- Обсяг збереженої інформації;
- Швидкість передачі інформації;
- Швидкість синтезу зображень;
- Обсяг знань про графічних зображеннях;
- Актуальність отримання графічної інформації;
- Можливість використання великих обсягів графічних даних в системах реального часу.
1.2. Основні вимоги до «підсистеми лінійної сегментації»
1.2.1. Основні цілі створення підсистеми
Метою створення підсистеми є інтеграція її до складу системи автоматизованого аналізу графічних зображень разом з іншими підсистемами. Підсистема виконує певний функції, будучи частиною всієї системи, метою створення якої є можливість отримання описів графічних даних для зменшення обсягів збереженої і переданої інформації. Основною метою системи є зменшення обсягів збереженої, прийнятої, оброблюваної та переданої інформації, а, отже, і підвищення швидкості виконання перерахованих операцій. Система також дозволить збільшити якість інформації за рахунок оптимізації алгоритмів представлення графічної інформації та економії ресурсів.
1.2.2. Функціональне призначення підсистеми
Підсистема лінійної сегментації призначена для виконання наступних функцій:
- Отримання зображення з різних джерел;
- Первинна обробка зображення при необхідності;
- Пошук вузлових елементів зображення;
- Пошук лінійних сегментів;
- Пошук приналежності точок зображення вузлів і сегментами ліній;
- Висновок координат розпізнаних сегментів ліній;
- Визначення напрямів кодування сегментів.
1.2.3. Вимоги до функціональної структури підсистеми
У зв'язку з тим, що підсистема лінійної сегментації призначена для автоматизації процесу обробки графічних зображень, то вона нерозривно пов'язана з іншими підсистемами. При визначенні характеристик вхідного зображення вирішується завдання його лінійної сегментації - пошук сегментів ліній, які формують зображення. Вхідними даними є зображення, що містить лінії різної форми одиничної товщини, розташовані в довільному порядку, серед яких можуть бути пересічні і розташовані окремо. Зображення даного типу формуються в результаті роботи підсистем фільтрації. Таким чином, перебування вузлів перетинів ліній і сегментів цих ліній, дозволяє отримати опис зображення, придатне для кодування у відповідність до обраного методу.
1.2.4. Вимоги до технічного забезпечення
Для ефективного виконання функцій підсистеми лінійної сегментації, необхідний наступний комплекс технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Повинні бути передбачені такі можливості, що забезпечують надійність її функціонування:
- Збереження працездатності підсистеми при неправильній роботі інших підсистем;
- Дублювання інформації;
- Перевірка даних, що вводяться на коректність.
1.2.5. Вимоги до інформаційного забезпечення
Система інформації повинна забезпечувати одержання тільки таких даних, які необхідні для правильного аналізу зображень, бути чіткою і короткою, створювати можливість своєчасного надходження достовірних даних, знаходження взаємопов'язаних характеристик, сумісності всіх вирішуваних завдань. Детальна схема інформаційного забезпечення повинна точно визначати:
- Характеристики оброблюваного зображення;
- Взаємні зв'язки всіх характеристик в процесі рішення;
- Процедури обробки описів структурних елементів;
- Форми обміну даними для узгодження роботи підсистем.
Система повинна мати таку форму організації інформаційного забезпечення, яка при мінімально необхідному потоці первинних відомостей на основі їх централізованої обробки в сукупності з довідковими елементами, дозволить отримати опису графічних зображень з можливість подальшого синтезу.
Отже, повинні забезпечуватися:
- Багаторазове використання даних;
- Формалізація процедур для машинної обробки даних;
- Установка чіткої послідовності обробки даних;
- Правильне використання накопиченої інформації.
1.2.6. Вимоги до програмного забезпечення
Програмне забезпечення повинно забезпечувати ефективне функціонування комплексу технічних засобів з метою вирішення завдань підсистеми лінійної сегментації. Пред'являються наступні вимоги до програмного забезпечення:
- Програми, що реалізують завдання підсистеми, мають функціонувати в середовищі операційної системи Microsoft Windows 98/Me/2000/XP/NT або вище;
- Система повинна бути автономною з точки зору використання стороннього програмного забезпечення;
- Система повинна бути здатна функціонувати з використанням тільки засобів операційної системи.
1.3. Основні технічні рішення проекту підсистеми «Лінійна сегментація»
1.3.1. Рішення з комплексу технічних засобів
Комплекс технічних засобів підсистеми «Лінійною сегментації» повинен бути складовою частиною системи автоматизованого аналізу просторової структури графічних зображень та забезпечувати реалізацію всіх автоматизованих функцій підсистеми (див. п. 1.2.2). Технічні засоби базуються на засобах обробки даних, на персональних ЕОМ і можуть бути доповнені засобами введення зображень (сканери, планшети рукописного введення, цифрові фотокамери) і виводу зображень (принтери, плоттери, графобудівники).
Планований комплекс технічних засобів для функціонування завдань реалізують підсистему «Лінійна сегментація» включає наступні технічні засоби:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
1.3.2. Опис організації інформаційної бази
Інформаційна база розробляється підсистеми включає в себе наступні структури даних:
Формат вхідного масиву точок
<M>
<N>
a 11, a 12, ..., a 1m
a 21, a 22, ..., a 2m
a n1, a n2, ..., a nm
де <M> - рядок, що містить число точок зображення по горизонталі;
<N> - Рядок, що містить число точок зображення по вертикалі;
a ij - елемент масиву точок, що відповідає точці зображення з координатами (i, j), може приймати значення «1» і «0».
Приклад вхідних даних:
8
8
00000000
01000000
00100000
00010000
11111111
00000100
00000010
00000000
Відповідне даного масиву зображення показано на рис. 1.3.
Відповідне зображення 8х8

Рис. 1.3
Формат опису сегментів ліній:
n 1: x 11, y 11 [, x 12, y 12 [, x 13, y 13]]
n 2: x 21, y 21 [, x 22, y 22 [, x 23, y 23]]
n k: x k1, y k1 [, x k2, y k2 [, x k3, y k3]]
де n i - номер i-го сегменту лінії (ідентифікатор);
x i 1, y i 1 - координати першої точки i-го сегменту лінії;
x i 2, y i 2 - координати другої точки i-го сегменту лінії, вказуються у тому випадку, якщо точка (x i 2, y i 2) є вузлом;
x i 3, y i 3 - координати напрямки кодування від точки (x i 1, y i 1), вказуються у тому випадку, якщо точки (x i 1, y i 1) і (x i 2, y i 2) є вузлами.

2. РОЗРОБКА ЗАВДАННЯ «ПОШУК ВУЗЛІВ»
2.1. Опис постановки завдання
2.1.1. Характеристика задачі
Завдання «Пошук вузлів» призначена для визначення наявності в складі оброблюваного зображення елементів, що представляють собою області перетину ліній. У процесі її виконання відбувається обхід масиву точок, що представляє зображення, з одночасним заповненням масиву елементів вузлів, розрахунком координат вузлів і підрахунком їх кількості. При цьому в масиві вузлів проводиться нумерація елементів, тим самим дозволяючи визначати, якому з вузлів належить та чи інша точка.
Значення, отримані при пошуку вузлів, використовуються надалі при виконанні пошуку сегментів ліній, а також при кодуванні ліній і отриманням координат сегментів при генерації опису графічного зображення.
2.1.2. Вхідна інформація
В якості вхідної інформації для даної задачі використовується двовимірний масив точок, сформований з файлу, формат якого описаний у пункті 1.3.2. Розміри масиву точок відповідає розмірам зображення, вказаним у файлі.
2.1.3. Вихідна інформація
Вихідною інформацією в даній задачі є масив вузлів, що утримуються на зображенні з зазначенням номера кожного вузла для подальшої їх ідентифікації. Дана інформація є проміжною і призначена для використання в інших завданнях підсистеми: при розпізнаванні сегментів ліній та виведенні остаточних результатів.
2.1.4. Математична постановка задачі
Спочатку всі зображення представлене у вигляді масиву точок, кожен елемент якого може приймати значення 1 або 0, де 1 відповідає наявності точки, а 0 - її відсутності. Таким чином, структурні елементи зображення представлені у вигляді наборів крапок, що мають значення 1.
Кожній одиниці зображення в масиві відповідає елемент масиву вузлів, значення якого розшифровується таким чином:
- Якщо значення елемента менше нуля, то елемент ще не був оброблений. Це необхідно при обході масиву точок для виключення повторної обробки елементів;
- Якщо значення дорівнює нулю, то це означає, що даному елементу не відповідає жоден з вузлів і, отже, відповідна точка в масиві точок не є вузлом;
- Якщо значення більше нуля, то воно являє собою номер вузла, якому відповідає дана точка.
Зображення представлено у вигляді ліній одиничної товщини, що означає, то кожна точка окремо розташованій лінії може мати не більше двох сусідніх точок, однозначно визначають напрямок руху лінії. Приклад лінії одиничної товщини наведено на рис. 2.1.

Лінія одиничної товщини

Рис. 2.1
Лінію еднінчной товщини можна представити наступним чином:
(2.1)
де N - кількість точок в лінії;
x t, y t - координати розглянутої точки a t;
K (x t, y t) - кількість точок, сусідніх з a t.
Функцію обчислення кількості сусідніх точок можна представити наступним чином:
(2.2)
де A - двовимірний масив точок, що представляють вихідне зображення;
x t, y t - координати розглянутої точки a t;
У даному випадку точки початку і кінця лінії мають тільки одну сусідню точку, однозначно визначає напрямок руху лінії. Всі інші точки лінії мають по 2 сусідніх точки, одна з яких є попередньою точкою лінії, інша - наступного. Це зображення не містить надлишкової інформації для опису лінії. Зображення, що містять лінії такого типу, можуть бути отримані за допомогою різних підсистем фільтрації. На рис. 2.2 наведено приклад лінії, не підходящої під дане опис. У зазначених на малюнку точках з'являється неоднозначність напрямку руху лінії, тому обведена точка вгорі малюнка і одна з обведених внизу можуть бути видалені без розриву лінії і принципово не змінюючи її форму.

Рис. 2.2
Таким чином, грунтуючись на безперервності і одиничності товщини лінії, можна стверджувати, що точки, що мають більш ніж 2 сусідніх, є вузловими і повинні бути розглянуті в якості областей перетину ліній.
Це можна представити у вигляді формул:
(2.3)
де (x, y) - координати розглянутої точки;
M і N - ширина і висота зображення;
B - масив вузлів, розмірність MxN;
n - номер оброблюваного вузла.
На рис. 2.3 наведено приклад перетину ліній, де виділені точки є вузловими.
Пошук вузлових елементів полягає в послідовному переборі елементів масиву точок. Проте при перетині ліній, показаному на рис. 2.4, точки, що є сусідами з вузлом, мають також кількість сусідів, більше двох, виникає ситуація «розмитості» вузлової точки. Дана проблема може бути вирішена обчисленням центру вузла, координати якого можуть бути отримані за допомогою обчислення середнього арифметичного всіх точок, що належать вузлу.
Приклад перетину ліній

Рис. 2.3
Тут треба відзначити, що дві точки можна вважати належать одному вузлу, якщо існує шлях, що з'єднує ці дві точки, кожна з точок якого є що належить вузлу. Дана концепція отримання вузлових точок дозволяє обробляти зображення, що містять «розмиті» перетину ліній.
Точки навколо вузла

Рис. 2.4
2.1.5. Спеціальні вимоги до технічного забезпечення
Вимоги до технічного забезпечення для вирішення завдання «Пошук вузлів» повністю збігаються з вимогами до комплексу технічних засобів, пред'явленими при розробці підсистеми «Лінійна сегментація» (див. п. 1.3.1).
Реалізація завдання можлива при наявності набору таких технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Робота програми можлива тільки на ЕОМ, які підтримують 32-розрядні операційні системи сімейства Windows, такі як Windows 95, Windows NT або вище. Як зазначено вище, робота може вестися на ЕОМ з процесором не нижче Intel Pentium. Але бажано використовувати ЕОМ з процесором не нижче класу Intel Pentium II, який працює більш ефективно.

2.2. Опис алгоритму «Пошук вузлів»
2.2.1. Призначення і характеристика
Алгоритм «Пошук вузлів» призначений для пошуку вузлових точок в елементах зображення. Він являє собою послідовний обхід масиву точок з рекурсивним визначенням вузлових областей та подальшим заповненням масиву вузлів.
2.2.2. Використовувана інформація
В якості вхідної інформації використовується двовимірний масив точок, що представляє опис вхідного зображення, описаного в пункті 1.3.2.
2.2.3. Результати рішення
Алгоритм формує значення елементів масиву вузлів, що утримуються на зображенні з зазначенням номера кожного вузла для подальшої їх ідентифікації. Дана інформація є проміжною і призначена для використання в інших завданнях підсистеми: при розпізнаванні сегментів ліній та виведенні остаточних результатів.
2.2.4. Алгоритм рішення
Алгоритм рішення складений з урахуванням математичного опису, наведеного в пункті 2.1.4. Алгоритм представляється в текстовому вигляді наступним чином:
1. Початок;
2. Ініціалізація масиву вузлів;
3. i = 0; j = 0; z = 0;
4. Якщо j> = N, то перехід до п.11;
5. Якщо i> = M, то перехід до п.10;
6. Якщо (apix [i] [j] = 1) і (apix2 [i] [j] <0) і (NeigCount (i, j)> 2), то перехід до п.7, інакше до п.9;
7. z = z +1;
8. NodeSelect (i, j, z);
9. i = i +1; перехід до п.5;
10. i = 0; j = j +1; перехід до п.4;
11. Кінець.
Для контрольного прикладу необхідно підібрати таке зображення, щоб воно охоплювало різні типи перетинів. Зображення не повинно містити циклічних елементів: замкнутих ліній, суцільних зафарбованих областей, в іншому випадку може статися неправильне розпізнавання вузлів.
2.2.6. Умовні позначення
У таблиці 2.1 представлені умовні позначення, введені в тексті підрозділу
Таблиця 2.1
Умовні позначення
Умовні позначення
Розшифровка
M
ширина вхідного зображення
N
висота вхідного зображення
apix [M] [N]
вихідний масив точок
apix2 [M] [N]
масив вузлів
NeigCount
функція обчислення кількості сусідніх точок
NodeSelect (x, y, n)
рекурсивна функція виділення вузлових точок, x, y - координати початку виділення, n - номер вузла
Z
номер поточного вузла

2.3. Опис програми «Пошук вузлів»
2.3.1. Вступна частина
Програма «Пошук вузлів», що позначається як AnalyzeNode, призначена для визначення наявності в складі оброблюваного зображення елементів, що представляють собою області перетину ліній. У процесі її виконання відбувається обхід масиву точок, що представляє зображення, з одночасним заповненням масиву елементів вузлів, розрахунком координат вузлів і підрахунком їх кількості. При цьому в масиві вузлів проводиться нумерація елементів, тим самим дозволяючи визначати, якому з вузлів належить та чи інша точка. Значення, отримані при пошуку вузлів, використовуються надалі при виконанні пошуку сегментів ліній, а також при кодуванні ліній і отриманням координат сегментів при генерації опису графічного зображення.
2.3.2. Функціональне призначення
Програма «Пошук вузлів» призначена виділення в складі оброблюваного зображення елементів, що представляють собою області перетину ліній, звані вузлами. Програма працює з масивом точок, що представляють вихідне зображення. У процесі її виконання відбувається обхід даного масиву точок, з одночасним заповненням масиву елементів вузлів, розрахунком координат вузлів і підрахунком їх кількості. При цьому в масиві вузлів проводиться нумерація елементів, тим самим дозволяючи визначати, якому з вузлів належить та чи інша точка. Значення, отримані при пошуку вузлів, використовуються надалі при виконанні пошуку сегментів ліній, а також при кодуванні ліній і отриманням координат сегментів при генерації опису графічного зображення. Програма розрахована на роботу в операційних системах сімейства Windows, таких як Windows 9x, Windows NT або вище. Тому вимоги програми до пам'яті залежать від операційної системи. У цих операційних системах при виділенні пам'яті використовується файл підкачки Windows, в якому можна адресувати до 2 Гбайт віртуальної пам'яті. Але при зверненні до диска швидкість роботи падає. Для Windows 95 оптимальний обсяг оперативної пам'яті 32 Мбайт, для Windows NT - 64 Мбайт. На вінчестері програмі досить мати 100 Мбайт дискового простору.
2.3.3. Опис інформації
В якості вхідної інформації використовується двовимірний масив точок, що представляє вихідне зображення. Розміри масиву точок відповідає розмірам оброблюваного зображення. Програма формує значення масиву вузлів, що представляють собою опис вузлів, що утримуються на зображенні з зазначенням номера кожного вузла для подальшої їх ідентифікації. Дана інформація використовується на проміжних етапах обробки і призначена для використання в інших завданнях підсистеми: при вивченні зображення, розпізнаванні сегментів ліній та виведенні остаточних результатів.
2.3.4. Використовувані підпрограми
У процесі роботи програма звертається до наступних підпрограм:
- Wlog - підпрограма виведення повідомлень в журнал обчислень;
- NeigCount - підпрограма отримання кількості сусідніх точок;
- NeigNode - підпрограма рекурсивної обробки вузлових точок;
- NodeCentre - підпрограма обчислення центру вузла;
- DrawGrid - підпрограма виведення сітки зображення.
2.3.5. Опис логіки
Схема програми AnalyzeNode представлена ​​на рис. 2.5. Тут представлено текстовий опис схеми проргамми:
1. Початок;
2. Ініціалізація масиву вузлів;
3. i = 0; j = 0; z = 0;
4. Якщо j> = N, то перехід до п.11;
5. Якщо i> = M, то перехід до п.10;
6. Якщо (apix [i] [j] = 1) і (apix2 [i] [j] <0) і (NeigCount (i, j)> 2), то перехід до п.7, інакше до п.9;
7. z = z +1;
8. NodeSelect (i, j, z);
9. i = i +1; перехід до п.5;
10. i = 0; j = j +1; перехід до п.4;
11. Кінець.
2.3.6. Налаштування програмних засобів
Для роботи програми необхідна наявність операційної системи Windows 95/Windows NT або пізнішої версії. Для роботи програми з даними, розміщеними в мережі, необхідна настройка мережевих підключень операційної системи до робочої групи.
Схема програми AnalyzeNode Рис. 2.5

3. РОЗРОБКА ЗАВДАННЯ «ПОШУК СЕГМЕНТІВ»
3.1. Опис постановки завдання
3.1.1. Характеристика задачі
Завдання «Пошук сегментів» призначена для визначення в складі оброблюваного графічного зображення сегментів ліній, що отримуються в результаті перетину останніх. У процесі виконання даної задачі здійснюється знаходження сегментів ліній, що дозволяє, грунтуючись на вузлах, отриманих у результаті роботи завдання «Пошук вузлів» (її характеристика наведена в пункті 2.1.1), виділити структурні елементи зображення. У результаті виконання завдання «Пошук сегментів» можна отримувати опис вихідного графічного зображення, піддаючи його кодування і / або подальшій обробці, в тому числі і в підсистемах синтезу графічних зображень. Дана задача є основною ланкою в ланцюзі лінійної сегментації обробки зображень, її результати дозволяють спостерігати роботу всієї підсистеми в цілому. У задачі можна виділити такі основні частини:
- Пошук окремих сегментів ліній, що не містять вузлів і є самостійними лініями;
- Пошук сегментів ліній, одна з початкових точок якої є вузлом, таким чином, сегмент є початковою (кінцевої) частиною лінії;
- Пошук сегментів ліній, обидві початкових точки, якої є вузлами, таким чином, сегмент є продовженням однієї з ліній.
У кожній з цих частин присутні особливості, пов'язані з різними характеристиками структурних елементів графічного зображення. Формування результатів обробки розрізняється за способом передачі їх в інші підсистеми (наприклад, ланцюгового кодування). Так, у разі опису сегментів ліній, повністю утворених вузлами виникає необхідність передачі додаткової координати для однозначного визначення напрямку руху при формуванні ланцюгового коду.
3.1.2. Вхідна інформація
В якості вхідної інформації для даної задачі використовуються:
- Масив точок вихідного зображення;
- Масив вузлів, що містить описи вузлових точок: їхній області, центри і їх унікальну нумерацію для однозначної ідентифікації;
3.1.3. Вихідна інформація
У цьому завданню формується масив сегментів, що містить описи сегментів ліній та їх номери для подальшої ідентифікації при дослідженні та кодуванні
3.1.4. Математична постановка задачі
Пошук сегментів ліній здійснюється, виходячи з одиничної товщини лінії. Здійснюючи послідовної перебір всіх точок зображення і порівнюючи їх характеристики, враховуючи відповідні точки в масиві вузлів, приймається рішення про належність точки будь-якого сегменту лінії.
Кожній одиниці зображення в масиві відповідає елемент масиву сегментів, значення якого розшифровується таким чином:
- Якщо значення елемента менше нуля, то елемент ще не був оброблений. Це необхідно при обході масиву точок для виключення повторної обробки елементів;
- Якщо значення дорівнює нулю, то це означає, що даному елементу не відповідає жодна із сегментів ліній і, отже, відповідна точка в масиві точок не є яким-небудь сегментом лінією;
- Якщо значення більше нуля, то воно являє собою номер сегмента лінії, якому відповідає дана точка.
Дані твердження можна представити у вигляді формул:
(3.1)
де (x, y) - координати розглянутої точки;
M і N - ширина і висота зображення;
C - масив сегментів, розмірність MxN;
n - номер оброблюваного сегмента.
На рис. 3.1. виділені точки належать сегменту, який представляє собою тип сегментів, що є окремими самостійними лініями.
Окремі сегменти ліній

Рис. 3.1
Даний тип сегментів не містить вузлів і для його кодування досить вказівки однієї початкової точки.
На рис. 3.2. виділені точки відображають сегмент, одна з початкових точок якого є вузлом.
Для представлення даного типу сегментів у формі, пристосованій для кодування необхідно вказати координати початкової точки і координати вузла, вказуючи, що в даній точці кодування сегмента слід завершити.
На рис. 3.3 виділені точки відображають сегмент, обидві початкових точки якого визначаються вузлами.
Сегмент лінії, що містить початкову та вузлову точки

Рис. 3.2
Сегмент, який визначається двома вузловими точками

Рис. 3.3
Пошук сегментів ліній полягає в послідовному переборі елементів масиву точок з одночасним урахуванням елементів масиву вузлів. При послідовному переборі обробляються точки, які підходять під опис лінії одиничної товщини. Порівняння елементів масиву точок і масиву вузлів дозволяє виділяти ділянки ліній і визначати точки, що задають їх початок і кінець.
3.1.5. Спеціальні вимоги до технічного забезпечення
Вимоги до технічного забезпечення для вирішення завдання «Пошук вузлів» повністю збігаються з вимогами до комплексу технічних засобів, пред'явленими при розробці підсистеми «Лінійна сегментація» (див. п. 1.3.1).
Реалізація завдання можлива при наявності набору таких технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Робота програми можлива тільки на ЕОМ, які підтримують 32-розрядні операційні системи сімейства Windows, такі як Windows 95, Windows NT або вище. Як зазначено вище, робота може вестися на ЕОМ з процесором не нижче Intel Pentium. Але бажано використовувати ЕОМ з процесором не нижче класу Intel Pentium II, який працює більш ефективно.
3.2. Опис алгоритму «Пошук сегментів»
3.2.1. Призначення і характеристика
Алгоритм «Пошук сегментів» призначений для визначення в складі оброблюваного графічного зображення сегментів ліній. Алгоритм дозволяє, грунтуючись на вузлах, отриманих у результаті роботи алгоритму «Пошук вузлів», виділити структурні елементи зображення з метою одержання опису вихідного графічного зображення, піддаючи його кодування і / або подальшій обробці, в тому числі і в підсистемах синтезу графічних зображень. Алгоритм «Пошук сегментів» дозволяє визначити всі типи сегментів, які розрізняються способом опису (окремий сегмент, сегмент з одним вузлом, сегмент, який визначається двома вузлами).
3.2.2. Використовувана інформація
При роботі даного алгоритму використовуються наступні масиви:
- Масив точок вихідного зображення;
- Масив вузлів.
3.2.3. Результати рішення
Алгоритм формує значення елементів масиву сегментів, що утримуються на зображенні з зазначенням номера кожного сегмента для подальшої їх ідентифікації. Дана інформація дозволяє виробляти опис сегментів трьох типів, описаних у пункті 3.1.4 з метою подальшого опису, формування файла і передачі в підсистему ланцюгового кодування.
3.2.4. Алгоритм рішення
Алгоритм рішення складений з урахуванням математичного опису, наведеного в пункті 3.1.4. Алгоритм представляється в текстовому вигляді наступним чином:
1. Початок;
2. Ініціалізація масиву сегментів;
3. i = 0; j = 0; nsegs = 0;
4. Якщо j> = N, то перехід до п.11;
5. Якщо i> = M, то перехід до п.10;
6. Якщо (apix [i] [j] = 1) і (apix1 [i] [j] <0) і ((NeigCount (i, j) = 1) або (NeigCount (i, j) = 2)), то перехід до п.7, інакше до п.9;
7. nsegs = nsegs +1;
8. NeigLine (i, j, nsegs);
9. i = i +1; перехід до п.5;
10. i = 0; j = j +1; перехід до п.4;
11. Кінець.
3.2.5. Вимоги до контрольного Приміром
Для контрольного прикладу необхідно підготувати таке зображення, щоб воно містило всі розглянуті типи сегментів:
- Окремо розташовані сегменти, початок і кінець яких є звичайні точки - такі сегменти є окремі лінії;
- Сегменти, одна з початкових точок яких є вузловою (входить в область перетину з іншими сегментами) - це сегменти, які є початком будь-якої лінії;
- Сегменти, обидві початкових точки яких є вузлами, вони є продовженням лінії.
3.2.6. Умовні позначення
У таблиці 3.1 представлені умовні позначення, введені в тексті підрозділу
Таблиця 3.1
Умовні позначення
Умовні позначення
Розшифровка
M
ширина вхідного зображення
N
висота вхідного зображення
apix [M] [N]
вихідний масив точок
apix1 [M] [N]
масив сегментів
NeigCount
функція обчислення кількості сусідніх точок
NeigLine (x, y, n)
рекурсивна функція виділення вузлових точок, x, y - координати початку виділення, n - номер вузла
nsegs
номер поточного сегмента

3.3. Опис програми «Пошук сегментів»
3.3.1. Вступна частина
Програма «Пошук сегментів», що позначається як AnalyzeSeg, призначена для обробки вихідного зображення з метою пошуку сегментів ліній. Програма використовує масив вузлів, що отримується в результаті роботи програми AnalyzeNode, описаної в пункті 2.3, і на підставі даних масиву вузлів і вихідного зображення здійснює заповнення масиву сегментів, елементи якого є опис приналежності будь-якої точки якому-небудь сегменту лінії.
3.3.2. Функціонально призначення
Програма AnalyzeSeg призначена для обробки вихідного зображення з метою пошуку сегментів ліній. Програма використовує попередньо оброблений і заповнений масив вузлів. У процесі роботи з програмою користувач здійснює формування значень масиву сегментів ліній, значення елементів якого є опис приналежності будь-якої точки якому-небудь сегменту лінії. Дані масиву сегментів зберігаються і використовуються надалі при виведенні кодів ліній для подальшої передачі в підсистему ланцюгового кодування і, при необхідності, в інші підсистеми.
3.3.3. Опис інформації
Програма AnalyzeSeg на вході використовує наступні дані:
- Масив точок;
- Масив вузлів;
На виході програма формує наступні дані:
- Масив сегментів;

3.3.4. Використовувані підпрограми
У процесі роботи програма звертається до наступних підпрограм:
- Wlog - підпрограма виведення повідомлень в журнал обчислень;
- NeigCount - підпрограма отримання кількості сусідніх точок;
- NeigLine - підпрограма рекурсивної обробки точок одного сегмента лінії;
- DrawGrid - підпрограма виведення сітки зображення.
3.3.5. Опис логіки
Схема програми AnalyzeSeg представлена ​​на рис. 3.4. Тут представлено текстовий опис схема програми:
1. Початок;
2. Ініціалізація масиву сегментів;
3. i = 0; j = 0; nsegs = 0;
4. Якщо j> = N, то перехід до п.11;
5. Якщо i> = M, то перехід до п.10;
6. Якщо (apix [i] [j] = 1) і (apix1 [i] [j] <0) і ((NeigCount (i, j) = 1) або (NeigCount (i, j) = 2)), то перехід до п.7, інакше до п.9;
7. nsegs = nsegs +1;
8. NeigLine (i, j, nsegs);
9. i = i +1; перехід до п.5;
10. i = 0; j = j +1; перехід до п.4;
11. Кінець.
3.3.6. Налаштування програмних засобів
Для роботи програми необхідна наявність операційної системи Windows 95/Windows NT або пізнішої версії. Для роботи програми з даними, розміщеними в мережі, необхідна настройка мережевих підключень операційної системи до робочої групи. Додаткова настройка програми не потрібно.
Схема програми AnalyzeSeg
Рис. 3.4
4. РОЗРОБКА ЗАВДАННЯ «ОБРОБКА І КОДУВАННЯ СЕГМЕНТІВ»
4.1. Опис постановки завдання
4.1.1. Характеристика задачі
Завдання «Обробка та кодування сегментів» призначена для формування коду трьох типів сегментів ліній на підставі знайдених сегментів ліній та вузлів. У задачі обробляються наступні типи сегментів ліній:
- Сегменти ліній, що не містять вузлів;
- Сегменти ліній, одна з крайніх точок яких є вузлом;
- Сегменти ліній, обидві крайніх точки якої є вузлами.
Кодування кожного типу сегментів пов'язано з певними особливостями. Формування результатів обробки розрізняється за способом передачі їх в інші підсистеми (наприклад, ланцюгового кодування).
4.1.2. Вхідна інформація
В якості вхідної інформації для даної задачі використовуються:
- Масив точок вихідного зображення;
- Масив вузлів, що містить описи вузлових точок: їхній області, центри і їх унікальну нумерацію для однозначної ідентифікації;
- Масив сегментів, що містить описи сегментів ліній: точки, що належать лінії, координати їх перетину та привласнені номери для однозначної ідентифікації.
4.1.3. Вихідна інформація
У цьому завданню формуються координати сегментів з зазначенням типу сегмента.
Формат опису сегментів ліній:
n 1: x 11, y 11 [, x 12, y 12 [, x 13, y 13]]
n 2: x 21, y 21 [, x 22, y 22 [, x 23, y 23]]
n k: x k 1, y k 1 [, x k 2, y k 2 [, x k 3, y k 3]]
де n i - номер i-го сегменту лінії (ідентифікатор);
x i 1, y i 1 - координати першої точки i-го сегменту лінії;
x i 2, y i 2 - координати другої точки i-го сегменту лінії, вказуються у тому випадку, якщо точка (x i 2, y i 2) є вузлом;
x i 3, y i 3 - координати напрямки кодування від точки (x i 1, y i 1), вказуються у тому випадку, якщо точки (x i 1, y i 1) і (x i 2, y i 2) є вузлами.
4.1.4. Математична постановка задачі
Обробка та кодування сегментів ліній полягає в пошуку крайніх точок цих сегментів ліній, за якими визначається приналежність сегмента одному з трьох типів, описаних у пункті 4.1.1. У процесі кодування сегментів обробляються три масиви точок: масив точок вихідного зображення, масив вузлів і масив сегментів. У процесі послідовного обходу координат зображення, а на підставі порівняння цих координат зі значеннями в масивах сегментів і вузлів, приймається рішення і типі оброблюваного сегмента, обчислюються необхідні його координати, і визначається спосіб його кодування в залежності від його типу. Визначення належності точки сегментами виконується на підставі наступного принципу якщо певній точці зображення відповідає позитивне значення в масиві сегментів ліній, то дана точка належить сегменту, номер якого визначається цим значенням. Визначення наявності вузла в будь-якій точці визначається за аналогічним принципом: якщо певній точці зображення відповідає позитивне значення в масиві вузлів, то дана точка є вузлом, номер якого визначається значенням у масиві вузлів.
Порівняння масивів сегментів і вузлів відбувається за наступним правилом: якщо точці відповідає позитивне значення в масиві сегментів і нульове значення в масиві вузлів, то дана точка належить сегменту і не утворює вузлів. Якщо точці відповідає позитивне значення в масиві сегментів і позитивне значення в масиві вузлів, то дана точка утворює вузол і. отже, належить більш ніж одного сегменту.
При кодуванні сегментів ліній визначається тип сегмента і у відповідність цим типом на виході буде від двох до шести координат, що являють собою крапки. Типи сегментів ліній та їх характеристики описані в пункті 3.1.4.
4.1.5. Спеціальні вимоги до технічного забезпечення
Вимоги до технічного забезпечення для вирішення завдання «Кодування сегментів» повністю збігаються з вимогами до комплексу технічних засобів, пред'явленими при розробці підсистеми «Лінійна сегментація» (див. п. 1.3.1).
Реалізація завдання можлива при наявності набору таких технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Робота програми можлива тільки на ЕОМ, які підтримують 32-розрядні операційні системи сімейства Windows, такі як Windows 95, Windows NT або вище. Як зазначено вище, робота може вестися на ЕОМ з процесором не нижче Intel Pentium. Але бажано використовувати ЕОМ з процесором не нижче класу Intel Pentium II, який працює більш ефективно.
4.2. Опис алгоритму «Обробка та кодування сегментів»
4.2.1. Призначення і характеристика
Алгоритм «Обробка та кодування сегментів» призначений для пошуку виділених сегментів ліній, їх ідентифікації, пошуку вузлових точок, формування кодів, що містять координати даних сегментів для подальшої обробки їх у підсистемі ланцюгового кодування або використання в інших підсистемах. Для роботи алгоритму необхідно наявність інформації про вузли та сегментах зображення, отриманих у результаті роботи алгоритмів «Пошук вузлів» і «Пошук сегментів», опис яких наведено у пунктах 2.2 та 3.2 відповідно.
4.2.2. Використовувана інформація
При роботі даного алгоритму використовується наступна інформація:
- Значення масиву точок вихідного графічного зображення;
- Значення масиву сегментів, що містить описи належність точки того чи іншого сегменту;
- Значення масиву вузлів, що визначають, які з точок вихідного зображення є вузловими.
4.2.3. Результати рішення
Даний алгоритм формує рядки, що містять номери сегментів і необхідні координати для подальшого кодування або обробки в інших підсистемах.
4.2.4. Алгоритм рішення
Алгоритм рішення складений з урахуванням математичного опису, наведеного в пункті 4.1.4. Алгоритм представляється в текстовому вигляді наступним чином:
1. Початок;
2. Ініціалізація масивів і змінних;
3. Якщо пошук вузлів виконаний, то перехід до п.5, інакше до п.4;
4. AnalyzeNode, перехід до п.3;
5. Якщо пошук сегментів виконаний, то перехід до п.7, інакше до п.6;
6. AnalyzeSeg, перехід до п.5;
7. i = 0; j = 0; lnum = 0; lineno = 0;
8. Якщо j> = N, то перехід до п.15;
9. Якщо i> = M, то перехід до п.14;
10. Якщо (apix [i] [j] = 1) і (apix1 [i] [j] <0) і ((NeigCount (i, j) = 1) або (NeigCount (i, j) = 2)), то перехід до п.11, інакше до п.13;
11. lnum = lnum +1; lineno = lineno +1;
12. GetLineVect (i, j, lineno);
13. i = i +1; перехід до п.9;
14. i = 0; j = j +1; перехід до п.8;
15. Кінець.
4.2.5. Вимоги до контрольного Приміром
Для контрольного прикладу необхідно підібрати таке зображення, щоб воно охоплювало різні типи перетинів, а також всі розглянуті типи сегментів:
- Окремо розташовані сегменти, початок, і кінець яких є звичайні точки - такі сегменти є окремі лінії;
- Сегменти, одна з початкових точок яких є вузловою (входить в область перетину з іншими сегментами) - це сегменти, які є початком будь-якої лінії;
- Сегменти, обидві початкових точки яких є вузлами, вони є продовженням лінії.
Зображення не повинно містити циклічних елементів: замкнутих ліній, суцільних зафарбованих областей, в іншому випадку може статися неправильне розпізнавання вузлів і сегментів.
4.2.6. Список умовних позначень
У таблиці 4.1 представлені умовні позначення, введені в тексті підрозділу
Таблиця 4.1
Умовні позначення
Умовні позначення
Розшифровка
lnum
порядковий номер оброблюваного сегмента
lineno
ідентифікатор оброблюваного сегмента в масиві сегментів
M
ширина зображення
N
висота зображення
AnalyzeNode
алгоритм пошуку вузлів, формуючий значення елементів масиву вузлів
AnalyzeSeg
алгоритм пошуку сегментів ліній, формуючий значення елементів масиву сегментів
apix [M] [N]
масив точок вихідного зображення
apix1 [M] [N]
масив сегментів
NeigCount
функція обчислення кількості сусідніх точок
GetLineVect (x, y, n)
рекурсивна функція обробки точок сегмента і кодування його координат, x, y - координати початку обробки сегмента, n - номер сегмента
4.3. Опис програми «Обробка та кодування сегментів»
4.3.1. Вступна частина
Програма «Обробка та кодування сегментів», що позначається як SegCode, призначена для обробки вихідного зображення з метою формування кодів сегментів ліній, що утворюють дане графічне зображення, грунтуючись на пошуку сегментів ліній та вузлів їх перетину.
4.3.2. Функціональне призначення
Програма SegCode, призначена для формування кодів сегментів ліній, що містять координати необхідних точок в залежності від типу кодованого сегмента. У процесі роботи з програмою здійснюється формування масивів вузлів і сегментів, на підставі значень яких формується код певного сегмента. При цьому враховуються типи вузлів, а також типи кодованих сегментів. Отримані результати обробки можуть бути виведені як на екран, так і у файл, і можуть бути оброблені в інших підсистемах.
4.3.3. Опис інформації
Програма SegCode в якості вхідної інформації використовує наступні дані:
- Масив точок вихідного зображення;
- Масив вузлів, що містить описи вузлових точок: їхній області, центри і їх унікальну нумерацію для однозначної ідентифікації;
- Масив сегментів, що містить описи сегментів ліній: точки, що належать лінії, координати їх перетину та привласнені номери для однозначної ідентифікації.
На виході програма формує координати сегментів з зазначенням типу сегмента.
Формат опису сегментів ліній:
n 1: x 11, y 11 [, x 12, y 12 [, x 13, y 13]]
n 2: x 21, y 21 [, x 22, y 22 [, x 23, y 23]]
n k: x k 1, y k 1 [, x k 2, y k 2 [, x k 3, y k 3]]
де n i - номер i-го сегменту лінії (ідентифікатор);
x i 1, y i 1 - координати першої точки i-го сегменту лінії;
x i 2, y i 2 - координати другої точки i-го сегменту лінії, вказуються у тому випадку, якщо точка (x i 2, y i 2) є вузлом;
x i 3, y i 3 - координати напрямки кодування від точки (x i 1, y i 1), вказуються у тому випадку, якщо точки (x i 1, y i 1) і (x i 2, y i 2) є вузлами.
4.3.4. Використовувані підпрограми
У процесі обробки зображення програма використовує наступні підпрограми:
- ActExitExecute - обробка запиту завершення роботи програми;
- FormCreate - створення форми обробки зображення;
- ActZoomInExecute - режим збільшення зображення;
- ActZoomOutExecute - режим зменшення зображення;
- ActOpenFileExecute - відкриття файлу для обробки;
- ActSaveFileExecute - збереження файлу;
- Image2MouseMove - обробка події руху покажчика миші при наведенні на елементи зображення;
- Image2MouseDown - обробка події натискання кнопки миші при редаутірованіі зображення;
- ActZoom1Execute - режим встановлення масштабу зображення 100%;
- ActAnalyzeExecute - виклик основної функції обробки зображення;
- FormCanResize - зміна розміру вікна;
- ActNewFileExecute - створення нового файлу для обробки;
- ActGridCheckExecute - зміна режиму перегляду сітки;
- ActLightCheckExecute - зміна режиму підсвічування структурних елементів зображення;
- ActZoom10Execute - режим встановлення 10-кратного збільшення зображення;
- ActSegLightCheckExecute - зміна режиму підсвічування сегментів ліній;
- ActLockViewExecute - зміна режиму блокування зображення;
- ActAnalyzeNodeExecute - обробка вузлів зображення;
- ActAnalyzeSegExecute - обробка сегментів зображення;
- FormCloseQuery - обробка запиту на закриття вікна;
- ActOpenArrayExecute - відкриття зображення з файлу масиву точок;
- ActSaveArrayExecute - збереження зображення у файл масиву точок;
- ActOptionsExecute - виклик вікна налаштування;
- ActSaveCodeExecute - запис результату обробки зображення у файл;
- ActSegCodeOutExecute - виконання алгоритму формування координат сегментів;
- ZoomTo-установка заданого масштабу зображення;
- DrawGrid - малювання сітки зображення;
- ShowInfo - відображення інформації про поточний стан;
- NeigCount - визначення кількості сусідніх точок;
- VectMove - здійснення руху координат обробки ізобржаенія в заданому напрямку;
- Wlog - вивід інформації в журнал обчислень;
- VectToStr - перетворення коду вектори напрями в рядок;
- ValidateView - обробка властивостей доступності елементів панелі управління;
- PlDistance (x, y, x1, y1, x2, y2) - обчислення відстань (мінімального) від точки (x, y) до прямої, заданої точками (x1, y1) та (x2, y2)
StrToLen - вирівнювання рядка для утворення формату певної довжини;
- NeigNode - рекурсивна обробка сусідів точки на приналежність вузлу
- NeigLine - рекурсивна обраобтка сусідів точки (x, y) на приналежність сегменту
- GetLineVect - рекурсивна обробка коду сегменту лінії;
- NodeCentre - обчислення значення центру вузла;
- FillLine зміна належності точок одного сегмента іншого;
- CodeLine - формування коду сегменту лінії.
4.3.5. Опис логіки
Схема програми SegCode представлена ​​на рис. 4.1. Тут представлено текстовий опис схеми програми:
1. Початок;
2. Ініціалізація масивів і змінних;
3. Якщо пошук вузлів виконаний, то перехід до п.5, інакше до п.4;
4. AnalyzeNode, перехід до п.3;
5. Якщо пошук сегментів виконаний, то перехід до п.7, інакше до п.6;
6. AnalyzeSeg, перехід до п.5;
7. i = 0; j = 0; lnum = 0; lineno = 0;
8. Якщо j> = N, то перехід до п.15;
9. Якщо i> = M, то перехід до п.14;
10. Якщо (apix [i] [j] = 1) і (apix1 [i] [j] <0) і ((NeigCount (i, j) = 1) або (NeigCount (i, j) = 2)), то перехід до п.11, інакше до п.13;
11. lnum = lnum +1; lineno = lineno +1;
12. GetLineVect (i, j, lineno);
13. i = i +1; перехід до п.9;
14. i = 0; j = j +1; перехід до п.8;
15. Кінець.
4.3.6. Налаштування програмних засобів
Для роботи програми необхідна наявність операційної системи Windows 95/Windows NT або пізнішої версії. Для роботи програми з даними, розміщеними в мережі, необхідна настройка мережевих підключень операційної системи до робочої групи. Додаткова настройка програми не потрібно.

4.4. Опис контрольного прикладу
4.4.1. Призначення
Контрольний приклад призначений для перевірки програм підсистеми лінійної сегментації, що здійснюють пошук вузлів, сформованих в результаті перетину ліній вихідного графічного зображення, пошук сегментів цих ліній, їх обробку та кодування.
Схема програми SegCode
50

Рис. 4.1
4.4.2. Вихідні дані
В якості вихідних даних використовується графічне зображення розміром 32x32 крапки, наведене на рис. 4.2.
Це зображення містить розглянуті типи сегментів ліній та вузлів, які можуть бути виділені для подальшої обробки. Координати точок зображення знаходяться в інтервалі [0 .. 31].
49

Рис. 4.1. Продовження
Початкове зображення

Рис. 4.2
4.4.3. Результати розрахунку
У результаті аналізу вихідних даних визначимо точки, що формують вузли. У даному випадку зображення містить 3 вузли, відзначених на мал. 4.3.
Вузли зображення

Рис. 4.3
Виділені вузли мають координати
1: (14,25)
2: (25,22)
3: (10,11)
Розіб'ємо лінії на зображенні на сегменти. У результаті розбиття можна виділити 11 сегментів ліній.
На рис. 4.4 виділений сегмент, що не має перетинів. Жодна з утворюють його точок не є вузловою. Для передачі координат точок такого сегменту в підсистему ланцюгового кодування досить вказівки однієї з координат.
На рис. 4.5 виділені 8 сегментів, одна з крайніх точок яких є вузлом. Для ідентифікації такого сегменту лінії необхідно вказати координати початку сегменту і координати вузла, в якому завершується даних сегмент.
На рис. 4.6 виділено 2 сегмента, обей крайніх точки яких є вузлами. При кодуванні такого сегменту в підсистемі ланцюгового кодування виникає невизначеність напрямки кодування, тому для усунення даної проблеми було прийнято вказувати ще одну точку, що визначає напрямок кодування сегмента.
Сегмент, який не має перетинів

Рис. 4.4
Сегменти з одним вузлом

Рис. 4.5
Сегменти, утворені двома вузлами

Рис. 4.6
Координати точок сегментів представлені в таблиці 4.2
Таблиця 4.2
Координати точок сегментів
Номер сегмента
Початкова точка
Кінцева точка
Кількість вузлів в сегменті
1
30,11
13,2
0
2
14,30
14,25
1
3
25,30
25,22
1
4
7,27
14,25
1
5
28,22
25,22
1
6
5,16
10,11
1
7
1,7
10,11
1
8
14,7
10,11
1
9
25,9
25,22
1
10
14,25
10,11
2
11
14,25
25,22
2
Точки, що визначають напрямки для кодування сегментів 10 і 11, утворених двома вузлами мають координати, представлені в таблиці 4.3.
Таблиця 4.3
Точки, що визначають напрямок
Номер сегмента
Координати першої точки
Координати точки напрями
Координати другої точки
10
14,25
14,24
10,11
11
14,25
15,25
25,22
4.4.4. Результати випробування програми
Для перевірки правильності роботи програми використовувалися вихідні дані, зазначені в пункті 4.4.2, і на їх основі згідно математичному опису, (див. п. 2.1.4, 3.1.4, 4.1.4) були виведені результати, зазначені у п. 4.4 .3. Нижче наведені результати роботи програми:
1: (14,30) - (14,25)
2: (25,30) - (25,22)
3: (7,27) - (14,25)
4: (14,25) - (25,22) [15,25]
5: (14,25) - (10,11) [14,24]
6: (28,22) - (25,22)
7: (25,9) - (25,22)
8: (5,16) - (10,11)
9: (30,11)
10: (1,7) - (10,11)
11: (14,7) - (10,11)
З результатів порівняння розрахованих даних і даних, отриманих в результаті роботи програми, видно, що вони збігаються. Отже, можна зробити висновок про те, що програма працює правильно. У результаті випробування програми було виявлено, що програма забезпечує коректну обробку зображень різного ступеня складності і містять різні типи структурних елементів.

5. ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ЧАСТИНА
5.1. Розрахунок витрат на розробку «Підсистеми лінійної сегментації»
Для визначення величини витрат, потрібних для створення підсистеми, використовуємо прямий метод.
Розрахунок кошторису витрат здійснюється за наступними статтями:
- Витрати на матеріали;
- Витрати на оплату праці розробників;
- Єдиний соціальний податок;
- Витрати на утримання та амортизацію ВТ;
- Накладні витрати;
- Інші витрати.
До статті "Витрати на матеріали" відносяться покупні вироби, необхідні для виконання роботи, перелічені в таблиці 5.1.
Таблиця 5.1
Витрати на матеріали
Найменування матеріалу
Кількість
Вартість, руб.
Картридж для
HP DeskJet 3420C
1 шт.
983
Канцелярські товари
-
250
Разом:
1233
Для розрахунку витрат з оплати праці визначимо тривалість розробки системи. Вона склала 5 місяців. Графік робіт по етапах (і їх тривалість) відображено у таблиці 5.2.

Таблиця 5.2
Тривалість робіт по етапах
Найменування етапу розробки
Тривалість, місяців
1. Дослідження об'єкту автоматизації, вивчення засобів розробки та програмування, формулювання вимог до підсистеми.
0.5
2. Аналіз даних, розробка структур обміну даними, аналіз швидкодії і ресурсоємності структур обміну даними.
1
3. Опрацювання інтерфейсів, екранних форм, загальна настройка системи.
0.5
4. Розробка алгоритмів обробки
1
5. Реалізація на ЯП та налагодження
1
6. Документування
1
Разом:
5
Оклад інженера-програміста, що працює над створенням системи, на період розробки (Пм = 5 місяців) склав ОКЛ = 5000.00 рублів на місяць. Обчислимо витрати на оплату праці розробників за весь період розробки (ОТобщ):
Отр = ОКЛ * Пм, (5.1)
де ОТР - витрати на оплату праці програміста за 5 місяців.
Отр = 5000 * 5 = 25000 руб.
Крім того, необхідно врахувати уральський коефіцієнт (15%).
Кур = 25000 * 0.15 = 3750 руб.
Отже, витрати на оплату праці з урахуванням уральського коефіцієнта (Отрук) склала:
Отрук = ОТР + Кур (5.2)
Отрук = 25000 + 3750 = 28750 руб.
Всього витрати на оплату праці:
ОТобщ = 28750 руб.
Стаття єдиний соціальний податок (ЄСП) - 26% розраховується від витрат на оплату праці (ОТобщ), крім того необхідно враховувати відрахування до фонду страхування від нещасних випадків (ФСС) - 0.2%:
Сума відрахувань становить:
Сотч = ОТобщ * 0.262 (5.3)
Сотч = 28750 * 0.262 = 7532,50 руб.
Стаття «Витрати на утримання та амортизацію ВТ» включає витрати, пов'язані з використанням ресурсів ЕОМ.
Вартість одного машинного години розраховується за формулою:
Ач = Сісп / (ЧС * Кч), (5.4)
де Аг - оренда за годину використання;
Сісп - загальна вартість використання ЕОМ (розраховується за формулою);
Чм - число місяців у році;
Кч - середньомісячна тривалість робочого часу.
Сісп = Акомп + ЗПобсл + СЗЧ + Сел + Апо, (5.5)
де Акомп-амортизація комп'ютера і принтера за рік експлуатації;
ЗПобсл - витрати на оплату праці обслуговуючого персоналу за рік експлуатації;
ЗПобсл = 1500 руб.
СЗЧ - вартість запчастин для комп'ютера за рік експлуатації.
СЗЧ = 200 руб.
Сел - вартість витраченої електроенергії за рік експлуатації.
Сел = 2000 руб.
Апо - річна амортизація програмного забезпечення.
Акомп = Скомп / Спи, (5.6)
де Скомп - вартість комп'ютера і принтера;
Спи - строк корисного використання (в роках).
Акомп = 20260 / 5 = 4052 руб.
Апо = СТпо / Спіпо, (5.7)
де СТпо - вартість програмного забезпечення;
Спіпо - строк корисного використання (в роках).
Апо = 6200 / 5 = 1240 руб.
Сісп = 4052 +1500 +200 +2000 +1240 = 8992 руб.
Ач = 8992 / (12 * 165) = 4.54 руб.
ЕОМ використовувалася на всіх етапах розробки системи (5 міс.).
Разом тривалість експлуатації ЕОМ при 165 години роботи в місяць склала ЕЧ = 825 годин. Отже, загальна вартість оренди ЕОМ становить:
Сар = ЕЧ ​​* Ач (5.8)
Сар = 825 * 4.54 = 3745.5 руб.
Стаття «Накладні витрати» включає в себе витрати, пов'язані з утриманням управлінського персоналу, оплати електроенергії на освітлення і т.п. Накладні витрати склали 30% від витрат на оплату праці.
Нр = 28750 * 0.3 = 8625 руб.
Стаття «Інші витрати» містить витрати, невраховані у попередніх статтях. (До 5% від основної заробітної плати). Інші витрати склали 5% від витрат на оплату праці.
Пр = 28750 * 0.05 = 1437.5 руб.
Сума витрат (СЗ) на розробку підсистеми в цілому склала 51325 руб. Таблиця 5.3 відображає витрати за статтями і структуру цих витрат у загальній сумі.
Таблиця 5.3
Кошторис витрат на розробку підсистеми
Стаття витрат
Сума витрат, руб.
Структура витрат,%
Витрати на матеріали
Витрати на оплату праці
Податки і відрахування
Витрати на утримання ВТ
Накладні витрати
Інші витрати
1230
28750
7530
3750
8620
1440
2.4
56
14,6
7,3
16.8
2.8
Разом
51320
100
Структура витрат на розробку підсистеми представлена ​​на рис. 5.1

Рис. 5.1

6. ЕКОЛОГІЧНІСТЬ І БЕЗПЕКА ПРОЕКТУ
6.1. Актуальність безпеки праці
Охорона праці - система законодавчих актів, соціально-економічних, організаційних, технічних, гігієнічних і лікувально-профілактичних заходів та засобів, що забезпечують безпеку, збереження здоров'я і працездатності людини в процесі праці. Науково-технічний прогрес вніс серйозні зміни в умови виробничої діяльності робітників розумової праці. Їх праця стала більш інтенсивним, напруженим, які вимагають значних витрат розумової, емоційної і фізичної енергії. Це зажадало комплексного рішення проблем ергономіки, гігієни і організації праці, регламентації режимів праці та відпочинку / 17 /.
Охорона здоров'я трудящих, забезпечення безпеки умов праці, ліквідація професійних захворювань і виробничого травматизму складає одну з головних турбот людського суспільства. Звертається увага на необхідність широкого застосування прогресивних форм наукової організації праці, зведення до мінімуму ручної, малокваліфікованої праці, створення обстановки, що виключає професійні захворювання і виробничий травматизм.
Даний розділ дипломної роботи присвячений розгляду наступних питань:
- Особливо шкідливі виробничі фактори;
- Електробезпека;
- Пожежна безпека;
- Розрахунок захисного заземлення.
6.2. Аналіз небезпечних і шкідливих виробничих фактор ів
До особливо шкідливих виробничих факторів при роботі з персональними електронно-обчислювальними машинами відповідно до СанПіН 2.2.4.548-96 «Гігієнічні вимоги до мікроклімату виробничих приміщень» / 18 / відносяться:
Електромагнітне випромінювання
Будь-яка електрична техніка при роботі виділяє велику кількість електромагнітного випромінювання. Електронно-променева трубка (ЕПТ) - це електронна гармата. Це означає, що ЕПТ заряджена негативно, а, отже, поза ЕПТ відбувається накопичення позитивно заряджених частинок. Людина відчуває себе добре, коли в навколишньому його середовищі співвідношення позитивних і негативних іонів майже однаково. Однак перед екраном монітора утворюється надлишок позитивних іонів. Завжди з повітря офісу мікрочастинки, розганяються потоком позитивно заряджених іонів і осідають на обличчі і очах оператора, що сидить перед екраном. У результаті такої "бомбардування" в оператора можуть виникати:
- Головний біль, безсоння;
- Подразнення шкіри;
- Втома очей.
Конструкція монітора повинна забезпечувати можливість фронтального спостереження екрана шляхом повороту корпуса в горизонтальній площині навколо вертикальної осі в межах + - 30 градусів і у вертикальній площині навколо горизонтальної осі в межах + - 30 градусів з фіксацією в заданому положенні. Дизайн монітора повинен передбачати фарбування корпусу в спокійні м'які тони з дифузійним розсіюванням світла. На лицьовій стороні корпусу ВДТ не рекомендується розташовувати органи управління, маркування, будь-які допоміжні написи і позначення. При необхідності розташування органів управління на лицьовій панелі вони повинні закриватися кришкою або бути втоплені в корпусі.
Екран відеомонітора повинен знаходитися від очей користувача на оптимальній відстані 600 - 700мм, але не ближче 500мм з урахуванням розмірів алфавітно-цифрових знаків і символів.
Шуми
Підвищений рівень шуму викликає труднощі в розпізнаванні колірних сигналів, знижує швидкість сприйняття колірних сигналів, знижує швидкість сприйняття кольору, гостроту зору, зорову адаптацію, порушує сприйняття візуальної інформації, знижує здатність швидко і чітко виконувати координовані дії, зменшує на 5-10% продуктивність праці. Тривалий вплив підвищеного рівня шуму з рівнем звукового тиску 90 Дб знижує продуктивність праці на 30-60%.
Медичні обстеження інженерів-програмістів показали, що крім зниження продуктивності праці високі рівні шуму при місцевій дії призводять до стомлення, погіршення слуху і приглухуватості. Крім того, при загальному дії підвищений рівень шуму викликає порушення ритму серцевої діяльності, зміна кров'яного тиску, погіршення органів дихання. Джерелами шуму в приміщенні є друкуючі пристрої. Виробничі приміщення, в яких для роботи використовуються переважно ПЕОМ не повинні межувати з приміщеннями, в яких рівні шуму і вібрації перевищують допустимі значення (виробничі цехи, майстерні, гімнастичні зали тощо). Звукоізоляція огороджувальних конструкцій приміщень ПЕОМ повинна відповідати гігієнічним вимогам і забезпечувати параметри шуму. Відповідно до ГОСТ 12.1.003-89 «Система стандартів безпеки праці. Шум. Загальні вимоги безпеки »/ 19 / при виконанні основної роботи на ПЕОМ рівень шуму на робочому місці не повинен перевищувати 50 дБА. Шумляче обладнання (принтери і т.п.), рівні шуму якого перевищують нормовані, повинне знаходитися поза приміщенням з ПЕОМ.
Знизити рівень шуму в приміщеннях з ВДТ і ПЕОМ можна використанням звуковбирних матеріалів з максимальними коефіцієнтами звукопоглинання в області частот 63 - 8000 Гц для обробки приміщень (дозволених органами й установами держсанепіднагляду Росії), підтверджених спеціальними акустичними розрахунками. Додатковим звукопоглинанням служать однотонні фіранки з щільної тканини, що гармоніюють з фарбуванням стін і підвішені в складку на відстані 15 - 20см від огорожі. Ширина фіранки повинна бути в 2 рази більше ширини вікна.
Виділення надлишків теплоти
Підвищена температура зовнішнього середовища призводить до швидкого стомлення, знижує швидкість сприйняття зорової та слухової інформації, загальній загальмованості людини в слідстві порушення серцевої діяльності (збільшення швидкості биття серця), зміни кров'яного тиску.
У виробничих приміщеннях, у яких робота на ПЕОМ є основною (диспетчерські, операторські, розрахункові, кабіни і посади керування, зали обчислювальної техніки тощо), повинні забезпечуватися оптимальні параметри мікроклімату. При цьому температура повітря не повинна перевищувати 23 - 25 градусів Цельсія, відносна вологість повітря повинна складати 40-60%, швидкість руху повітря - 0,1 м / с.
6.3. Техніка безпеки при роботі з комп'ютером
Електробезпека
Електричні установки, до яких відноситься практично все обладнання ЕОМ, представляють для людини велику потенційну небезпеку, тому що в процесі експлуатації або проведенні профілактичних робіт людина може торкнутися частин, що знаходяться під напругою. Специфічна небезпека електроустановок: струмоведучі провідники, корпуси стійок ЕОМ і іншого устаткування, яка під напругою в результаті пошкодження (пробою) ізоляції, не подають будь-яких сигналів, які попереджають людину про небезпеку. Реакція людини на електричний струм виникає лише при протіканні останнього через тіло людини. Виключно важливе значення для запобігання електротравматизму має правильна організація обслуговування діючих електроустановок ІОЦ, проведення ремонтних, монтажних і профілактичних робіт. При цьому під правильною організацією розуміється строге виконання ряду організаційних і технічних заходів і засобів, встановлених діючими "Правилами технічної експлуатації електроустановок споживачів і правил техніки безпеки при експлуатації електроустановок споживачів" (ПТЕ і ПТБ споживачів) і "Правила установки електроустановок" (ПУЕ) Залежно від категорії приміщення необхідно вжити певних заходів, що забезпечують достатню електробезпеку при експлуатації та ремонті електроустаткування. Так, згідно з ГОСТ 12.1.009-76 «Система стандартів безпеки праці. Електробезпека »/ 20 /, в приміщеннях з підвищеною небезпекою електроінструменти, переносні світильники повинні бути виконані з подвійною ізоляцією або напруга живлення їх не повинно перевищувати 42 В. В ОЦ до таких приміщень можуть бути віднесені приміщення машинного залу, приміщення для розміщення сервісної та периферійної апаратури . Відповідно до ПТЕ і ПТВ споживачам і обслуговуючому персоналу електроустановок пред'являються наступні вимоги:
- Особи, які не досягли 18-річного віку, не можуть бути допущені до робіт в електроустановках;
- Особи не повинні мати каліцтв і хвороб, що заважають виробничій роботі;
- Особи повинні після відповідної теоретичної та практичної підготовки пройти перевірку знань і мати посвідчення на доступ до робіт в електроустановках.
У ВЦ розрядні струми статичної електрики частіше за все виникають при дотику до будь-якого з елементів ЕОМ. Такі розряди небезпеки для людини не представляють, але крім неприємних відчуттів вони можуть привести до виходу з ладу ЕОМ. Для зниження величини виникаючих зарядів статичної електрики в ІОЦ покриття технологічних статей слід виконувати з одношарового полівінілхлоридного антистатичного лінолеуму. Іншим методом захисту є нейтралізація заряду статичної електрики іонізованим газом. У промисловості широко застосовуються радіоактивні нейтралізатори. До загальних заходів захисту від статичної електрики в ІОЦ можна віднести загальні та місцеве зволоження повітря.
Захист відстанню
При роботі за комп'ютером слід дотримуватися оптимально відстань до відеомонітора. З одного боку, близьке відстань сприяє збільшенню кількості випромінювання, прийнятого тілом від монітора. З іншого боку, велика відстань до екрана ускладнює сприйняття і змушує очі сильніше напружуватися, що призводить до більш швидкої стомлюваності очей. Тому слід дотримуватися оптимальну відстань:
екран відеомонітора повинен знаходитися від очей користувача на оптимальній відстані 600 - 700мм, але не ближче 500мм з урахуванням розмірів алфавітно-цифрових знаків і символів. Для захисту від впливу великої кількості випромінювання, що виділяється електрообладнанням слід по можливості розташовувати рідко використовувані частини електроустановок на максимально можливій відстані від робочого місця. У випадку при роботі з комп'ютером даними частинами можуть бути: мережеві фільтри, джерела безперебійного живлення, блоки живлення, концентратори.
При одночасному розміщенні в приміщенні декількох комп'ютерів слід дотримувати мінімальну відстань між ними: воно повинно бути не менше 1,5 метрів.
Захист часом
Тривала робота за комп'ютером призводить до накопичення втоми, в першу чергу, дуже сильно стомлює очі. При необхідності набору великої кількості друкованого тексту також дуже стомленим відчувають пальці рук і кистьові суглоби. Для безпечної роботи необхідно обмежувати тривалість безперервної роботи за комп'ютером. Оптимальним вважається наступний режим роботи: кожну годину роботи повинен супроводжуватися 10-15 хвилинною перервою, що включає в себе розминку очей і пальців рук. Нижче наведено способи розминки очей:
Вправи виконуються сидячи або стоячи, відвернувшись від екрана при ритмічному диханні, з максимальною амплітудою руху очей.
Варіант вправ для очей 1
1. Закрити очі, сильно напружуючи очні м'язи, на рахунок 1-4, потім розкрити очі, розслабивши м'язи очей, подивитися в далину на рахунок 1-6. Повторити 4-5 разів.
2. Подивитися на перенісся і затримати погляд на рахунок 1-4. До втоми очі не доводити. Потім відкрити очі, подивитися в далину на рахунок 1-6. Повторити 4-5 разів.
3. Не повертаючи голови, подивитися направо і зафіксувати погляд на рахунок 1-4, потім подивитися в далину прямо на рахунок 1-6. Аналогічним чином проводяться вправи, але з фіксацією погляду вліво, вгору і вниз. Повторити 3-4 рази.
4. Перевести погляд швидко по діагоналі: направо вгору наліво вниз, потім прямо в далину на рахунок 1-6, потім наліво вгору - направо вниз і подивитися в далину на рахунок 1-6. Повторити 4-5 разів.

Варіант вправ для очей 2
1. Закрити очі, не напружуючи очні м'язи, на рахунок 1-4, широко розкрити очі і подивитися в далину на рахунок 1-6. Повторити 4-5 разів.
2. Подивитися на кінчик носа на рахунок 1-4, а потім перевести погляд удалину на рахунок 1-6. Повторити 4-5 разів.
3. Не повертаючи голови (голова прямо), робити поволі кругові рухи очима вгору-вправо-вниз-вліво і у зворотний бік: вгору-вліво-вниз-вправо. Потім подивитися в далину на рахунок 1-6. Повторити 4-5 разів.
4. При нерухомій голові перевести погляд з фіксацією його на рахунок 1-4 вгору, на рахунок 1-6 - прямо; після чого аналогічним чином вниз-прямо, управо-прямо, вліво-прямо. Виконати рух по діагоналі в одну і іншу сторони з перекладом очей прямо на рахунок 1-6. Повторити 3-4 рази.
Варіант вправ для очей 3
1. Голову тримати прямо. Моргнути, не напружуючи очні м'язи, на рахунок 10-15.
2. Не повертаючи голови (голова прямо), подивитися праворуч на рахунок 1-4, потім ліворуч на рахунок 1-4 і прямо на рахунок 1-6. Підняти очі вгору на рахунок 1-4, опустити вниз на рахунок 1-4 і перевести погляд прямо на рахунок 1-6. Повторити 4-5 разів.
3. Подивитися на вказівний палець, віддалений від очей на відстань 25-30см, на рахунок 1-4, потім перевести погляд удалину на рахунок 1-6. Повторити 4-5 разів.
4. У середньому темпі проробити 3-4 кругових рухи в праву сторону, стільки ж у ліву сторону і, розслабивши очні м'язи, подивитися вдалечінь на рахунок 1-6. Повторити 1-2 рази.
6.4. Організація робочого місця оператора
Проведені дослідження виявили зв'язок між роботою на комп'ютері і такими недугами, як астенопія, болі в спині і шиї, зап'ястний синдром. Всі вище перелічені хвороби прямо чи опосередковано викликані неправильною посадкою людини перед комп'ютером. Робочий стілець (крісло) повинен бути підйомно - поворотним і регульованим по висоті і кутам нахилу сидіння і спинки, а також відстані спинки від переднього краю сидіння, при цьому регулювання кожного параметра має бути незалежною, легко здійснюваної мати надійну фіксацію. Поверхня сидіння, спинки та інших елементів стільця (крісла) повинна бути напівм'якої, з нековзним, електризується і повітропроникним покриттям, що забезпечує легке очищення від забруднень.
Неправильно розташована клавіатура стимулює розвиток зап'ястного синдрому - болісної поразки серединного нерва зап'ястя.
Світло пофарбована меблі офісу і великі вікна є додатковими джерелами світла. У дуже світлому приміщенні погано видно букви і цифри на екрані монітора. Це викликає головний біль, погіршення зору, зниження концентрації, а також призводить до помилок у роботі через некоректне сприйняття інформації. Клавіатура, корпус монітора і ПЕОМ, та інші блоки і пристрої ПЕОМ повинні мати матову поверхню одного кольору з коефіцієнтом відображення 0,4 - 0,6 і не мати блискучих деталей, здатних створювати відблиски. Освітленість на поверхні столу в зоні розміщення робочого документу повинна бути 300 - 500 лк. Допускається установка світильників місцевого освітлення для підсвічування документів. Місцеве освітлення не повинно створювати відблисків на поверхні екрана, а освітленість екрана має не перевищувати 300 лк. Слід обмежувати пряму блесткость від джерел освітлення. При цьому яскравість світяться поверхонь (вікна, світильники тощо), що знаходяться в полі зору, повинна бути не більше 200 кд / кв. м. Слід обмежувати відбиту блесткость на робочих поверхнях (екран, стіл, клавіатура та ін) за рахунок правильного вибору типів світильників та розташування робочих місць по відношенню до джерел природного та штучного освітлення, при цьому яскравість відблисків на екрані монітора і ПЕОМ не повинна перевищувати 40 кд / кв. м і яскравість стелі при застосуванні системи відбитого освітлення не повинна перевищувати 200 кд / кв. м.
6.5. Розрахунок захисного заземлення
Загальна потужність обладнання - 50 Вт, напруга живлення 220В. Для контуру заземлення передбачається використовувати труби сталеві діаметром 50мм, довжиною 3м, заглиблені на 1м. Смуга зв'язку заземлювачів - сталева, ширина смуги 40мм. Грунт - двошарова (верхній шар - суглинок, нижній - пісок). Висота верхнього шару складає 2м. Передбачається обладнати захисним заземленням робоче місце з характеристиками, описаними вище і розташоване в будівлі, що мають геометричні розміри представлені на рис. 6.1.
План будівлі
SHAPE \ * MERGEFORMAT
а
b
c

де a = 15м, b = 10м, з = 1м.
Рис. 6.1
Мінімальна відстань установки заземлювачів з = 1м, обумовлено особливостями конструкції будівлі і фундаменту, зокрема. Ставиться завдання розрахувати кількість труб, що становлять контур заземлення.
Відповідно до вказівок СНиП 24-05-95 "Правила улаштування електроустановок» / 22 /, опір захисного заземлення в будь-який час року для електроустановок до 1000В не повинна перевищувати 4 Ом. R н = 4 Ом.
Визначаємо розрахункове значення питомої опору грунту в місці встановлення пристроїв заземлення. Питомий опір грунту верхнього шару (суглинку) становить ρ 1 = 1 · 10 лютого Ом · м, а нижнього шару (піску) ρ 2 = 7 · 2 жовтня Ом · м.
Вибираємо схему розміщення заземлювачів представлену на рис. 6.2.
Схема розміщення заземлювачів
SHAPE \ * MERGEFORMAT
Рис. 6.2
Число заземлювачів n = 16, відстань між ними вибираємо таким чином, щоб виконувалася умова розміщення заземлювачів в установці, представлене у постановці завдання.
Використовуючи рис.6.3 проведемо ряд нескладних обчислень:
Загальний контур заземлення
SHAPE \ * MERGEFORMAT
b
b 1
c
a
a 1

Рис. 6.3
Отже, a 1 = a +2 c, b 1 = b +2 c.
Таким чином, довжина загального контуру заземлення при обраної нами схемою розміщення має бути не менше значення, представленого наступним виразом:
L = 2 * (a + b +4 c) = 96м. (6.1)
Виходячи з цього, робимо висновок про значення величини відстані між одиночними заземлителями в контурі. Це значення aЇ повинно бути рівне або більше величини L / n = 6м.
Знаходимо коефіцієнт η B використання вертикальних заземлювачів. Відношення відстані між трубами aЇ до довжини труб складає 4 / 3 = 1.3, кількість труб в контурі n = 16. Тоді коефіцієнт η B ≈ 0.66.
Знайдемо коефіцієнт η r використання горизонтальних заземлювачів. Маємо, η r = 0.36.
Визначаємо розрахунковий опір одиночного вертикального заземлювача R B обраного профілю. Для цього використовуємо формулу для випадку типу заземлювача - трубчастий в двошаровому грунті.
, (6.2)
де ρ 1 - питомий опору грунту верхнього шару (Ом · м);
ρ 2 - питомий опору грунту нижнього шару (Ом · м);
l - довжина труби (м);
h - висота верхнього шару грунту (м);
r 0 - радіус перерізу труби (м).
(6.3)
Визначаємо опір з'єднувальних смуг R r без урахування коефіцієнта використання. Тип заземлювача - горизонтальний, протяжний в однорідному грунті (металева смуга). Смуга зв'язку перебувати у верхньому шарі грунту, оскільки глибина заземлення t = 1м спільно з висотою смуги, яка в свою чергу <b, буде дорівнює величині, меншої висоти верхнього рівня грунту. Таким чином, у формулі розрахунку R r в якості ρ будемо брати ρ 1.
Отже,
, (6.4)
де ρ 1 - питомий опору грунту верхнього шару (Ом · м);
l 1 = aЇ * (n-1) (м);
h - висота верхнього шару грунту (м);
b - ширина смуги зв'язку (м);
t - глибина закладення заземлювача (м).
Дана формула застосовна для обчислення опір сполучної смуги при виконанні наступних умов:
l 1>> d, l 1>> 4t, де d = 0.5b.
Перевіримо істинність умов:
d = 0.5 * 0.04 = 0.02,
l 1 = 6 * 15 = 90.
Очевидно, умови виконуються. Тому, ми маємо право зробити обчислення величини R r.
(6.5)
Визначаємо опір отриманого контуру
(6.6)

Так як опір розрахованого контуру незначно менше встановленої величини (<4Ом), то умовами безпеки буде задовольняти контур з 16 труб і сполучної смуги L = 96м.

6.6. Вимоги до параметрів мікроклімату
При організації приміщення слід враховувати параметри мікроклімату, необхідні для дотримання. Виконання вимог до даних параметрах, а ними є: відносна вологість повітря в приміщенні, температура повітря в приміщенні, швидкість руху повітря - дозволяє зменшити стомлюваність людей, чиї робочі місця розташовані у даному приміщенні і тим самим збільшити продуктивність праці. Для приміщень, що містять комп'ютерну техніку, слід дотримуватися таких значення: відносна вологість повітря повинна бути 40-60%, температура повітря в приміщенні 20-22 градуси Цельсія, швидкість руху повітря - 0,1 м / с.
6.7. Пожежобезпечність
Відповідно до ГОСТ 12.1.004-91 «Система стандартів безпеки праці. Пожежна безпека. Загальні вимоги »/ 21 /, приміщення, в яких встановлені персональні ЕОМ, з пожежної небезпеки відносяться до категорії Д, і повинні задовольняти вимогам щодо запобігання та гасіння пожежі. Обов'язкова наявність телефонного зв'язку і пожежної сигналізації.
Матеріали, застосовувані для огороджувальних конструкцій та оздоблення робочих приміщень повинні бути вогнестійкими. Для запобігання загоряння в зоні розташування ЕОМ звичайних горючих матеріалів (папір) і електроустаткування, необхідно вжити таких заходів:
- У машинному залі повинні бути розміщені вуглекислотні вогнегасники типів ОУ-2, ОУ-5, ОУ-8. Згідно з типовими правилами пожежної безпеки на кожні 100 кв. метрів площі приміщення ІОЦ має припадати один вогнегасник;
- Як допоміжний засіб гасіння пожежі можуть використовуватися гідрант або пристрої з гнучкими шлангами;
- Для безперервного контролю машинного залу і зони зберігання носіїв інформації необхідно встановити систему виявлення пожеж, для цього можна використовувати комбіновані сповіщувачі типу КД-1 з розрахунку один сповіщувач на 100м 2 приміщення.
Користувачі допускаються до роботи на персональних ЕОМ тільки після проходження інструктажу з безпеки праці і пожежної безпеки в лабораторії в цілому та на кожному робочому місці.
6.8. Висновки
У цій частині дипломної роботи були викладені вимоги до робочого місця інженера - програміста. Створені умови повинні забезпечувати комфортну роботу. На підставі вивченої літератури з даної проблеми, були зазначені оптимальні параметри робочого місця, а також проведено розрахунок захисного заземлення. Дотримання умов, що визначають оптимальну організацію робочого місця інженера-програміста, дозволить зберегти гарну працездатність протягом усього робочого дня, підвищить як в кількісному, так і в якісному відносинах продуктивність праці програміста, що в свою чергу сприятиме якнайшвидшій розробці і подальшому впровадженню нових програмних продуктів .

ВИСНОВОК
У результаті виконаної роботи була спроектована і програмно реалізована «Підсистема лінійної сегментації». Дана підсистема була інтегрована до складу системи «Автоматизованого аналізу просторової структури зображень» У рамках даної роботи розроблялися декілька завдань: пошук вузлових точок, пошук сегментів ліній, обробка та кодування сегментів ліній. При пошуку вузлових точок було досліджено ряд ситуацій, що виникають при різних взаємних розташуваннях ліній, що утворюють графічне зображення. Були розроблені способи визначення правильних координат вузлів в умовах неповної визначеності, тим самим дозволяючи підсистемі гнучко обробляти різні типи зображень. При пошуку сегментів ліній враховувався характер точок, що утворюють зображення: такі точки можуть належати як одному, так і декільком сегментам, у такому випадку точка є вузлом і визначає характер кодування лінії. Використання масивів вузлів і сегментів дозволило з мінімальними витратами системних ресурсів виконати реалізацію подання всіх вузлів і сегментів зображення без необхідності виділення додаткової пам'яті, а також надало можливість швидкого доступу до всіх описів будь-якої точки зображення. Порівняння відповідних елементів масивів вузлів і крапок дозволяє отримувати характеристики перетину сегментів, виділяти додаткові вузли і отримувати деякі статистичні дані.
Розроблена підсистема має зручний і інтуїтивно зрозумілий інтерфейс. Всі елементи управління згруповані за їх смисловим навантаженням відповідно до вирішуваних задач. Елементи меню мають дублюються елементами панелей інструментів, що дозволяє зменшити час доступу до основних і найбільш часто використовуваних функцій підсистеми.
Результати роботи підсистеми показали правильність вирішення всіх поставлених завдань, що говорить про її працездатності та практичної застосовності. Підсистема має вбудовану настроювану можливість ведення журналу обчислень, що дозволяє детально вивчати процес обробки графічних зображень. У підсистему вбудовані модулі обміну даними з підсистемами фільтрації і підсистемою ланцюгового кодування «Системи автоматизованого аналізу просторової структури зображень», а також передбачена можливість роботи із стандартним форматом BMP.
Підсистема також має можливість редагування вихідного зображення прямо в процесі його обробки, а також вибору необхідного режиму перегляду (вибір масштабу, виділення вузлів і сегментів ліній), що дозволяє наочно вивчити вплив характеристик вхідного зображення на роботу алгоритмів його розпізнавання. Вбудована панель стану дозволяє інтерактивно отримувати інформацію про поточний стан підсистеми.
Розроблена підсистема використовується у складі системи «Автоматизованого аналізу просторової структури зображень» і взаємодіє з іншими її підсистемами: підсистемою фільтрації і підсистемою ланцюгового кодування.

СПИСОК ЛІТЕРАТУРИ
1. Павлідіс Т. Алгоритми машинної графіки та обробки зображень. - М.: Радіо і зв'язок, 1986. - 400с.
2. Дуда Р., Харт П. Розпізнавання образів та аналіз сцен. - М.: Світ, 1976. - 512с.
3. Колмогоров А.Н., Фомін С.В. Елементи теорії функцій і функціонального аналізу. - М.: Наука, 1981. - 544с.
4. Бакут П.А., Колмогоров П.С. Сегментація зображень: Методи виділення кордонів областей / / Зарубіжна радіоелектроніка, 1987, № 10. - С. 25-46.
5. Бакут П.А., Колмогоров П.С., Варновіцкій І.Е. Сегментація зображень: методи порогової обробки / / Зарубіжна радіоелектроніка, 1988, № 4. - С. 6-24.
6. Швидкі алгоритми в цифровій обробці зображень. - М.: Радіо і зв'язок, 1984. - 224с.
7. Вдовін А.М., Хаба Б.С., Муринов А.І., Лялін В.Є. Дослідження планарних елементів просторової структури зображень / / Хімічна фізика і мезоскопія. Т.3, 2001, № 2. - С.134-147.
8. Журавльов Ю.І., Гуревич І.Б. Розпізнавання образів та аналіз зображень / / Штучний інтелект. Кн. 2. Моделі та методи. - М.: Радіо і зв'язок, 1990. - 304с.
9. Претт У. Цифрова обробка зображень. - Кн. 1. - М.: Світ, 1982. - 312с. - Кн. 2. - М.: Світ, 1982. - 480с.
10.Розенфельд А., Дейвіс Л.С. Сегментація і моделі зображення / / ТІІЕР, т. 67, 1979, № 5. - С. 71-81.
11.Толковий словник по штучному інтелекту / А. М. Аверкін, М.Г. Гаазе-Рапопорт, Д.А. Поспєлов. - М.: Радіо і зв'язок, 1992. - 256с.
12.Ейнджел Е. Інтерактивна комп'ютерна графіка. - М.: Вільямс, 2001. - 592с.
13.Murynov AI, Levitskaya LN, Shibaeva IV The model discretely - planimetry graphic structures of the image graphic / / Тез. докл. - Нижній Новгород: Изд-во Нижегородського держуніверситету, 2004. - С. 258.
14.Ніколаев Д.П. Алгоритми колірної сегментації, застосовні в умовах складного освітлення сцени / / Автореф. дисс. - М: Изд-во інституту з проблем передачі інформації РАН, 2004
15.Радигіна І. І. Методичні посібники для виконання розділу «Організаційно економічна частина» .- К.: ІжГТУ, 2002.
16.Бичін В.Б., Малінін С.В. Нормування праці: Підручник. - Москва: Видавництво «Іспит», 2002.
17.ГОСТ 12.0.002-80 Система стандартів безпеки праці. Терміни та визначення - М.: Видавництво стандартів, 1984.
18.СанПіН 2.2.4.548-96 Гігієнічні вимоги до мікроклімату виробничих приміщень. -М.: Видавництво стандартів, 1996.
19.ГОСТ 12.1.003-89 Система стандартів безпеки праці. Шум. Загальні вимоги безпеки. -М.: Видавництво стандартів, 1989.
20.ГОСТ 12.1.009-76 Система стандартів безпеки праці. Електробезпека. -М.: Видавництво стандартів, 1976.
21.ГОСТ 12.1.004-91 Система стандартів безпеки праці. Пожежна безпека. Загальні вимоги. -М.: Видавництво стандартів, 1992.
22.СНіП 24-05-95 Правила пристрою електроустановок. -М.: Видавництво стандартів, 1995.
23.Сенілов М.А., Почерняєв С. В., Килина І. В. Методичні вказівки з дипломного проектування. - К.: ІжГТУ, 1998.
24.ГОСТ 19.701-90 ЕСПД. Схеми алгоритмів, програм, даних і систем. - М.: Видавництво стандартів, 1991.
25.ГОСТ 19.504-79 ЕСПД. Керівництво програміста. Вимоги до змісту та оформлення. - М.: Видавництво стандартів, 1979.
26.ГОСТ 19.505-79 ЕСПД. Керівництво оператора. Вимоги до змісту та оформлення. - М.: Видавництво стандартів, 1979.

ДОДАТОК 1
КЕРІВНИЦТВО ПРОГРАМІСТА
Д.1.1. Призначення програми
Програма «Обробка та кодування сегментів», що позначається як SegCode, призначена для формування кодів сегментів ліній, що містять координати необхідних точок в залежності від типу кодованого сегмента. У процесі роботи з програмою обробляється масив точок, що формується на основі вхідного файлу зображення. У результаті обробки здійснюється формування масивів вузлів і сегментів, на підставі значень яких формується код певного сегмента. При цьому враховуються типи вузлів, а також типи кодованих сегментів. Отримані результати обробки можуть бути виведені як на екран, так і у файл, і можуть бути оброблені в інших підсистемах.
Дана програма застосовується в складі «Системи автоматизованого аналізу просторової структури зображень».
Д.1.2. Умови застосування програми
При роботі з програмою необхідно забезпечити виконання наступних вимог до комплексу технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Робота програми можлива тільки на ЕОМ, які підтримують 32-розрядні операційні системи сімейства Windows, такі як Windows 95, Windows NT або вище.
Програма реалізована в середовищі програмування Borland C + + Builder 6.
Програма є самостійним модулем, що не вимагає установки додаткового програмного забезпечення
Програма складається з модулів, кожен з яких обертається до підпрограм:
Модуль lineseg.cpp:
- ActExitExecute - обробка запиту завершення роботи програми;
- FormCreate - створення форми обробки зображення;
- ActZoomInExecute - режим збільшення зображення;
- ActZoomOutExecute - режим зменшення зображення;
- ActOpenFileExecute - відкриття файлу для обробки;
- ActSaveFileExecute - збереження файлу;
- Image2MouseMove - обробка події руху покажчика миші при наведенні на елементи зображення;
- Image2MouseDown - обробка події натискання кнопки миші при редаутірованіі зображення;
- ActZoom1Execute - режим встановлення масштабу зображення 100%;
- ActAnalyzeExecute - виклик основної функції обробки зображення;
- FormCanResize - зміна розміру вікна;
- ActNewFileExecute - створення нового файлу для обробки;
- ActGridCheckExecute - зміна режиму перегляду сітки;
- ActLightCheckExecute - зміна режиму підсвічування структурних елементів зображення;
- ActZoom10Execute - режим встановлення 10-кратного збільшення зображення;
- ActSegLightCheckExecute - зміна режиму підсвічування сегментів ліній;
- ActLockViewExecute - зміна режиму блокування зображення;
- ActAnalyzeNodeExecute - обробка вузлів зображення;
- ActAnalyzeSegExecute - обробка сегментів зображення;
- FormCloseQuery - обробка запиту на закриття вікна;
- ActOpenArrayExecute - відкриття зображення з файлу масиву точок;
- ActSaveArrayExecute - збереження зображення у файл масиву точок;
- ActOptionsExecute - виклик вікна налаштування;
- ActSaveCodeExecute - запис результату обробки зображення у файл;
- ActSegCodeOutExecute - виконання алгоритму формування координат сегментів;
- ZoomTo-установка заданого масштабу зображення;
- DrawGrid - малювання сітки зображення;
- ShowInfo - відображення інформації про поточний стан;
- NeigCount - визначення кількості сусідніх точок;
- VectMove - здійснення руху координат обробки ізобржаенія в заданому напрямку;
- Wlog - вивід інформації в журнал обчислень;
- VectToStr - перетворення коду вектори напрями в рядок;
- ValidateView - обробка властивостей доступності елементів панелі управління;
- PlDistance (x, y, x1, y1, x2, y2) - обчислення відстань (мінімального) від точки (x, y) до прямої, заданої точками (x1, y1) та (x2, y2)
StrToLen - вирівнювання рядка для утворення формату певної довжини;
- NeigNode - рекурсивна обробка сусідів точки на приналежність вузлу
- NeigLine - рекурсивна обраобтка сусідів точки (x, y) на приналежність сегменту
- GetLineVect - рекурсивна обробка коду сегменту лінії;
- NodeCentre - обчислення значення центру вузла;
- FillLine зміна належності точок одного сегмента іншого;
- CodeLine - формування коду сегменту лінії.
Модуль lsImgSize:
- BtnCancelClick - обробка події скасування створення нового файлу;
TfrmImgSize - конструктор діалогу створення нового файлу;
Модуль lsOptions:
- BtnCancelClick - обробка події скасування зміни налаштувань програми;
- Label1MouseDown - обробка події зміни кольору сітки зображення;
- Label2MouseDown - обробка події зміни кольору підсвічування ліній зображення;
- Label3MouseDown - обробка події зміни кольору підсвічування вузлів зображення;
- Label4MouseDown - обробка події зміни шрифту вікна журналу;
- Label5MouseDown - обробка події зміни шрифту вікна результатів;
- TfrmOptions - конструктор діалогу настройки програми;
Д.1.3. Характеристики програми
Програма має наступні режими роботи:
- Імпорт / експорт файлів зображень;
- Перегляд і редагування зображень;
- Пошук вузлів;
- Пошук сегментів;
- Кодування сегментів;
- Автоматична обробка зображення.
Перегляд і редагування зображень виконується в міру необхідності.
Імпорт / експорт файлів зображень здійснюється при отриманні вхідної інформації і також при необхідності її додаткового висновку.
Пошук вузлів, пошук сегментів і кодування ліній виконуються при необхідності покрокової обробки зображення.
Автоматична обробка зображення включає в себе повний цикл обробки зображення, що не вимагає додаткових дій і дозволяє натисненням однієї кнопки отримати готовий результат.
Будь-який з режимів роботи може бути обраний користувачем з вибором відповідного пункту меню.
Д.1.4. Звернення до програми
Для виклику програми необхідно запустити на виконання виконуваний файл lineseg.exe.
Запуск програми може бути проведений з командного рядка будь-якого файлового менеджера або з системного меню програм операційної системи, а також відповідним ярликом при його наявності.
Д.1.5. Вхідні і вихідні дані
Вхідними даними програми може бути будь-яке графічне зображення. У роботі програми в складі «Системи автоматизованого аналізу просторової структури зображень» вхідними даними програми є масив точок зображення, призначеного для обробки, сформований в результаті роботи підсистем фільтрації.
На виході програми формується опис сегментів ліній зображення, що дозволяє виконувати ланцюгове кодування, а також може бути використано в інших підсистемах.
Д.1.6. Повідомлення
Повідомлення, видавалася при роботі з програмою і дії, які необхідно виконати при їх отриманні, наведені в таблиці Д.1.1.
Таблиця Д.1.1
Повідомлення, що видаються при роботі програми і необхідні дії при їх отриманні
Повідомлення
Опис
Дії
1
2
3
Розмір нового зображення
Програма пропонує вибрати розмір новостворюваного зображення в точках
Ввести значення ширини і висоти зображення
Невірно вказано число
Введене число не відповідає заданим форматом
Ввести коректне число
Вихід?
Запит на підтвердження виходу з програми. Не збережені дані можуть бути втрачені
Підтвердити або спростувати запит на вихід
Неможливо відкрити файл
Сталася помилка при спробі відкрити вказаний файл
Перевірити наявність файлу і доступу до нього
Неможливо зберегти файл
Сталася помилка при спробі зберегти вказаний файл
Перевірити наявність доступу до вказаного шляху.
Файл вже існує. Перезаписати?
Файл з ім'ям, вказаним для збереження, вже існує
Підтвердити запит на перезапис або вибрати інше ім'я файлу
Налаштування
Викликаний діалог налаштування програми
Виконати необхідні дії з настройки, потім натиснути кнопку «ОК» для збереження змін або кнопку «Скасування» для їх скасування
Не виконаний пошук вузлів
При покрокової обробці була викликана процедура пошуку сегментів перш ніж був виконаний пошук вузлів
Спочатку необхідно виконати пошук вузлів, а потім виконувати пошук сегментів
Не виконаний пошук сегментів
При покрокової обробці була викликана процедура кодування сегментів перш ніж був виконаний пошук сегментів
Спочатку необхідно виконати пошук сегментів, а потім виконувати їх кодування

1.7. Налаштування програми
Для роботи програми не потрібно налаштування додаткових програмних засобів.

ДОДАТОК 2
КЕРІВНИЦТВО ОПЕРАТОРА
Д.2.1. Призначення програми
Програма «Обробка та кодування сегментів», що позначається як SegCode, призначена для формування кодів сегментів ліній, що містять координати необхідних точок в залежності від типу кодованого сегмента. У процесі роботи з програмою здійснюється формування масивів вузлів і сегментів, на підставі значень яких формується код певного сегмента. При цьому враховуються типи вузлів, а також типи кодованих сегментів. Отримані результати обробки можуть бути виведені як на екран, так і у файл, і можуть бути оброблені в інших підсистемах.
Дана програма застосовується в складі «Системи автоматизованого аналізу просторової структури зображень».
Д.2.2. Умови застосування програми
При роботі з програмою необхідно забезпечити виконання наступних вимог до комплексу технічних засобів:
- Персональний комп'ютер IBM PC із процесором не нижче Pentium I;
- Клавіатура;
- Монітор;
- Жорсткий диск з об'ємом вільного простору не менше 50 МБ;
- Оперативна пам'ять об'ємом не менше 128 МБ.
Робота програми можлива тільки на ЕОМ, які підтримують 32-розрядні операційні системи сімейства Windows, такі як Windows 95, Windows NT або вище.
Д.2.3. Пуск програми
Для виклику програми необхідно запустити на виконання виконуваний файл lineseg.exe.
Запуск програми може бути проведений з командного рядка будь-якого файлового менеджера або з системного меню програм операційної системи, а також відповідним ярликом при його наявності.
Д.2.4. Команди оператора
Для зручності доступу основні пункти меню дублюються відповідними кнопками з аналогічними піктограмами на панелях інструментів, а також можуть бути доступні за допомогою «гарячих клавіш».
Нижче наведено опис піктограм із зазначенням у дужках "гарячих клавіш»:
* - Створити новий файл (F2);
* - Відкрити BMP-файл (F3);
* - Відкрити масив точок з файлу (Ctrl + F3);
- Зберегти BMP-файл (F4);
- Зберегти масив точок у файл (Ctrl + F4);
* - Зберегти код ліній у файл (Shift + F4);
* - Виконати повну обробку зображення (F9);
- Виконати пошук вузлів (F5);
- Виконати пошук сегментів ліній (F6);
- Виконати кодування сегментів ліній (F7);
- Зменшити масштаб зображення (Ctrl + =);
- Збільшити масштаб зображення (Ctrl + -);
* - Встановити масштаб зображення 100% (Ctrl +1);
* - Встановити 10-кратне збільшення зображення (Ctrl +0);
- Встановити масштаб зображення за розмірами вікна (Ctrl + \);
* - Вкл / Викл сітку (Ctrl + G);
- Вкл / Викл підсвічування сегментів (Ctrl + J);
- Вкл / Викл підсвічування вузлів перетинів (Ctrl + K);
- Вкл / Викл блокування зображення (Ctrl + L);
- Показати вікно налаштування програми (F10);
Вікно програми представлено на рис. Д.2.1.
Вікно програми

Рис. Д.2.1
Для відкриття файлу, що містить вхідне зображення слід вибрати в меню "Файл" пункт "Відкрити файл» або «Завантажити масив» для отримання зображення з файлу формату BMP або файлу масиву точок відповідно (рис. Д.2.2). Далі в діалозі вибору файлу слід вибрати необхідний файл або ввести його ім'я і натиснути кнопку «Відкрити». Після цього файл буде завантажений і з нього буде сформований масив точок вихідного зображення.
Меню «Файл»

Рис. Д.2.2
При перегляді зображення для зміни масштабу слід скористатися елементами підменю «Масштаб» меню «Вид» (рис. Д.2.3).
Для редагування зображення варто скористатися маніпулятором миша. При натисненні лівої кнопки на області зображення відповідна точка зображення забарвлюється в чорний колір, що відповідає наявності точки в масиві точок оброблюваного зображення. При натисканні правої кнопки на області зображення відповідна точка зображення буде пофарбована в білий колір, що відповідає відсутності точки в масиві точок оброблюваного зображення (рис. Д.2.4). Дані дії схожі з діями, виконуваними при роботі в будь-якому графічному редакторі (наприклад, Microsoft Paint) і не представляють особливої ​​складності.
Підменю «Масштаб» меню «Вид»

Рис. Д.2.3
Режим редагування зображення

Рис. Д.2.4
Для створення нового зображення слід використовувати в меню "Файл" пункт "Новий". При цьому буде викликаний діалог, що дозволяє задати необхідні розміри нового зображення (рис. Д.2.5).
Вибір розміру нового зображення

Рис. Д.2.5
Обробка вхідного зображення може бути виконана двома способами:
- В режимі покрокової обробки;
- В режимі повної обробки.
Доступ до режимів обробки зображення здійснюється за допомогою пунктів меню «Обробка» (рис. Д.2.6).
Виконання аналізу вхідного графічного зображення в режимі покрокової обробки дозволяє по черзі виконати спочатку процедуру пошуку вузлових точок, потім процедуру пошуку сегментів ліній, а потім процедуру кодування сегментів ліній. Для виконання даних дій слід скористатися відповідними пунктами меню «Обробка» (рис. Д.2.6).
Режим повної обробки дозволяє послідовно автоматично виконати пошук вузлів, пошук сегментів і кодування сегментів, отримуючи на виході результат, готовий для передачі в підсистему ланцюгового кодування. Для виклику обробки в даному режимі слід скористатися відповідним пунктом меню «Обробка» (рис. Д.2.6).
Меню «Обробка»

Рис. Д.2.6
Після виконання обробки зображення її результати можуть бути переглянуті на самому початковому зображенні. Для цього слід скористатися пунктами-перемикачами меню «Вид» (рис. Д.2.7).
Пункт «Сітка» дозволяє включити або виключити відображення сітки зображення при його збільшенні.
Пункт «Підсвічування ліній» дозволяє включити або вимкнути підсвічування сегментів ліній при наведенні покажчика миші на різні області зображення (для даного режиму потрібно попереднє виконання процедури «Пошук сегментів»).
Пункт «Підсвічування вузлів» дозволяє включити або вимкнути підсвічування вузлів при наведенні покажчика миші на різні області зображення (для даного режиму потрібно попереднє виконання процедури «Пошук вузлів»).
Пункт «Заблокувати вид» дозволяє зафіксувати виділені елементи зображення, не змінюючи підсвічування при переміщенні курсору миші в області зображення.
Меню «Вид»

Рис. Д.2.7
Приклад підсвічування вузла наведено на рис. П.2.8
Підсвітка вузла

Рис. П.2.8
Приклад підсвічування сегмента наведено на рис. П.2.9
Підсвітка сегмента

Рис. П.2.9
У результаті остаточної обробки зображення в області «Результат обробки» будуть виведені коди, призначені для подальшої передачі в підсистему ланцюгового кодування (рис. п.2.10). Дані результати можуть бути збережені у файл. Для цього слід використовувати пункт «Зберегти код» в меню «Файл».
Результат кодування сегментів

Рис. П.2.10
Після роботи з зображенням вихідний масив точок може бути збережений у файл, для цього слід скористатися пунктами "Зберегти масив» або «Зберегти файл» у меню «Файл» для збереження у файл масиву точок або у файл формату BMP відповідно. При виборі цих пунктів буде викликаний стандартний діалог для збереження файлу, де слід вказати ім'я файлу і натиснути кнопку «Зберегти».
Після роботи з програмою для коректного її завершення слід використовувати пункт «Вихід» у меню «Файл» (рис. п.2.11) або використовувати стандартну піктограму закриття вікна. При цьому буде виданий запит на підтвердження виходу з програми (мал. п.2.12). Щоб уникнути втрати даних при виході з програми слід переконатися, що всі необхідні дані збережені.
Вихід з програми

Рис. П.2.11
Запит на підтвердження виходу

Рис. П.2.12

Д.2.5. Повідомлення оператору
Повідомлення, що видаються при роботі з програмою і дії, які необхідно виконати при їх отриманні, наведені в таблиці Д.2.1.
Таблиця Д.2.1
Повідомлення, що видаються при роботі програми і необхідні дії при їх отриманні
Повідомлення
Опис
Дії
1
2
3
Розмір нового зображення
Програма пропонує вибрати розмір новостворюваного зображення в точках
Ввести значення ширини і висоти зображення
Невірно вказано число
Введене число не відповідає заданим форматом
Ввести коректне число
Вихід?
Запит на підтвердження виходу з програми. Не збережені дані можуть бути втрачені
Підтвердити або спростувати запит на вихід
Неможливо відкрити файл
Сталася помилка при спробі відкрити вказаний файл
Перевірити наявність файлу і доступу до нього
Неможливо зберегти файл
Сталася помилка при спробі зберегти вказаний файл
Перевірити наявність доступу до вказаного шляху.
Файл вже існує. Перезаписати?
Файл з ім'ям, вказаним для збереження, вже існує
Підтвердити запит на перезапис або вибрати інше ім'я файлу
Налаштування
Викликаний діалог налаштування програми
Виконати необхідні дії з настройки, потім натиснути кнопку «ОК» для збереження змін або кнопку «Скасування» для їх скасування
Не виконаний пошук вузлів
При покрокової обробці була викликана процедура пошуку сегментів перш ніж був виконаний пошук вузлів
Спочатку необхідно виконати пошук вузлів, а потім виконувати пошук сегментів
Не виконаний пошук сегментів
При покрокової обробці була викликана процедура кодування сегментів перш ніж був виконаний пошук сегментів
Спочатку необхідно виконати пошук сегментів, а потім виконувати їх кодування

ДОДАТОК 3
ТЕКСТ ПРОГРАМИ
Д.3.1. Текст модуля lineseg. H
//------------------------------------------------ ---------------------------
# Ifndef LineSegH
# Define LineSegH
//------------------------------------------------ ---------------------------
# Include <Classes.hpp>
# Include <Controls.hpp>
# Include <StdCtrls.hpp>
# Include <Forms.hpp>
# Include <ActnList.hpp>
# Include <Menus.hpp>
# Include <Dialogs.hpp>
# Include <Graphics.hpp>
# Include <ExtCtrls.hpp>
# Include <ComCtrls.hpp>
# Include <ToolWin.hpp>
# Include <ImgList.hpp>
# Include <CustomizeDlg.hpp>
//------------------------------------------------ ---------------------------
class TfrmLineSeg: public TForm
{
__published: / / IDE-managed Components
TStatusBar * sb1;
TPanel * Panel1;
TScrollBox * scb1;
TImage * Image1;
TImage * Image2;
TMainMenu * MainMenu1;
TMenuItem * N1;
TMenuItem * N3;
TMenuItem * N5;
TMenuItem * N4;
TMenuItem * N2;
TMenuItem * N6;
TMenuItem * N10;
TMenuItem * N11;
TMenuItem * N12;
TMenuItem * N1001;
TMenuItem * N10x1;
TMenuItem * N9;
TActionList * ActionList1;
TAction * actExit;
TAction * actOpenFile;
TAction * actSaveFile;
TAction * actNewFile;
TAction * actZoomIn;
TAction * actZoomOut;
TAction * actZoom1;
TAction * actZoom10;
TAction * actAnalyze;
TAction * actGridCheck;
TAction * actLightCheck;
TOpenDialog * OpenDialog1;
TSaveDialog * SaveDialog1;
TImageList * ImageList1;
TCoolBar * CoolBar1;
TToolBar * ToolBar1;
TToolBar * ToolBar2;
TToolBar * ToolBar3;
TToolButton * ToolButton1;
TToolButton * ToolButton2;
TToolButton * ToolButton3;
TToolButton * ToolButton4;
TToolButton * ToolButton5;
TToolButton * ToolButton6;
TToolButton * ToolButton7;
TToolButton * ToolButton8;
TToolButton * ToolButton13;
TToolButton * ToolButton14;
TAction * actLineLightCheck;
TToolButton * ToolButton11;
TToolButton * ToolButton10;
TAction * actSegLightCheck;
TSplitter * Splitter1;
TPanel * Panel2;
TMemo * MemoLog;
TMemo * MemoOut;
TSplitter * Splitter2;
TToolButton * ToolButton12;
TAction * actLockView;
TToolButton * ToolButton16;
TMenuItem * N8;
TMenuItem * N16;
TMenuItem * N17;
TMenuItem * N18;
TToolButton * ToolButton17;
TAction * actAnalyzeNode;
TAction * actAnalyzeSeg;
TToolButton * ToolButton9;
TAction * actMatchLines;
TToolButton * ToolButton18;
TToolButton * ToolButton20;
TAction * actZoomWnd;
TMenuItem * N19;
TToolButton * ToolButton21;
TAction * actMatchOut;
TMenuItem * N7;
TMenuItem * N22;
TAction * actOpenArray;
TAction * actSaveArray;
TMenuItem * N23;
TMenuItem * N24;
TToolButton * ToolButton22;
TToolButton * ToolButton23;
TMemo * mArray;
TAction * actOptions;
TMenuItem * N13;
TToolButton * ToolButton15;
TToolButton * ToolButton19;
TLabel * Label1;
TLabel * Label2;
TToolButton * ToolButton24;
TMenuItem * N14;
TAction * actSaveCode;
TMenuItem * N20;
TToolButton * ToolButton25;
TToolButton * ToolButton26;
TToolButton * ToolButton27;
TAction * actSegCodeOut;
TMenuItem * N15;
void __fastcall actExitExecute (TObject * Sender);
void __fastcall FormCreate (TObject * Sender);
void __fastcall actZoomInExecute (TObject * Sender);
void __fastcall actZoomOutExecute (TObject * Sender);
void __fastcall actOpenFileExecute (TObject * Sender);
void __fastcall actSaveFileExecute (TObject * Sender);
void __fastcall Image2MouseMove (TObject * Sender, TShiftState Shift,
int X, int Y);
void __fastcall Image2MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall actZoom1Execute (TObject * Sender);
void __fastcall actAnalyzeExecute (TObject * Sender);
void __fastcall FormCanResize (TObject * Sender, int & NewWidth,
int & NewHeight, bool & Resize);
void __fastcall actNewFileExecute (TObject * Sender);
void __fastcall actGridCheckExecute (TObject * Sender);
void __fastcall actLightCheckExecute (TObject * Sender);
void __fastcall actZoom10Execute (TObject * Sender);
void __fastcall actLineLightCheckExecute (TObject * Sender);
void __fastcall actSegLightCheckExecute (TObject * Sender);
void __fastcall actLockViewExecute (TObject * Sender);
void __fastcall actAnalyzeNodeExecute (TObject * Sender);
void __fastcall actAnalyzeSegExecute (TObject * Sender);
void __fastcall actMatchLinesExecute (TObject * Sender);
void __fastcall FormCloseQuery (TObject * Sender, bool & CanClose);
void __fastcall actZoomWndExecute (TObject * Sender);
void __fastcall actMatchOutExecute (TObject * Sender);
void __fastcall actOpenArrayExecute (TObject * Sender);
void __fastcall actSaveArrayExecute (TObject * Sender);
void __fastcall actOptionsExecute (TObject * Sender);
void __fastcall actSaveCodeExecute (TObject * Sender);
void __fastcall actSegCodeOutExecute (TObject * Sender);
private: / / User declarations
void ZoomTo (double z);
void DrawGrid ();
void ShowInfo (int X, int Y);
int __fastcall NeigCount (int x, int y);
int VectMove (int & x, int & y, int vect);
void wlog (AnsiString s);
AnsiString VectToStr (int v);
void ValidateView ();
double plDistance (double x, double y, double x1, double y1, double x2, double y2);
/ / PlDistance обчислює відстань (мінімальний) від точки (x, y)
/ / До прямої, заданої точками (x1, y1) та (x2, y2)
AnsiString StrToLen (AnsiString str, int len);
/ / StrToLen возвражает рядок довжини len
/ / Заповнюючи прогалини відсутні символи на початку рядка str
void __fastcall NeigNode (int x, int y, int n);
/ / NeigSeg обробляє сусідів точки (x, y)
/ / На приналежність вузла n
/ / Є рекурсивної
void __fastcall NeigLine (int x, int y, int n);
/ / NeigLine обробляє сусідів точки (x, y)
/ / На продовження лінії n
/ / Є рекурсивної
void __fastcall GetLineVect (int x, int y, int n);
/ / GetLineVect обробляє лінію в код
/ / Рекурсивна
TPoint NodeCentre (int n);
/ / NodeCentre повертає центр вузла n (координати вузлової точки)
void __fastcall FillLine (int n1, int n2);
/ / FillLine присвоює лінії n2 пікселі лінії n1 (об'єднання двох ліній)
TPoint __fastcall FindMatch (int x, int y);
/ / FindMatch повертає точку, що відповідає крапці x, y
void __fastcall CodeLine (int x1, int y1, int x2, int y2);
/ / CodeLine додає в глобальну змінну linecode код для відрізка (x1, y1) - (x2, y2)
void __fastcall GetLineVect2 (int x, int y, int n);
/ / GetLineVect2 обробляє лінію в код
/ / Рекурсивна
public: / / User declarations
__fastcall TfrmLineSeg (TComponent * Owner);
};
//------------------------------------------------ ---------------------------
extern PACKAGE TfrmLineSeg * frmLineSeg;
//------------------------------------------------ ---------------------------
# Endif
Д.3.2. Текст модуля lineseg.cpp
//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
# Include "LineSeg.h"
# Include "lsImgSize.h"
# Include "lsOptions.h"
# Include <math.h>
# Include <values.h>
# Include <io.h>
# Include <fcntl.h>
//------------------------------------------------ ---------------------------
# Pragma package (smart_init)
# Pragma link "PERFGRAP"
# Pragma resource "*. dfm"
# Define min (a, b) (((a) <(b))? (A): (b))
# Define max (a, b) (((a)> (b))? (A): (b))
TfrmLineSeg * frmLineSeg;
double zoom, dzoom, maxzoom;
int w, h, def, defh, selline, selnode, oldselline, oldselnode, isnode;
const int maxw = 1024, maxh = 1024;
TColor c0, c1, c2, c3, c4, c21, c5;
bool logs; / / вести журнал обчислень
int nodescnt, xs1, ys1, xs2, ys2, xs3, ys3;
AnsiString linecode; / / містить код поточної лінії
/ / Apix [i] [j] [0] - масив точок
/ / Apix [i] [j] [1] - масив ліній, номер лінії
/ / Apix [i] [j] [2] - масив вузлів, номер вузла
/ / -1 - Піксел не оброблений, 0 - немає точки,> 0 - номер лінії, кіт. належить точка
/ / Apix [i] [j] [3] - масив часу атрибутів
int apix [maxw] [maxh] [4];
//------------------------------------------------ ---------------------------
__fastcall TfrmLineSeg:: TfrmLineSeg (TComponent * Owner)
: TForm (Owner)
{
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actExitExecute (TObject * Sender)
{
frmLineSeg-> Close ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: FormCreate (TObject * Sender)
{
scb1-> Enabled = false;
logs = true;
zoom = 1.0f; dzoom = 1.0f;
maxzoom = 100.0f;
selline =- 1;
Image1-> Left = 0; Image1-> Top = 0;
Image2-> Left = 0; Image2-> Top = 0;
w = 0; h = 0;
c0 = TColor (RGB (0,0,0)); c1 = TColor (RGB (255,255,255));
c2 = TColor (RGB (0,255,0)); c3 = TColor (RGB (0,0,255));
c4 = TColor (RGB (255,0,0)); c21 = TColor (RGB (255,255,0));
c5 = TColor (RGB (200,200,200));
for (int i = 0; i <= maxw-1; i + +)
for (int j = 0; j <= maxh-1; j + +)
{
apix [i] [j] [0] = 0;
apix [i] [j] [1] = apix [i] [j] [2] = apix [i] [j] [3] =- 1;
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: FormCloseQuery (TObject * Sender, bool & CanClose)
{
CanClose = MessageBox (Handle, "Вихід?", "ЛЗ", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == ID_YES;
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actZoomInExecute (TObject * Sender)
{
zoom + = dzoom;
ZoomTo (zoom);
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actZoomOutExecute (TObject * Sender)
{
if (zoom> dzoom) zoom-= dzoom;
ZoomTo (zoom);
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void TfrmLineSeg:: DrawGrid ()
{
if (Image2-> Visible)
{
Image2-> Picture-> Bitmap-> Width = Image1-> Width;
Image2-> Picture-> Bitmap-> Height = Image1-> Height;
Image2-> Width = Image1-> Width;
Image2-> Height = Image1-> Height;
Image2-> Canvas-> Pen-> Color = c5;
Image2-> Canvas-> FillRect (Image2-> ClientRect);
if (actGridCheck-> Checked)
{
for (int i = 1; i <= Image2-> Height; i + +)
{
Image2-> Canvas-> MoveTo (int (zoom * i), 0);
Image2-> Canvas-> LineTo (int (zoom * i), Image2-> Height);
}
for (int i = 1; i <= Image2-> Width; i + +)
{
Image2-> Canvas-> MoveTo (0, int (zoom * i));
Image2-> Canvas-> LineTo (Image2-> Width, int (zoom * i));
}
}
} / / Image2-> Visible
}
void __fastcall TfrmLineSeg:: actOpenFileExecute (TObject * Sender)
{
OpenDialog1-> Title = "Відкрити зображення";
OpenDialog1-> Filter = "Файли зображень (*. bmp) | *. bmp | Усі файли (*.*)|*.*";
if (OpenDialog1-> Execute ())
{
sb1-> SimplePanel = true; sb1-> SimpleText = "Відкриття файлу ...";
Image1-> Picture-> LoadFromFile (OpenDialog1-> FileName);
Image1-> Width = Image1-> Picture-> Bitmap-> Width;
Image1-> Height = Image1-> Picture-> Bitmap-> Height;
w = Image1-> Picture-> Width;
h = Image1-> Picture-> Height;
scb1-> Enabled = true;
ZoomTo (zoom);
for (int i = 0; i <= w-1; i + +) / / maxw-1
for (int j = 0; j <= h-1; j + +) / / maxh-1
{
apix [i] [j] [0] = Image1-> Canvas-> Pixels [i] [j] == c0? 1:0;
apix [i] [j] [1] = apix [i] [j] [2] = apix [i] [j] [3] =- 1;
}
sb1-> SimpleText = ""; sb1-> SimplePanel = false;
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actSaveFileExecute (TObject * Sender)
{
SaveDialog1-> Filter = "Файли зображень (*. bmp) | *. bmp | Усі файли (*.*)|*.*";
SaveDialog1-> DefaultExt = "*. bmp";
SaveDialog1-> Title = "Зберегти зображення";
if (SaveDialog1-> Execute ())
{
Image1-> Picture-> SaveToFile (SaveDialog1-> FileName);
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: Image2MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (actLockView-> Checked) return;
int ix = int (X / zoom), iy = int (Y / zoom);
if (Button == mbLeft)
{
if (Image1-> Canvas-> Pixels [ix] [iy]! = c0)
{
Image1-> Canvas-> MoveTo (ix, iy);
Image1-> Canvas-> Pixels [ix] [iy] = c0;
apix [ix] [iy] [0] = 1;
}
}
else if (Button == mbRight)
{
if (Image1-> Canvas-> Pixels [ix] [iy]! = c1)
{
Image1-> Canvas-> MoveTo (ix, iy);
Image1-> Canvas-> Pixels [ix] [iy] = c1;
apix [ix] [iy] [0] = 0;
}
}
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: Image2MouseMove (TObject * Sender,
TShiftState Shift, int X, int Y)
{
ShowInfo (X, Y);
if (actLockView-> Checked) return;
int ix = int (X / zoom), iy = int (Y / zoom);
oldselline = selline;
oldselnode = selnode;
selline = apix [ix] [iy] [1];
selnode = apix [ix] [iy] [2];
TPoint p = NodeCentre (selnode);
if (Shift.Contains (ssLeft))
{
if (apix [ix] [iy] [0]! = 1)
{
apix [ix] [iy] [0] = 1;
Image1-> Canvas-> Pen-> Color = c0;
Image1-> Canvas-> Pixels [ix] [iy] = c0;
}
else
Image1-> Canvas-> MoveTo (ix, iy);
}
else if (Shift.Contains (ssRight))
{
if (apix [ix] [iy] [0]! = 0)
{
apix [ix] [iy] [0] = 0;
Image1-> Canvas-> Pen-> Color = c1;
Image1-> Canvas-> Pixels [ix] [iy] = c1;
}
else
Image1-> Canvas-> MoveTo (ix, iy);
}
if (actLineLightCheck-> Checked & & selline! = oldselline)
{
if (apix [ix] [iy] [1]> 0) / / є лінія
{
DrawGrid ();
Image2-> Canvas-> Pen-> Color = c2;
for (int i = 0; i <w; i + +) / / виділяємо лінію
{
for (int j = 0; j <h; j + +)
{
if (apix [i] [j] [1] == selline) / / лінія
{
Image2-> Canvas-> MoveTo (int (zoom * i), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * (j +1)));
Image2-> Canvas-> LineTo (int (zoom * i), int (zoom * (j +1)));
Image2-> Canvas-> LineTo (int (zoom * i), int (zoom * j));
if (NeigCount (i, j) == 1) / / початок лінії
{
Image2-> Canvas-> MoveTo (int (zoom * i), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * (j +1)));
Image2-> Canvas-> MoveTo (int (zoom * (i +1)), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * i), int (zoom * (j +1)));
}
if (apix [i] [j] [2]> 0) / / перетин лінії з вузлом
{
Image2-> Canvas-> MoveTo (int (zoom * i), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * (j +1)));
p = NodeCentre (apix [i] [j] [2]);
Image2-> Canvas-> Pen-> Color = c4;
Image2-> Canvas-> MoveTo (int (zoom * px), int (zoom * py));
Image2-> Canvas-> LineTo (int (zoom * (p.x +1)), int (zoom * py));
Image2-> Canvas-> LineTo (int (zoom * (p.x +1)), int (zoom * (p.y +1)));
Image2-> Canvas-> LineTo (int (zoom * px), int (zoom * (p.y +1)));
Image2-> Canvas-> LineTo (int (zoom * px), int (zoom * py));
Image2-> Canvas-> Pen-> Color = c2;
}
}
} / / For j
} / / For i
}
} / / ActLineLightCheck-> Checked
if (actSegLightCheck-> Checked & & selnode! = oldselnode)
{
if (apix [ix] [iy] [2]> 0) / / є вузол
{
DrawGrid ();
Image2-> Canvas-> Pen-> Color = c3;
for (int i = 0; i <w; i + +) / / виділяємо вузол
{
for (int j = 0; j <h; j + +)
{
if (apix [i] [j] [2] == selnode) / / вузол
{
Image2-> Canvas-> MoveTo (int (zoom * i), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * (j +1)));
Image2-> Canvas-> LineTo (int (zoom * i), int (zoom * (j +1)));
Image2-> Canvas-> LineTo (int (zoom * i), int (zoom * j));
if (apix [i] [j] [1]> 0) / / перетин вузла з лінією
{
Image2-> Canvas-> MoveTo (int (zoom * i), int (zoom * j));
Image2-> Canvas-> LineTo (int (zoom * (i +1)), int (zoom * (j +1)));
}
}
} / / For j
} / / For i
/ /
Image2-> Canvas-> Pen-> Color = c4;
Image2-> Canvas-> MoveTo (int (zoom * px), int (zoom * py));
Image2-> Canvas-> LineTo (int (zoom * (p.x +1)), int (zoom * py));
Image2-> Canvas-> LineTo (int (zoom * (p.x +1)), int (zoom * (p.y +1)));
Image2-> Canvas-> LineTo (int (zoom * px), int (zoom * (p.y +1)));
Image2-> Canvas-> LineTo (int (zoom * px), int (zoom * py));
}
} / / ActSegLightCheck-> Checked
}
//------------------------------------------------ ---------------------------
void TfrmLineSeg:: ShowInfo (int X, int Y)
{
unsigned char r, g, b;
int ix = int (X / zoom), iy = int (Y / zoom);
if (X> = 0 & & Y> = 0)
{
sb1-> Panels-> Items [1] -> Text = IntToStr (ix);
sb1-> Panels-> Items [3] -> Text = IntToStr (h-1-iy);
r = Image1-> Canvas-> Pixels [ix] [iy];
g = Image1-> Canvas-> Pixels [ix] [iy]>> 8;
b = Image1-> Canvas-> Pixels [ix] [iy]>> 16;
sb1-> Panels-> Items [5] -> Text = IntToStr (r);
sb1-> Panels-> Items [7] -> Text = IntToStr (g);
sb1-> Panels-> Items [9] -> Text = IntToStr (b);
}
sb1-> Panels-> Items [11] -> Text = IntToStr (int (zoom));
/ / If (apix [ix] [iy] [0]! =- 1)
{
sb1-> Panels-> Items [13] -> Text = IntToStr (apix [ix] [iy] [0]);
sb1-> Panels-> Items [15] -> Text = IntToStr (apix [ix] [iy] [1]);
}
sb1-> Panels-> Items [17] -> Text = IntToStr (apix [ix] [iy] [2]);
sb1-> Panels-> Items [19] -> Text = IntToStr (apix [ix] [iy] [3]);
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actZoom1Execute (TObject * Sender)
{
zoom = 1.0f;
Image1-> Width = Image1-> Picture-> Width;
Image1-> Height = Image1-> Picture-> Height;
DrawGrid ();
}
//------------------------------------------------ ---------------------------
void __fastcall TfrmLineSeg:: actAnalyzeExecute (TObject * Sender)
{
MemoLog-> Clear ();
actAnalyzeNodeExecute (Sender);
actAnalyzeSegExecute (Sender);
}
//------------------------------------------------ ---------------------------
int __fastcall TfrmLineSeg:: NeigCount (int x, int y)
{
int n = 0;
if (Image1-> Canvas-> Pixels [x-1] [y-1] == c0 & & x> 0 & & y> 0) n + = 1; / / lu = 1
if (Image1-> Canvas-> Pixels [x] [y-1] == c0 & & y> 0) n + = 1; / / u = 2
if (Image1-> Canvas-> Pixels [x +1] [y-1] == c0 & & x <w && y> 0) n + = 1; / / ru = 3
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Диплом
368кб. | скачати


Схожі роботи:
Система автоматизованого аналізу просторової структури зображень Підсистема центроїдне
Система багатомасштабного аналізу дискретних сигналів Підсистема вейвлет аналізу
Система ідентифікації особи за відбитками пальців Підсистема аналізу зображення
Моделі мультиграничної сегментації зображень
Основні характеристики просторової структури випромінювання
Розробка структури автоматизованого робочого місця для ландшафтного проектування
Побудова двофакторної моделі моделей парної лінійної прогресії і множинної лінійної регресії
Автоматизована система управління документообігом центральної заводської лабораторії Підсистема
Теоретичні підходи до аналізу соціальної структури суспільства
© Усі права захищені
написати до нас