-
Notifications
You must be signed in to change notification settings - Fork 0
/
FA.m
94 lines (79 loc) · 3.27 KB
/
FA.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
function [bfit,befit,best,besth]=FA(n,MaxGeneration,histogram,dims,gamma)
% Táto funkcia je Firefly algorithm (FA). Sluzi na najdenie prahov
% pomocou optimalizovanie objektívnej funkcie. Vstupy su:
% n=pocet svetlusiek
% MaxGeneration=pocet populacií svetlusiek
% histogram = histogram segmentovaného obrazu
% dims = pocet tresholdov
% gamma = absorpcia svetla prostredím
% Výstupom funkcie je vektor best, čo su prahy patriace k hodnote maximálnej entropie obrazu,
% matica besth, prahy nájdené počas iterácií algoritmov
% vektor befit čo sú zapamätané hodnoty maximálnej entropie počas iterácií algoritmu
% hodnota bfit čo je hodnota maximálnej entropie
% vektor priebeh čo je hodnota nájdenej maximálnej entropie počas iterácií algoritmu
% Funkcia bola stiahnutá z https://www.mathworks.com/matlabcentral/fileexchange/29693-firefly-algorithm
% a modifikovaná Kristínou Olešovou
%% Maximum enthropy function ---------------------
range =[2,256] ; %rozsah histogramu, rozsah hladania riešenie
%2 sluzi ako automaticke ošetrenie v prípade nastavovanie prahov na 1
[f ] = maximal_entropy(histogram,dims); %maximálna entropia
%% Určenie Premenných vo vnútri algoritmu
alpha=0.43; % veľkosť náhodného pohybu
delta=0.99; % Redukcia náhodnosti
%% Inicializácia
% Pozície svetlušiek
t=zeros(dims,n);
% Hodnoty entropie
zn=zeros(1,n);
% Prahy
besth=zeros(dims,MaxGeneration);
%Hodnota maximálnej entropie
befit=zeros(1,MaxGeneration);
xrange=range(2)-range(1);
% generovanie počiatočných pozíc n svetlušiek
t(1:dims,:)=round(rand(dims,n)*xrange+range(1),0);
%% Začiatok iterácii
for iter=1:MaxGeneration,
for k=1:length(t)
if isequal(t(:,k),sort(t(:,k))) %Zjednodušenie problemu zaistením, aby prahy boli vzdy
zn(k)=f(t(:,k)); % za sebou
else
t(:,k)=sort(t(:,k));
zn(k)=f(t(:,k));
end
end
% Preusporiadanie svetlušiek na základe ich intenzity svetla/entropie
[Lightn,Index]=sort(zn); %porovnanie hodnot intenzity svetlusiek
t(:)=t(:,Index);
%vytvorenie premenných na uloženie pôvodných pozícii svetlušiek
to=t;
Lighto=Lightn;
%% Move all fireflies to the better locations
ni=size(t,2); nj=size(to,2);
% Porovnáva sa jedna svetluška ku všetkým ostatným
for i=1:ni,
for j=1:nj,
%vzdialenosť
r=sqrt(sum((t(:,i)-t(:,j)).^2));
% Nižšia hodnota entropie
if Lightn(i)<Lighto(j),
% Výpočet atraktivity
beta0=1; beta=beta0*exp(-gamma*(r/256).^2);%% tu je problem
%Pohyb menej atraktívnej svetlušky
%Jednotky by mali byť približne v rovnakých rozmeroch tj od 1 do 0 pre
% normalizovany histogram
t(:,i)=round((((t(:,i)/256).*(1-beta))+((to(:,j)/256).*beta)+(alpha.*(rand(dims,1)-0.5)))*256,0);
end
end % end for j
end % end for i
%osetrenie pokial svetlusky skoncia mimo rozsahu
aboveRange = (t(:) > range(2)); t(aboveRange)= t(aboveRange)-(2*(t(aboveRange)-range(2)));
belowRange = (t(:) < range(1)); t(belowRange)= 5;
%Zmenšovanie náhodného pohybu
alpha=alpha*delta;
besth(:,iter)=to(:,n); %posledná/najlepšia pozícia svetlušky nakoľko tá sa nehýbe
befit(iter)=Lighto(n); %Hodnota entropie poslednej svetlušky
end
%koniec iterácii
best=transpose(to(:,n)); % osetrenie pre beh algoritmu v kombinovanej segmentacií
bfit=Lighto(n); %najvyššia hodnota entropie