Detectie de contururi folosind algoritmi euristici
1.Descrierea aplicatiei
Aplicatia are ca scop gasirea contururilor intr-o imagine color, format
*.gif, *.jpg, *.jpeg. La selectarea unei poze din lista din dreapta se incarca
in fereastra appletului imaginea respectiva si se deseneaza cu rosu contururile
gasite.
2.Descrierea algoritmului folosit
Se asociaza fiecarui pixel din imagine un
numar natural intre 0 si 255 reprezentand nivelul sau de gri, si se creeaza o
matrice din aceste numere.
Se considera ca intre fiecare 2 pixeli
exista o frontiera. Pentru a o reprezenta
am folosit clasa FElement, care contine:
1.
membri:
- coordonatele pixelilor vecini ce determina acest element de frontiera;
-cost (diferenta intre nivelurile de gri
asociate celor 2 pixeli vecini). Observatii:
a) Frontiera este orientata, adica perechea de
pixeli vecini este ordonata;
b) Costul poate fi si negativ si se poate calcula
in doua moduri; (folosind notatiile din figura) cost=Cp1-Cp2, caz in care
executarea algoritmului duce la gasirea de contururi ce ocolesc eventualele
forme lasandu-le in partea stanga si respectiv cost= Cp2-Cp1 pentru ocolire
invers;
- adancime (numarul de elemente de frontiera parcurse pana la descoperirea elementului respectiv);
- parinte (pointer catre elementul de frontiera dinainte);
-destinatie (pointer catre un element de frontiera ce reprezinta coltul
dreapta jos al imaginii);
- f (costul real al drumului parcurs pana la acest element);
- g (costul estimat al drumului de la acest element pana la destinatie);
- h (suma ultimelor doua);
2.
metode:
- getVeciniS (construieste o lista de vecini folosind a doua formula de
cost);
- getVeciniD (construieste o lista de vecini folosind prima formula de
cost);
- equals (pentru a putea determina situatia in care drumul curent formeaza
un ciclu);
- getCostTotal (costul drumului gasit pana la acest element);
- getCostMediu (costul de mai sus impartit la adancime);
Observatie: Nu am luat in considerare decat contururile cu costul mediu mai
mare decat 100 (contraste mai puternice).
-
draw
(deseneaza drumul gasit pana aici).
Algoritmul propriu-zis de detectie a contururilor este implementat in
functia drumMinim( ). El se bazeaza pe gasirea unui drum de cost minim intre
doua puncte ale imaginii. Algoritmul este executat de mai multe ori, de fiecare
data punctul de start este un varf al unei retele laticeale care acopera
imaginea. Latura retelei este determinata experimental. Punctul „destinatie”
este coltul dreapta jos al imginii. Descriem in continuare algoritmul folosit.
Acesta este in esenta un A* „omorat”, in sensul ca dupa parcurgerea unui anumit
numar de pasi (deteminat prin incercari astfel incat sa optimizeze raportul
performanta/timp de executie) se pastreaza drumul cel mai bun gasit pana in
prezent, si nu se mai revine niciodata asupra lui.
Folosim trei
liste OPEN ,CLOSED si FINAL, prima dintre ele continand elementele de frontiera
descoperite dar neprelucrate, a doua elemente descoperite si prelucrate, iar
ultima elementele care fac parte din conturul final. Initial, OPEN are un
singur element (sursa) si CLOSED este vida. Cat timp OPEN nu este vida se
executa urmatotul ciclu:
-
Se alege din
OPEN cel mai „bun” element, dupa un criteriu specificat de functia best descrisa
mai jos.
-
Se
prelucreaza elementul extras, in sensul ca se sterge din OPEN si se adauga in
CLOSED, iar vecinii lui sunt adaugati in OPEN.
-
Se
actualizeaza variabila adancimeBest cu adancimea elementului extras.
-
Daca
adancimeBest atinge o anumita valoare, fixata la inceput, listele OPEN si
elementele din CLOSED se transfera in FINAL. In OPEN se pune ultimul element de
frontiera explorat. Aceasta are ca scop limitarea complexitatii si deci a
timpului de executie si nu afecteaza sensibil calitatea conturului descoperit.