МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний університет «Львівська політехніка»
ІЕПТ ім. В’ячеслава Чорновола
Кафедра загальної екології та
екоінформаційних систем
ЗВІТ
по лабораторній роботі №1
на тему:
„Побудова детермінованої системи
розпізнавання образів.”
з дисципліни:
„ Розпізнавання та обробка образів”
Львів-2012
Мета роботи: навчитися проектувати системи розпізнавання образів на прикладі системи розпізнавання літаків.
Теоретичні відомості.
Вважатимемо, що образи - це деякі об'єкти (тіла, модулі), які можна виділити в досліджуваному середовищі як його незалежно існуючі складові і які ми можемо охарактеризувати скінченим числом числових чи описових характеристик.
Клас подібних образів - це сукупність образів, що мало відрізняються по заданих чи усіх характеристиках у порівнянні з іншими образами.
Система розпізнавання образів - це система, що по певному алгоритму відносить досліджуваний образ до відомих їй (системі) класів подібних образів.
Побудувати систему розпізнавання образів означає:
1. Виділити у заданих системі об’єктів характеристики, що є. спільними для деякого набору об’єктів.
2. Розбити усю множину відомих образів по класах подібності, проаналізувавши їх за характеристиками подібності.
3. Побудувати алгоритм віднесення невідомого образу до одного із. класів подібності на основі характеристик подібності.
У нашій системі розпізнавання образів літаки - це образи, а система розпізнавання літаків - це система розпізнавання образів.
Спосіб побудови системи розпізнавання наступний:
Образи (літаки.) представляються у вигляді точок у N - мірному просторі, де N - кількість характеристик, що характеризують образ (отже, кожна характеристика представляється одним із напрямів простору). У літаків можна виділити слідуючі характеристики: вага, швидкість, площа відбиття, рівень шуму, ширина крил і т.п. Тепер, якщо, наприклад, вісь Х відповідає за вагу літака, вісь Y відповідає за швидкість літака, то точки, у яких координата X дорівнює 1000,а координата Y дорівнює 300 представляють літаки з вагою 1000 і швидкістю 300. Для характеристик, які виражаються у символьному виді, наприклад колір, потрібно вводити свою шкалу значень, де кожне значення шкали відповідає певному значенню характеристики.
Характеристика подібності між образами (D), що виділені у один клас, вираховується як середня квадратична відстань між образами. Для цього обчислюються відстані між усіма можливими парами образів із класу подібності і знаходиться їх середнє значення:
де F - клас подібності;
L - відстань між і-им та j-им образами F-класу;
М - кількість можливих пар.
Система може сама виділяти групи образів, які можна віднести до одного класу подібності. Для полегшення завдання будемо працювати із заданими класами подібних образів. На початку роботи системі задається список відомих нам літаків, з вказанням їх характеристик і класу подібності (бомбардувальник, штурмовик, винищувач). З цього списку система виділяє літаки, що належать одному класу і обчислює його характеристику подібності. Характеристика подібності кожного класу покаже нам рівень згрупування образів у кожному класі і дозволить класифікувати невідомий літак.
Нехай маємо невідомий об'єкт (у нашому випадку літак), описаний певними характеристиками. Визначаємо належність невідомого об'єкта до відомих нам класів. Характеристику належності до відомого класу (S) обчислюється як середнє значення відстані між невідомим об'єктом і всіма образами подібності.
де k – невідомий образ;
F - клас подібності;
і - і-тий образ F-класу;
L - відстань між невідомим та і-им образом F-класу;
N - кількість образів у F-класі.
На основі отриманих S-характеристик невідомого образу робимо висновок про клас невідомого об'єкта: він належить класу, до якого середня відстань найменша (S - найменша).
Ймовірність належності класу (Р) обчислюється як процентне співвідношення відстані до досліджуваного класу порівняно із відстанями до інших класів.
де k - невідомий образ;
F - досліджуваний клас подібності;
W - кількість класів подібності.
Маємо такі характеристики літака:
Клас літака
Вага, т.
Розмах крил, м.
Висота польоту, км.
1
Винищувач
1,5 - 3
2 - 3
1 - 2
2
Штурмовик
4 - 6
3 - 4
3 - 5
3
Бомбардувальник
7 - 15
4,5 - 6
6 - 9
Характеристика подібності між образами (D), що виділені в один клас, вираховується як середня квадратична відстань між ознаками образа. Для цього обчислюються відстані між усіма можливими параметрами образів із класу подібності і знаходяться їх середнє значення:
де D – клас подібності;
- ознаки класу.
Знаходимо еталон класу:
Характеристику належності до відомого класу (S) обчислюється як середнє значення відстані між невідомим об’єктом і всіма образами подібності.
На основі отриманих S-характеристик невідомого образу робимо висновок про клас невідомого об’єкта: він належить класу, до якого середня відстань найменша (S -найменше).
Розв’язування.
Нехай літак має такі ознаки 2, 2, 2.
за умовою і - літак є винищувачем 1-го типу.
Імовірність похибки=19.23%.
Нехай літак має такі ознаки 5, 4, 4.
за умовою і - літак штурмовиком 2-го типу.
Імовірність похибки=44.44%.
Нехай літак має такі ознаки 1, 1, 1.
оскільки - літак не є ні винищувачем, ні штурмовиком,
ні винищувачем.
//Litaku lab1_1
# include <iostream.h>
# include <math.h>
# include <conio.h>
float DX(float Z[2][3]);
float oznaku(float W[2][3],float Q[3],float X[3]);
int main()
{
float x[3], A[2][3], A1[3], B[2][3], B1[3], C[2][3], C1[3];
float d, d1, d2, d3, min;
cin >>x[0];
cin >>x[1];
cin >>x[2];
A[0][0]= 1.5, A[1][0]=3;
A[0][1]=2, A[1][1]=3;
A[0][2]=1, A[1][2]=2;
A1[0]=2.25, A1[1]=2.5;
A1[2]=1.5;
B[0][0]=4, B[1][0]=6;
B[0][1]=3, B[1][1]=4;
B[0][2]=3, B[1][2]=5;
B1[0]=5, B1[1]=3.5;
B1[2]=4;
C[0][0]=7, C[1][0]=15;
C[0][1]=4.5, C[1][1]=6;
C[0][2]=6, C[1][2]=9;
C1[0]=11, C1[1]=5.25;
C1[2]=7.5;
d=sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
d1=fabs(DX(A)-d);
d2=fabs(DX(B)-d);
d3=fabs(DX(C)-d);
min=d1;
if(min>d2) min=d2;
if(min>d3) min=d3;
if(d1==d2 || d2==d3){
if(d1==d2){
if(x[0]>A[0][0] && x[0]<A[1][0] || x[0]==A[0][0] || x[0]==A[1][0]){
if(x[1]>A[0][1] && x[1]<A[1][1] || x[1]==A[0][1] || x[1]==A[1][1]){
if(x[2]>A[0][2] && x[2]<A[1][2] || x[2]==A[0][2] || x[2]==A[1][2])
min=d1;
}
}
else min=d2;
}
if(d2==d3){
if(x[0]>B[0][0] && x[0]<B[1][0] || x[0]==B[0][0] || x[0]==B[1][0]){
if(x[1]>B[0][1] && x[1]<B[1][1] || x[1]==B[0][1] || x[1]==B[1][1]){
if(x[2]>B[0][2] && x[2]<B[1][2] || x[2]==B[0][2] || x[2]==B[1][2])
min=d2;
}
}
else min=d3;
}
}
if(min==d1){
if(x[0]>A[0][0] && x[0]<A[1][0] || x[0]==A[0][0] || x[0]==A[1][0]){
if(x[1]>A[0][1] && x[1]<A[1][1] || x[1]==A[0][1] || x[1]==A[1][1]){
if(x[2]>A[0][2] && x[2]<A[1][2] || x[2]==A[0][2] || x[2]==A[1][2]){
cout<<"nalegut' 1 klasy ";
oznaku(A,A1,x);
}
}
}
}
else if(min==d2){
if(x[0]>B[0][0] && x[0]<B[1][0] || x[0]==B[0][0] || x[0]==B[1][0]){
if(x[1]>B[0][1] && x[1]<B[1][1] || x[1]==B[0][1] || x[1]==B[1][1]){
if(x[2]>B[0][2] && x[2]<B[1][2] || x[2]==B[0][2] || x[2]==B[1][2]){
cout<<"nalegut' 2 klasy ";
oznaku(B,B1,x);
}
}
}
}
else if(min==d3){
if(x[0]>C[0][0] && x[0]<C[1][0] || x[0]==C[0][0] || x[0]==C[1][0]){
if(x[1]>C[0][1] && x[1]<C[1][1] || x[1]==C[0][1] || x[1]==C[1][1]){
if(x[2]>C[0][2] && x[2]<C[1][2] || x[2]==C[0][2] || x[2]==C[1][2]){
cout<<"nalegut' 3 klasy ";
oznaku(C,C1,x);
}
}
}
}
else
cout<<"0";
getch();
return 0;
}
float DX(float Z[2][3])
{
float d1, d2, D;
d1=sqrt(pow(Z[0][0],2)+pow(Z[0][1],2)+pow(Z[0][2],2));
d2=sqrt(pow(Z[1][0],2)+pow(Z[1][1],2)+pow(Z[1][2],2));
D=(d1+d2)/2;
return D;
}
float oznaku(float W[2][3],float Q[3],float X[3])
{
float s1, s2, s3, k, V;
int m=0, r=0, b=0;
s1=pow(W[0][0]-X[0],2)+pow(W[0][1]-X[1],2)+pow(W[0][2]-X[2],2);
s2=pow(W[1][0]-X[0],2)+pow(W[1][1]-X[1],2)+pow(W[1][2]-X[2],2);
s3=pow(W[1][0]-Q[0],2)+pow(W[1][1]-Q[1],2)+pow(W[1][2]-Q[2],2);
k=s3/50;
if(s1<s2){
V=s1/k;
cout<<"1 tup \n";
cout<<"Vidsotok pohubku "<<V<<endl;
}
if(s1>s2){
V=s2/k;
cout <<"2 tup \n";
cout<<"Vidsook pohubku "<<V<<endl;
}
if (s1==s2){
V=s3/k;
cout<<"Vidsook pohubku "<<V<<endl;
for (int i=0; i<4; i++){
if(X[i]>Q[i])
b=b+1;
if(X[i]==Q[i])
r=r+1;
if (X[i]<Q[i])
m=m+1;
}
if (b>=2 && m<2)
cout<<"1 tup\n";
if (m>=2 && b<2)
cout<<"2 tup\n";
if (r>=2 && b<2 && m<2)
cout<<"1 abo 2 tup\n";
}
return 0;
}
=============================================================
//Litaku. Lab1
# include <iostream.h>
# include <math.h>
# include <conio.h>
int main()
{
float x[3], A[2][3], B[2][3], C[2][3], A1[3], B1[3], C1[3];
float d, d1, d2, d3, D1, D2, D3, min, s1, s2, s3, k, V;
int m=0;
int r=0;
int b=0;
cin >>x[0];
cin >>x[1];
cin >>x[2];
A[0][0]=1.5; A[1][0]=3;
A[0][1]=2; A[1][1]=3;
A[0][2]=1; A[1][2]=2;
A1[0]=2.25, A1[1]=2.5;
A1[2]=1.5;
d1=sqrt(pow(A[0][0],2)+pow(A[0][1],2)+pow(A[0][2],2));
d2=sqrt(pow(A[1][0],2)+pow(A[1][1],2)+pow(A[1][2],2));
D1=(d1+d2)/2;
B[0][0]=4, B[1][0]=6;
B[0][1]=3, B[1][1]=4;
B[0][2]=3, B[1][2]=5;
B1[0]=5, B1[1]=3.5;
B1[2]=4;
d1=sqrt(pow(B[0][0],2)+pow(B[0][1],2)+pow(B[0][2],2));
d2=sqrt(pow(B[1][0],2)+pow(B[1][1],2)+pow(B[1][2],2));
D2=(d1+d2)/2;
C[0][0]=7, C[1][0]=15;
C[0][1]=4.5, C[1][1]=6;
C[0][2]=6, C[1][2]=9;
C1[0]=11, C1[1]=5.25;
C1[2]=7;
d1=sqrt(pow(C[0][0],2)+pow(C[0][1],2)+pow(C[0][2],2));
d2=sqrt(pow(C[1][0],2)+pow(C[1][1],2)+pow(C[1][2],2));
D3=(d1+d2)/2;
d=sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
d1=fabs(D1-d);
d2=fabs(D2-d);
d3=fabs(D3-d);
min=d1;
if(min>d2)
min=d2;
if(min>d3)
min=d3;
if(d1==d2 || d2==d3){
if(d1==d2){
if(x[0]>A[0][0] && x[0]<A[1][0] || x[0]==A[0][0] || x[0]==A[1][0]){
if(x[1]>A[0][1] && x[1]<A[1][1] || x[1]==A[0][1] || x[1]==A[1][1]){
if(x[2]>A[0][2] && x[2]<A[1][2] || x[2]==A[0][2] || x[2]==A[1][2])
min=d1;
}
}
else min=d2;
}
if(d2==d3){
if(x[0]>B[0][0] && x[0]<B[1][0] || x[0]==B[0][0] || x[0]==B[1][0]){
if(x[1]>B[0][1] && x[1]<B[1][1] || x[1]==B[0][1] || x[1]==B[1][1]){
if(x[2]>B[0][2] && x[2]<B[1][2] || x[2]==B[0][2]|| x[2]==B[1][2])
min=d2;
}
}
else min=d3;
}
}
if(min==d1){
if(x[0]>A[0][0] && x[0]<A[1][0] || x[0]==A[0][0] || x[0]==A[1][0]){
if(x[1]>A[0][1] && x[1]<A[1][1] || x[1]==A[0][1] || x[1]==A[1][1]){
if(x[2]>A[0][2] && x[2]<A[1][2] || x[2]==A[0][2] || x[2]==A[1][2]){
s1=pow(A[0][0]-x[0],2)+pow(A[0][1]-x[1],2)+pow(A[0][2]-x[2],2);
s2=pow(A[1][0]-x[0],2)+pow(A[1][1]-x[1],2)+pow(A[1][2]-x[2],2);
s3=pow(A[1][0]-A1[0],2)+pow(A[1][1]-A1[1],2)+pow(A[1][2]-A1[2],2);
k=s3/50;
if(s1<s2){
V=s1/k;
cout<<"1.1\n";
cout<<"Vidsotok pohubku "<<V<<endl;
}
if(s1>s2){
V=s2/k;
cout <<"1.2\n";
cout<<"Vidsook pohubku "<<V<<endl;
}
if (s1==s2){
V=s3/k;
cout<<"Vidsook pohubku "<<V<<endl;
for (int i=0; i<3; i++){
if(x[i]>A1[i])
b=b+1;
if (x[i]==A1[i])
r=r+1;
if (x[i]<A1[i])
m=m+1;
}
if (b>=2 && m<2)
cout<<"1.1\n";
if (m>=2 && b<2)
cout<<"1.2\n";
if (r>=2 && b<2 && m<2)
cout<<"1.1 abo 1.2\n";
}
}
}
}
}
else if(min==d2){
if(x[0]>B[0][0] && x[0]<B[1][0] || x[0]==B[0][0] || x[0]==B[1][0]){
if(x[1]>B[0][1] && x[1]<B[1][1] || x[1]==B[0][1] || x[1]==B[1][1]){
if(x[2]>B[0][2] && x[2]<B[1][2] || x[2]==B[0][2] || x[2]==B[1][2]){
s1=pow(B[0][0]-x[0],2)+pow(B[0][1]-x[1],2)+pow(B[0][2]-x[2],2);
s2=pow(B[1][0]-x[0],2)+pow(B[1][1]-x[1],2)+pow(B[1][2]-x[2],2);
s3=pow(B[1][0]-B1[0],2)+pow(B[1][1]-B1[1],2)+pow(B[1][2]-B1[2],2);
if(s1<s2){
V=s1/k;
cout<<"2.1\n";
cout<<"Vidsotok pohubku "<<V<<endl;
}
if(s1>s2){
V=s2/k;
cout <<"2.2\n";
cout<<"Vidsook pohubku "<<V<<endl;
}
if (s1==s2){
V=s3/k;
cout<<"Vidsook pohubku "<<V<<endl;
for (int i=0; i<3; i++){
if(x[i]>B1[i])
b=b+1;
if (x[i]==B1[i])
r=r+1;
if (x[i]<B1[i])
m=m+1;
}
if (b>=2 && m<2)
cout<<"1.1\n";
if (m>=2 && b<2)
cout<<"1.2\n";
if (r>=2 && b<2 && m<2)
cout<<"1.1 abo 1.2\n";
}
}
}
}
}
else if(min==d3){
if(x[0]>C[0][0] && x[0]<C[1][0] || x[0]==C[0][0] || x[0]==C[1][0]){
if(x[1]>=C[0][1] && x[1]<C[1][1] || x[1]==C[0][1] || x[1]==C[1][1]){
if(x[2]>C[0][2] && x[2]<C[1][2] || x[2]==C[0][2] || x[2]==C[1][2]){
s1=pow(C[0][0]-x[0],2)+pow(C[0][1]-x[1],2)+pow(C[0][2]-x[2],2);
s2=pow(C[1][0]-x[0],2)+pow(C[1][1]-x[1],2)+pow(C[1][2]-x[2],2);
s3=pow(C[1][0]-C1[0],2)+pow(C[1][1]-C1[1],2)+pow(C[1][2]-C1[2],2);
if(s1<s2){
V=s1/k;
cout<<"3.1\n";
cout<<"Vidsotok pohubku "<<V<<endl;
}
if(s1>s2){
V=s2/k;
cout <<"3.2\n";
cout<<"Vidsook pohubku "<<V<<endl;
}
if (s1==s2){
V=s3/k;
cout<<"Vidsook pohubku "<<V<<endl;
for (int i=0; i<3; i++){
if(x[i]>C1[i])
b=b+1;
if (x[i]==C1[i])
r=r+1;
if (x[i]<C1[i])
m=m+1;
}
if (b>=2 && m<2)
cout<<"1.1\n";
if (m>=2 && b<2)
cout<<"1.2\n";
if (r>=2 && b<2 && m<2)
cout<<"1.1 abo 1.2\n";
}
}
}
}
}
else
cout<<"0";
getch();
return 0;
}
Висновок: під час виконання лабораторної роботи навчилася проектувати системи розпізнавання образів на прикладі системи розпізнавання літаків.