Лекции по МРРиИ, Геппенер В.В. / LECTURE12 / fuzzy
.doc. Нечеткое признаковое описание
Еще одним видом признакоых описаний объектов является нечеткое признаковое описание. Его формирование осуществляется в соответствии с процедурой описанной ниже.
Сначала выделяются локальные признаки контура изображения. Для этого осуществляется его деление на короткие отрезки определенной длины, и находятся углы между смежными отрезками Bi. Затем определяются разности DBi между данными углами и углом в 180 градусов. Если разность положительная, то Bi - выпуклый, если отрицательная, то Bi - вогнутый.
Деление контура на короткие отрезки производится следующим образом. Находится «центр тяжести» изображения, из него с угловым шагом D проводятся радиус-векторы до края изображения (рис. 5.2). Измеряется длина каждого радиус-вектора и по измеренным длинам определяются углы между смежными отрезками Bi в соответствии с определенной формулой (формула приводится ниже при описании алгоритма).
Центр Угол Bi
тяжести между смежными
изображения отрезками
Рис. 5.2
Далее смежные участки классифицируются по трем эталонным образцам: ЛИНИЯ, КРИВАЯ и УГОЛ. Эта процедура заключается в сопоставлении вычисленного значения разности углов с функцией принадлежности m(DBi) (рис.5.3).
ЛИНИЯ КРИВАЯ УГОЛ
m(DBi),
у.е.
1
0 6 18 30 DBi, градусы
Рис. 5.3
Получив локальные признаки контура (например, Табл. 5.1), делают заключение о макропризнаках всей формы.
Таблица 5.1
-
Участок
ЛИНИЯ
КРИВАЯ
УГОЛ
Выпуклость-1
Вогнутость -0
1
0.7
0.2
0
1
i
.....
....
....
....
n
0
0.5
0.5
0
С целью упрощения формального перехода от аналитического описания предлагаемого способа к его программной реализации, будем в дальнейшем близки в изложении к языку программирования PASCAL.
Как следует из рис. 5.4, любой фрагмент фигуры можно представить с помощью двух треугольников.
B[i+1]
G[i]
R[i+1]
D R[i] A[i]
O B[i]
центр D G[i-1]
тяжести
фигуры
R[i-1] A[i-1]
B[i-1]
Рис. 5.4
D-Дискрет по углу.
Массив значений R[i]- Величины радиус-векторов.
Массив значений A[i]- Величины прилежащих углов.
Массив значений G[i]- Величины противолежащих углов.
Массив значений B[i]- Величины внешних углов фигуры.
Первоначально известны только величины D и значения радиус-векторов R[i]. Необходимо найти значения внешних углов фигуры B[i].
Значения В[i] можно определить из формулы B[i]=360-A[i]-G[i-1], следовательно, необходимо найти значения прилежащих и противолежащих углов. Однако, следует учесть, что в языке Pascal не существует функций ArcCos и ArcSin, а имеется только функция ArcTan. Поэтому наиболее приемлемым будет приводимый ниже вариант алгоритма.
Необходимое дополнение: Для оптимизации программы алгоритма необходимо расширить массив значений радиус-векторов. R[n+1]=R[1].
Нахождение значений углов A[i]
R[i+1] R[i+1]
H[i] H[i]
D A[i] D A[i]
O O
R[i] K[i] R[i] K[i]
Рис. 5.5 Рис. 5.6
Значение высоты H[i] находится по формуле:
Н[i]=R[i+1]*Sin(D).
На радиус-векторе R[i] образовался отрезок K[i],величина которого вычисляется следующим образом:
K[i]=R[i]-R[i+1]*Cos(D);
K[i] может быть как положительной (рис. 5.5), так и отрицательной (рис. 5.6) величиной.
Из формул прямоугольного треугольника можно найти тангенс угла A[i]:
Tg(Ap[i])= H[i]/K[i] = R[i+1]*Sin(D)/(R[i]-R[i+1]*Cos(D))
В том случае, если K[i] отрицательное, то и тангенс будет отрицательным. Это не страшно, так как можно применить тригонометрическое соотношение:
Tg(180-a)=-Tg(a);
Этот случай соответствует тупоугольному треугольнику (рис. 5.6).
Можно составить блок-схему данного фрагмента алгоритма.
Начало
Организуем цикл вычисления A[i]
i:=1;
K[i]:=R[i]-R[i+1]*Cos(D);
A[i]:=ArcTan(ABS(R[i+1]*Sin(D)/K[i]));
A[i]:=A[i]*180/Pi;
Нет
K[i]<0
Да
A[i]:=180-A[i];
Нет
INC(i) i>=N
Да
Конец
Нахождение значений углов G[i].
Из формулы треугольника G[i]=180-A[i]-D, легко включается в уже рассмотренный цикл.
Начало
Организуем цикл вычисления A[i] и G[i]
i:=1;
K[i]:=R[i]-R[i+1]*Cos(D);
A[i]:=ArcTan(ABS(R[i+1]*Sin(D)/K[i]));
A[i]:=A[i]*180/Pi;
Нет
K[i]<0
Да
A[i]:=180-A[i];
G[i]:=180-A[i]-D
Нет
INC(i) i>=N
Да
Конец
Необходимое дополнение: Для оптимизации программы алгоритма необходимо расширить массив значений углов G[i] G[0]=G[n];
Можно определить величины B[i]
Начало
i:=1
B[i]:=360-A[i]-G[i-1]
Нет
INC(i) i>=N
Да
Конец
Определяем: Выпуклый или вогнутый участок контура
B[i]>180 -участок контура выпуклый Pr_v[i]=1;
B[i]<180 -участок контура вогнутый Pr_v[i]=0;
Начало
i:=1
B[i]:=360-A[i]-G[i-1]
Да Нет
B[i]>=180
Pr_v[i]:=1 Pr_v[i]:=0;
Нет
INC(i) i>=N
Да
Конец
Находим разности углов B[i]-180.(По модулю)
Delta_B[i]=ABS(B[i]-180);
Необходимое дополнение Расширить массив B[i] B[N+1]:=B[1];
Начало
i:=1
Delta_B[i]:=ABS(B[i]-180);
Нет Да
INC(i) i>=N Конец
Классификация участков по трем эталонным образцам. Процедура заключается в сопоставлении вычисленной разности углов с функцией принадлежности.
Функция ЛИНИИ
У.е.
1
0
0 6 18 Разность углов, градусы
if Delta_B[i]<=6 Then FL[i]:=1;
if (Delta_B[i]>6)and(Delta_B[i]<18) then FL[i]:=1.5-Delta_B[i]/12;
if Delta_B[i]>=18 Then FL[i]:=0;
Функция УГЛА
У.е.
1
0
0 18 30 Разность углов, градусы
if Delta_B[i]<=18 Then FU[i]:=0;
if (Delta_B[i]>18)and(Delta_B[i]<30) then FU[i]:=Delta_B[i]/12-1.5;
if Delta_B[i]>=30 Then FU[i]:=1;
Функция КРИВОЙ
У.е.
1
0
0 6 18 30 Разность углов, градусы
if (Delta_B[i]<=6)or(Delta_B[i]>=30) Then FK[i]:=0;
if (Delta_B[i]>6)and(Delta_B[i]<=18) then FK[i]:=Delta_B[i]/12-0.5;
if (Delta_B[i]>18)and(Delta_B[i]<30) then FK[i]:=2.5-Delta_B[i]/12;
Все приведенные выше условия можно свести к следующим:
For i:=1 to N do begin
if (Delta_B[i]<=6) Then begin FL[i]:=1;FU[i]:=0;FK[i]:=0; end;
if (Delta_B[i]>6)and(Delta_B[i]<=18) then begin FL[i]:=1.5-Delta_B[i]/12;
FU[i]:=0;
FK[i]:=Delta_B[i]/12-0.5;end;
if (Delta_B[i]>18)and(Delta_B[i]<=30) then begin FL[i]:=0;
FU[i]:=Delta_b[i]/12-1,5;
FK[i]:=2.5-Delta_B[i]/12;end;
if (Delta_B[i]>30) Then begin FL[i]:=0;FU[i]:=1;FK[i]:=0;end;
end;
Далее строится таблица следующего содержания
Участок |
Функция Линии |
Функция Кривой |
Функция Угла |
Выпукл/Вогнут |
1 |
FL[1] |
FK[1] |
FU[1] |
Pr_v[1] |
i |
FL[i] |
FK[i] |
FU[i] |
Pr_v[i] |
N |
FL[n] |
FK[n] |
FU[n] |
Pr_v[n] |
|
Сумма значений SFL |
Сумма Значений SFK |
Сумма значений SFU |
Сумма значений SPr_v |
и находятся характеристики:
Доля линий: D_L=100%*SFL/(SFL+SFK)
Доля кривых: D_K=100-D_L;
Количество выпуклых углов и доля выпуклости определяется следующим образом:
U1:=0; Z1:=0;
For i:=1 to N do if Pr_v[i]=1 tnen begin U1:=U1+FU[i]; INC(Z1); end;
Z1:=Z1/N*100%
Аналогично - вогнутые углы и доля вогнутости:
U0:=0; Z0:=0;
For i:=1 to N do if Pr_v[i]=0 tnen begin U0:=U0+FU[i]; INC(Z0); end;
Z0:=Z0/N*100%