Documente Academic
Documente Profesional
Documente Cultură
IMAGINILOR N SISTEME
EMBEDDED
REZUMAT
Acest proiect prezint iniial aspectele teoretice privitoare la cteva prelucrri de imagini n
sisteme embedded, destinate fie mbuntirii calitii imaginii respective (filtrri, operatori de
accentuare a muchiilor), fie extragerii de informaii n scopul recunoaterii formelor (etichetarea,
determinarea conturului, calculul diferitor parametri ai obiectelor din imagine). Aici am descris
att avantajele, ct i dezavantajele lor, precum i cteva exemple sugestive de utilizare a
acestora.
Se descriu apoi algoritmii aplicai n implementarea unora dintre prelucrrile prezentate n
partea teoretic, pentru ca, n final, acestea s se utilizeze n realizarea unui sistem capabil s
recunoasc figurile geometrice din imagini captate n timp real i s urmreasc un obiect cu
caracteristici cunoscute.
La baza realizrilor practice a stat platforma EZ-KIT LITE ADSP-BF533 de la Analog
Devices mpreun cu mediul de dezvoltare Visual DSP++.
Cuprins
CAPITOLUL 1 - INTRODUCERE............................................................................3
CAPITOLUL 2 - ASPECTE TEORETICE................................................................4
2.1. Prelucrri de imagini.........................................................................................4
2.1.1. Operaii morfologice - Erodarea i Dilatarea..........................................4
2.1.2. Filtrri......................................................................................................6
2.1.2.1. Filtrarea spaial................................................................................................ 7
2.1.2.1.1. Filtre liniare.............................................................................................. 7
2.1.2.1.1.1. Filtrarea trece jos Filtrul Gaussian.........................8
2.1.2.1.1.2. Filtrarea trece sus Operatorul Sobel.....................10
2.1.2.1.2. Filtre neliniare Filtrul median.................................................... 12
2.1.2.2. Filtrarea temporal......................................................................................... 13
2.1.3. Segmentarea............................................................................................14
2.1.4. Etichetarea..............................................................................................17
2.2. Procesoare.......................................................................................................19
2.2.1. Procesorul ADSP-BF533........................................................................20
2.2.2. PPI Parallel Peripheral Interface.......................................................21
2.2.3. UART - Universal Asynchronous Receiver Transmitter........................24
2.2.4. DMA Direct Memory Access................................................................28
2.2.5. Date de tip Fract.....................................................................................34
2.2.6. Standardul ITU-R656..............................................................................35
2.2.7. JTAG Joint Test Action Group.............................................................37
2.3. Platforma de dezvoltare ADSP-BF533 EZ-KIT LITE......................................37
CAPITOLUL 1 - INTRODUCERE
Capitolul 4 cuprinde un calcul economic al proiectului, incluznd att costul orelor de munca
alocate pentru documentare i implementare, ct i a softului i prilor fizice utilizate n
dezvoltarea lui.
n anexe se gsete codul implementat in VisualDSP++ si explicat detaliat pentru prelucrrile
realizate.
Fiecare pixel al obiectului care atinge fundalul este transformat n pixel fundal.
Dup erodare
aria scade;
fisurile se lrgesc;
gurile se mresc;
Mulimea pixelilor obiect A dintr-o imagine obinut prin dilatare (expandare) cu elementul
structurant B se definete ca mulimea pixelilor cu care se poate translata elementul structurant
astfel nct B s aib puncte comune cu A.
Astfel, fiecare pixel din fundal aflat n contact cu obiectul este transformat n pixel obiect.
Dup dilatare:
aria crete;
Astfel de transformri se vor realiza pe imagini binarizate, n care 1 este asociat cu alb, iar 0
cu negru.
Se poate ntmpla ca n urma binarizarii, din cauza alegerii inadecvate a pragului sau din
cauza zgomotului, s apar mici insule. Pentru eliminarea lor fr a se modifica dimensiunea
obiectelor de interes, se aplic un numr de dilatri urmat de un numr egal de eroziuni sau
invers, folosind acelasi sablon.
O operaie de erodare urmat de o dilatare se numete deschidere se elimin micile
insule din pixelii obiectului.
Printr-o dilatare urmat de o erodare se obine nchiderea unei imagini se elimin
insulele din cadrul fundalului.
Operatorii deschidere i nchidere se aplic i pentru separarea obiectelor atinse, respectiv
concatenarea celor fragmentate.
2.1.2. Filtrri
O categorie de prelucrri de imagini des ntlnite sunt reunite sub numele de filtrare.
Obiectivele filtrrilor sunt diferite, n funcie de coninutul informational vizat i de etapa n care
se execut.
unde
in(m,n) este imaginea de filtrat;
n urma acestei operaii, nivelul de gri al fiecrui pixel se nlocuiete cu media nivelurilor de
gri pentru cei n-vecini (4 sau 8), din acest motiv astfel de filtre numindu-se i filtre de mediere
aritmetic.
10
Astfel, alegerea frecvenei de tiere a filtrului este un compromis ntre tendina de atenuare a
zgomotului de frecven mare i prudena n privina netezirii muchiilor.
Filtrul Gaussian
Unul dintre filtrele trece jos este filtrul Gaussian. Acesta, dup cum i spune i numele, este
dedicat eliminrii zgomotului Gaussian. Din punct de vedere matematic, filtrul Gaussian
modific imaginea de intrare prin convoluia cu o funcie Gauss.
Funcia Gaussian unidimensional este dat de relaia:
Bidimensional, aceasta se exprim prin produsul a dou funcii 1D, una pentru fiecare
direcie.
11
Componentele din partea de sus a spectrului semnalului util sunt accentuate avnd ca
obiectiv creterea contrastului i accentuarea detaliilor.
Operatorul Sobel
Este de asemenea un filtru trece sus care scoate n eviden contururile obiectelor de pe o
anumit a direcie n funcie de nucleul de convoluie aplicat. Se spune c se realizeaz derivarea
pe direcia indicat.
Exist 8 nuclee corespunztoare celor 8 direcii:
12
Pentru aflarea variaiei maxime de intensitate este necesar determinarea vectorului gradient.
Acest lucru este posibil prin dou metode :
Gradientul este estimat n cele 8 direcii posibile, iar valoarea amplitudinii reprezint
maximul rezultatelor obinute prin aplicarea celor 8 nuclee.
Se utilizeaz doar dou din cele opt nuclee (de exemplu k 1 i k3) pentru obinerea
diferenelor finite pe linii (gy), respectiv coloane (gx). n acest caz, amplitudinea i direcia
gradientului se calculeaz cu relaiile:
a) imaginea iniial
13
Fig.1. ( [1] )
Contururile detectate cu ajutorul operatorilor de tip gradient necesit operaii de
postprocesare pentru subiere i nchidere.
a) imaginea iniial
O clas esenial a filtrelor neliniare este format din filtrele bazate pe ordonare.
Filtrul median
nlocuiete valoarea pixelului central cu medianul irului ordonat obinut din valorile
pixelilor selectai de fereastra de filtrare.
Un exemplu de calcul pentru un filtru median cu fereastr ptrat de 3x3 este:
14
Efectul aplicrii filtrului median este c pixelii cu valoarea foarte diferit de a vecinilor
dispar, ceea ce duce la rejecia zgomotului salt and peeper i la eliminarea liniilor subiri
(figura 2c).
Un dezavantaj al acestui tip de filtrare l constituie numrul destul de mare de operaii
necesare pentru ordonarea pixelilor din vecintate.
2.1.2.2. Filtrarea temporal
n numeroase situaii informaia vizual este captat n mod continuu, n intenia de a detecta
schimbrile care se petrec. Un exemplu clasic provine din aplicaiile de supraveghere.
Exist diferii algoritmi pentru analiza micrii i urmrirea contururilor. Poate cei mai simpli
i mai rspndii sunt cei bazai pe filtrarea temporal, o metod de a determina deplasarea
fiecrui pixel ntre imagini succesive.
Pentru a determina micarea obiectelor prin analiza imaginilor succesive, comparm valoarea
unui punct din imaginea original cu cea din imaginea final.
Imaginea rezultata in urma filtrarii se obtine prin convolutia a 2d+1 cadre consecutive cu o
masca simetrica de dimensiune 1x(2d+1) (d Z). Se prelucreaza cadrul d+1. In figura 3 se
prezinta algoritmul de filtrare utilizat in cazul convolutiei cu o masca de dimensiune 1x5.
15
2.1.3. Segmentarea
n analiza obiectelor dintr-o imagine este esenial s putem separa obiectele de interes de
restul imaginii. Acest ultim grup poate fi referit i ca fundal.Tehnica de prelucrare a imaginilor
utilizat ,de obicei, pentru gsirea elementelor de interes, n vederea analizei i clasificrii lor
ulterioare, este segmentarea.
n termeni matematici, se poate spune c segmentarea unei imagini R se definete ca
fragmentarea (complet) a lui R n mai multe regiuni nevide i conexe R i, avnd urmtoarele
proprieti:
Exist trei criterii dup care se poate face segmentarea: luminana, culoarea i textur. n
primul caz, se presupune c obiectele de interes au valorile luminanelor cuprinse ntr-un anumit
interval, iar restul obiectelor i fondul nu posed poriuni cu luminane n intervalul respectiv. n
cazul segmentrii dup culoare se are n vedere faptul c obiectele ce trebuie separate au o
proprietate distinct a compoziiei de culoare, iar n ceea ce privete segmentarea dup textur se
16
17
Pentru separarea celor dou intervale de niveluri de gri i deci identificarea obiectelor de
interes din imagine, se va alege un nivel de gri Th, ntre luminanele fondului i obiectelor, numit
prag de segmentare (threshold).
Acest prag se poate alege avnd valoarea minim a frecvenei de apariie, deci pe minimul
local situat ntre cele dou maxime ale histogramei. nainte de determinarea acestui
minim,valorile histogramei trebuie filtrate pentru a nu avea de ales ntre mai multe minime
locale. Segmentarea se va face prin compararea fiecrui pixel din imagine cu pragul Th.
Un alt criteriu de alegere a pragului, considernd o distribuie normal pentru pixelii fondului
i cei ai obiectului, este la 2,5 fa de nivelul de gri pentru care se atinge valoarea maxim n
histogram(media), aa cum se art n figur 5.
18
2.1.4. Etichetarea
Un algoritm de etichetare are ca scop asignarea unei etichete unice fiecrui obiect distinct
dintr-o imagine binar i obinerea unei imagini ce conine valori ntregi (0 pentru fundal, 1
pentru primul obiect, 2 pentru obiectul urmtor, s.a.m.d). Toi pixelii unui obiect vor avea aceeai
etichet.
Exist dou modaliti de realizare a etichetrii unei imagini binare:
Prin recursivitate.
Se alege un punct im[i][j]=0 i se asigneaz o etichet att lui ct i pixelilor vecini de tip
obiect. Mai departe se vor eticheta vecinii vecinilor.
Cnd procedura recursiv se termin, se va obine o component conex etichetat complet i
putem continua alegnd alt punct de start (neetichetat nc). Pentru a gsi un nou punct de start,
se va parcurge imaginea n mod sistematic, ncepnd o procedur de etichetare de fiecare dat
cnd se gsete un punct im[i][j]=0.
Prin compararea cu pixelii vecini.
Acest algoritm este descris de 3 pai:
19
Pasul 3. nlocuirea etichetei fiecrui pixel cu eticheta ataat clasei de echivalen din
20
Fiecare intrare din tabela de echivalen const ntr-o pereche ordonat, valorile coninute n
fiecare pereche fiind valorile etichetelor gsite echivalente.
Se gsesc apoi clasele de echivalen. Fiecrei clase de echivalen i se asigneaz o etichet
unic.
Pasul 3. Se parcurge imaginea i se atribuie fiecrui pixel valoarea etichetei corespunztoare
clasei de echivalen din care face parte.
Dup etichetare se va putea trece la realizarea de diferite msurtori pentru fiecare obiect n
parte.
2.2. Procesoare
O familie de procesoare destinate aplicatiilor embedded este familia ARM de la Texas
Instruments. Aceasta acopera peste 78% din procesoarele embedded pe 32 de biti, devenind
astfel una dintre cele mai prolifice arhitecturi pe 32 de biti din lume. Ele folosesc arhitectura
RISC standard (arhitectur load-store, moduri simple de adresare bazate doar pe coninutul
registrelor sau pe informaia din formatul instruciunii, lungime fix a instruciunilor, etc.).
Piaa lor este constituit de telefonia celular i lumea dispozitivelor portabile, unde puterea
consumat este mai important dect orice altceva.
Familia de procesoare Blackfin a fost lansat pe pia de ctre liderul mondial n
semiconductoare de nalt performan pentru aplicaii de procesare a semnalului, Analog
Devices.
Un alt aspect funcional important al procesoarelor Blackfin este faptul c execut eficient
att cod de control, ct i de procesare de semnal. Deci, un astfel de procesor poate lucra fie ca
microcontroller (MCU), fie ca DSP, ori ca o combinaie a acestora.
De asemenea, procesoarele Blackfin suport sisteme de operare embedded.
21
22
Timers
Watchdog timer
23
Pentru setarea modului de operare dorit i determinarea strii PPI-ului se utilizeaz 5 regitri:
PPI_CONTROL, PPI_COUNT, PPI_STATUS, PPI_DELAY i PPI_FRAME. Blocul PACK/
UNPACK ajut la creterea eficienei de transmisie a datelor pe 8 bii prin mpachetarea acestora
n cuvinte pe 16 bii.
Cele 3 semnale numite FS1, FS2 i FS3 sunt linii de sincronizare a cadrelor, iar PPI_CLK
este un pin pentru conectarea unui ceas extern de rezerv.
24
25
Utilizatorul seteaz,
debitul binar (baud rate) care este selectat dintr-o gam de valori standard.
Toate cuvintele au un bit de start i cel puin un bit de stop, astfel lungimea unui cuvnt
situndu-se n gama 712 bii.
Figura 11 arat un flux tipic de bii msurat pe pinul TX.
26
27
Dup ce cuvntul a fost transferat din THR n TSR (THR se golete), bitul 5 al UART_LSR
(THRE) devine 1 i se genereaz o cerere de ntrerupere, dac acest tip de ntrerupere a fost
validat. n acest moment UART este dispus s accepte un nou caracter pentru a fi transmis.
28
29
30
31
- regitri cureni, ca
DMAx_CURR_ADDR / MDMA_yy_CURR_ADDR
DMAx_CURR_X_COUNT / MDMA_yy_CURR_X_COUNT,
- regitri de control/stare:
DMAx_PERIPHERAL_MAP / MDMA_yy_PERIPHERAL_MAP
DMAx_IRQ_STATUS / MDMA_yy_IRQ_STATUS.
Litera x din notaia DMAx reprezint numrul canalului DMA utilizat i poate fi ntre 0 i 7,
n timp ce yy din MDMA_yy este S0 sau S1 dac se citete din memorie (surs) sau D0 sau D1
cnd se scrie n memorie (destinaie).
32
33
34
35
36
a. Standardul NTSC
b. Standardul PAL
37
F arat trecerea de la un cmp la altul. Sunt furnizate date video intercalate (explorare
ntreesut), cele dou cmpuri ale unui cadru fiind transmise separat.
SAV (Start of Active Video) i EAV (End of Active Video) sunt secvene de cte 4 octei ce
delimiteaza datele de pe fiecare linie. Se observ c primii 3 octei (0xFF, 0x00, 0x00) sunt
urmai de un cuvnt de stare XY. Acesta conine, pe lng S, V i H, 4 bii (P3, P2, P1, P0) pentru
detecia i corecia erorilor.
P3 = V XOR H
P2 = F XOR H
P1 = F XOR V
P0 = F XOR V XOR H.
Elementele unei linii sunt transmise n format YCbCr. Y descrie nivelul luminanei, n timp ce
Cb i Cr dau informaia de culoare.
38
2 memorii Flash cu un total de 2MB (512K x 16bit x 2). Pot fi utilizate pentru stocarea
39
video compatibil cu standardele NTSC sau PAL n date video compatibile cu standardele ITUR601/ ITU-R656.
serial.
40
Cu VisualDSP++ se poate:
Crea, compila, asambla, edita legturi pentru aplicaii scrise n C,C++ sau limbaj de
asamblare.
Incarca, executa, rula pas cu pas, opri programele aplicaie. Se pot, de asemenea, seta
breakpoint-uri.
41
S-au realizat o serie de prelucrri uzuale de imagini pentru ca apoi o parte dintre ele s se
utilizeze n implementarea unei aplicaii capabile s recunoasc figurile geometrice din imagini
captate in mod continuu i s urmreasc cercul cu aria cea mai mare.
dup erodare
y11 = ((x00&h00) & (x01&h01) & (x02&h02) & (x10&h10) & (x11&h11) & (x12&h12) &
(x20&h20) & (x21&h21) & (x22 &h22));
dup dilatare
y11 = ((x00&h00) | (x01&h01) | (x02&h02) |(x10&h10) | (x11&h11) | (x12&h12) |
(x20&h20) | (x21&h21) | (x22 &h22));
Operaiile de erodare i dilatare se pot aplica n cazul n care se dorete detectarea defectelor
de pe cablajele imprimate. Prin erodare se pune n eviden o zon de traseu prea subire. Prin
dilatare se arat zonele n care traseele risc s se ating. Acest lucru este exemplificat n figur
25.
42
Imaginea original
Erodare
Dilatare
Fig.25
Grosimea traseelor este prea mare sau distan dintre ele prea mic, observndu-se n a treia
imagine c dou dintre acestea se unesc.
Numrul de cicli de procesor necesari pentru realizarea erodrii: 8.500.000
Numrul de cicli de procesor necesari pentru realizarea dilatrii: 7.230.000
.
tiind c dimensiunea mtii este de 6 ori deviaia standard, pentru o masc de 3x3, va
rezulta =0.5.
43
Astfel
Pentru realizarea convoluiei s-a folosit funcia conv2d_fr16 din headerul filter.h.
Prototipul funciei este:
void conv2d_fr16(const fract16 *input, int rin, int cin,
const fract16 *mask, int rm, int cm, fract16 *output );
Funcia conv2d_fr16 calculeaz convoluia bidimensional a matricii de intrare input de
dimensiune rin*cin cu masca mask avnd rm linii i cm coloane. Dup convoluie va rezulta
matricea output de dimensiune (rin+rm-1)*(cin+cm-1).
Convoluia bidimensional dintre input i mask este definit de relaia:
pentru
respectiv de coloane ale matricii de intrare input, in timp ce rm si cm sunt dimensiunile mastii)
Deoarece complexitatea de calcul crete odat cu creterea vecintii, deci este mai eficient
s se lucreze cu vecinti de dimensiune mic, este de dorit c matricea nucleu s se
descompun ntr-un produs de doi vectori (unul orizontal i unul vertical).
44
Intrucat functia Gaussian bidimensionala se exprima prin produsul a doua functii 1D, una
pentru fiecare directie, masca data de relatia (14) poate fi scrisa:
unde
45
a) Imaginea original
Fig.26. (VisualDSP++)
Filtrarea realizat prin convoluia cu cei doi vectori mask1 i mask2 economisete
aproximativ 1.500.000 cicli de procesor n comparaie cu situaia n care se face o singur
convoluie (cu mask) ( 8423430 cicli - 2 convoluii cu vectori, 9928306 cicli - o convoluie cu
matrice). 10.000.000 cicli de procesor convolutie cu matrice
8.500.000 cicli de procesor doua convolutii cu vectori
46
fr16_to_float,
scalare_inv).
Se pot folosi doar 4 din cele 8 nuclee de convoluie, n cazul de fa utilizndu-se:
47
48
49
3.5. Segmentarea
Pentru obinerea imaginii segmentate s-a implementat o funcie numit segmentare(), n care,
mai nti, se construiete histograma imaginii de prelucrat, dup care are loc o filtrare cu un filtru
fir a valorilor acesteia. Pragul este estimat prin observarea histogramei filtrate a imaginii de
segmentat.
Se porneste de la premiza c se vor prelucra imagini cu obiecte ntunecate pe fond luminos.
Din histograma obinut dup filtrare, se determin nivelul de gri (k1) corespunztor ultimei
rampe cztoare semnificative (s fie cel puin 10% din frecven maxim de apariie din grafic)
din prima jumtate a gamei nivelurilor de gri, (0,127), i abscisa (k2) corespunztoare maximului
frecvenelor de apariie din intervalul (127,255). k1 va aparine obiectului mai luminos dintr-o
mulime de obiecte, iar k2 fondului.
Pentru aflarea pragului de segmentare (Th) se va gsi minimul local din intervalul (k1,k2)
(valorile histogramei trebuie filtrate pentru a nu avea de ales ntre mai multe minime locale).
Segmentarea se va face prin compararea valorii fiecrui pixel din imagine cu pragul Th i
nlocuirea acesteia cu 0 dac este mai mic dect Th sau cu 255 n caz contrar. Astfel, obiectele
vor deveni negre, iar fondul alb.
Pentru imaginea din figura 29a, dup observarea histogramei filtrare (fig.29c), s-a obinut
pragul de segmentare la 91 (minimul local din intervalul (63,176)). Imaginea segmentat este cea
din figura 29d.
50
b)
c)
Fig.29. a) imaginea de prelucrat; b) histograma imaginii de prelucrat;
c) histograma obinut dup filtrare; d) imaginea segmentat. (VisualDSP++)
51
3.6. Etichetarea
S-a realizat etichetarea obiectelor dintr-o imagine binar (fond-255, obiect-0), n urmtorii 2
pai:
Pasul 1.Etichetarea pixelilor din imaginea surs
Schema bloc a algoritmului folosit este dat n figur 30, n care A, B, C, D i X sunt valorile
a 5 pixeli vecini plasai ca n figur 31.
52
pas este un numr ntreg reprezentnd diferena dintre dou etichete consecutive.
Imaginea binar de la intrare este parcurs pixel cu pixel de sus n jos pe linii i de la stnga
la dreapta pe coloane, ns deoarece pentru pixelul de etichetat (X), din conectivitatea de 5,
trebuie s se poat defini cei patru vecini ai si (A, B, C, D), parcurgerea se va face ncepnd cu
a doua linie i a doua coloan i se va termina pe ultima linie i penultima coloan. n caz
contrar, vor apare erori de depire a capacitii de memorie alocate.
Este posibil ca n urma aplicrii acestui algoritm, dou mulimi disjuncte de pixeli din acelai
obiect s aib atribuite etichete diferite. Din acest motiv, apare necesitatea realizrii pasului 2.
Pasul 2. Reetichetarea
Pentru a face n aa fel nct pixelilor coneci s le corespund aceeai etichet, se parcurge
imaginea i n cazul n care se gsesc dou etichete vecine cu valori diferite, se determin cea
mai mic dintre ele, iar aceast valoare se asociaz att vecinului cu eticheta diferit, ct i
celorlali pixeli din imagine cu aceeai etichet ca a vecinului.
Dezavantajul acestui algoritm de etichetare const n faptul c, obiectelor cu pixeli pe cel
puin una din marginile imaginii nu li se asociaz nici o etichet. Pentru a compensa acest lucru,
se recurge o soluie de compromis: marginile imaginii se fac albe cu riscul de a micora ariiile
obiectelor ce nu fuseser etichetate.
Pentru realizarea pasului 1, procesorul a avut nevoie de aproximativ 3.400.000 de cicli, iar
pentru pasul 2, ntruct se parcurge imaginea de mai multe ori, au fost necesari 24.310.000 cicli.
53
p_boundary face parte din contur dac este pixel obiect i cel puin un vecin din cei 4 ai si
este pixel fond (1-fond, 0-obiect).
n figur 33 este dat un exemplu de utilizare a funciei _perimeter.
a) imaginea de prelucrat
b) detecia contururilor
54
55
56
Deoarece magistrala DMA este pe 16 bii, iar limea portului PPI de 8 bii, fr activarea
bitului PACK_EN s-ar irosi jumtate dintr-un cuvnt. Deci, PACK_EN este 1 pentru a crete
eficiena de transmisie, astfel 2 octei de date fiind mpachetai ntr-un cuvnt pe 16 bii.
Se activeaz bitul SKIP_EN pentru a face posibil ignorarea elementelor impare ale
ntruct informaia de luminozitate a unui cadru video NTSC ocup 369kB (720x525
octei) i DMA-ul poate direciona pn la 64kB, s-a considerat necesar configurarea DMA-ului
cu dou dimensiuni (DMA_2D=1) ceea ce permite transfer de memorie de pn la 64kBx64kB.
57
Cmpul FLOW este 0 (Stop Mode) ceea ce face ca dup completarea ntregului buffer
Bitul RESTART este 1 dorindu-se ca naintea nceperii unei noi aciuni s se renune la
Se citesc elemente din 4 n 4 elemente de pe liniile impare ale primului cmp video ncepnd
de la adresa im1 i se scriu ncepnd cu adresa im2. Astfel, imaginea obinut dup transfer va
avea un sfert din numrul de coloane al imaginii iniiale (176) i jumtate din numrul de linii ale
cmpului 1 (133).
Imaginea im2 se obine astfel n 450.000 de cicli, timp redus considerabil fa de situaia n
care aceast sarcin ar fi fost realizat de ctre procesor.
3.8.2. Prelucrri
Aici, se realizeaz segmentarea la nivel local dup un prag estimat prin observarea
histogramei filtrare a imaginii, dup care se gsesc contururile obiectelor cu ajutorul funciei
_perimeter. n continuare, obiectele vor fi definite prin contururile lor.
Apoi este necesar etichetarea contururilor tocmai obinute pentru a se putea trece la calculul
anumitor parametri.
58
Aria unui obiect se calculeaz prin sumarea tuturor pixelilor ce au aceeai etichet.
Pentru determinarea abscisei centrului de greutate al unui obiect, se calculeaz suma
absciselor pixelilor cu eticheta corespunztoare obiectului respectiv, iar ulterior aceast sum se
mparte la aria obiectului. Calculul ordonatei se realizeaz n mod analog.
ntruct se dorete urmrirea celui mai mare cerc din imagine, se caut apoi cele mai mari 3
obiecte prin plasarea tuturor ariilor ntr-un vector i ordonarea elementelor acestuia n mod
descresctor prin metoda Bubble Sort. Primele 3 elemente ale vectorului obinut dup ordonare
sunt cele mai mari 3 arii. Ulterior se gsesc indicii obiectelor avnd aceste arii i implicit
celelalte caracteristici ale lor.
Pentru a vedea care dintre cele 3 obiecte, tocmai determinate, este cerc, se apeleaz la
calculul varianelor cu ajutorul funciei predefinite varf.
Pentru determinarea varianei unui obiect se calculeaz distanele de la centrul la greutate al
acestuia la pixelii contur corespunztori. Conturul se parcurge cu ajutorul unei funcii recursive
(cod_lant()), iar pe msura parcurgerii lui se vor determina i distanele necesare.
Fig.36
n continuare sunt ilustrate aceste distane pentru cele mai mari 3 obiecte din figura 36.
59
Pentru un triunghi, in
reprezentarea vectorului ale
carui elemente sunt distantele
de la centrul de greutate la
contur, apar 3 maxime
corespunzatoare celor 3 varfuri.
Dispersia: cea mai mare
Aria=133.
a)
b)
60
61
n cazul de fa, camera poate vedea aproximativ 93 de grade pe orizontal i 53 vertical, iar
dimensiunea imaginii este 133 pixeli x 176 pixeli. n plus, dac se transmite pe serial 255,
servomotorul comandat va ajunge n poziia de 180 de grade.
Aceste date se scriu ntr-o form compact astfel
62
iar bitul DLAB fiind 1 face posibil accesarea regitrilor de divizare n vederea stabilirii
debitului binar dorit.
ntruct frecvena (CCLK) de lucru a procesorului este de 594MHz (CLKIN x msel=27MHz
x 22), iar cea a perifericelor (SCLK) de 118,8MHz (
) i se dorete o rat de
3.9. Optimizri
Reducerea timpului de procesare este ntotdeauna un obiectiv al sistemelor ce funcioneaz n
timp real.
Se urmrete mbuntirea codului intermediar astfel nct s rezulte un cod main mai
rapid. n acest sens se recomand eliminarea valorilor duplicate dintr-o anumit structur, a
calculelor i variabilelor inutile sau compactarea anumitor secvene.
Se exemplific n continuare anumite metode de evitare a lucrului inutil din program.
63
variabila respectiv va fi folosit frecvent, iar pentru optimizare va fi pstrat ntr-un registru.
Opiunea funcioneaz pentru variabile de tip int i char.
Se folosete acest modificator n bucle (pentru variabilele contor din ciclurile for).
Astfel dac x este fr semn mprirea dureaz un ciclu, iar pentru x cu semn 6 cicli.
Un alt mod de evitare a mpririi este nlocuirea condiiei:
Se prefer algoritmii care lucreaz cu numere ntregi, fa de cei pe numere reale, ntruct
Atunci cnd limbajul de programare pune la dispoziie o anumit funcie pentru realizarea
Exemplu:
Forma general a instruciunii if trece i ea ntr-o alt form ce se execut ntr-un timp
mai scurt.
64
3.10. Concluzii
S-au prezentat cteva prelucrri uzuale ale imaginilor, destinate fie mbuntirii calitii
imaginii respective (filtrri, operatori de accentuare a muchiilor), fie extragerii de informaii n
scopul recunoaterii formelor (etichetarea, determinarea conturului, calculul diferitor parametri
65
ai obiectelor din imagine). Am descris att avantajele, ct i dezavantajele lor, cteva exemple de
utilizare, precum i timpul necesar realizrii acestora de ctre procesorul embedded BF533.
Aplicaiile de urmrire a unui obiect cu anumite caracteristici sunt studiate pentru a fi mai
apoi utilizate n numeroase situaii.
Un exemplu clasic provine din aplicaiile de supraveghere. Dac avem o incint cu un sistem
de camere video a cror orientare poate fi controlat de la distan, vrem ca n cazul n care un
intrus este descoperit, camerele s-i schimbe orientarea astfel c intrusul s rmn mereu n
cmpul vizual. n acest caz va trebui s calculm micarea siluetei ntre fiecare dou imagini
consecutive.
Exist posibiltatea ca, n anumite situaii, sistemul de recunoatere i urmrire implementat s
nu funcioneze corespunztor. Dintre acestea amintim cazul n care obiectele din imaginea
captat sunt forme neregulate sau ies din cmpul de vizualizare a camerei. Deasemenea, este
necesar ca ariile celor mai mari 3 obiecte din imagine s aib acelai ordin de mrire, iar printre
ele s se gseasc i un cerc, pentru a obine rezultatele dorite.
ntruct segmentarea se face dup culoare, este important ca variaia nivelurilor de gri dintrun obiect s nu fie foarte mare, iar n mediul de utilizare al sistemului, condiiile de iluminare s
se menin aproximativ aceleai.
S-au obinut timpi de aproximativ 0.2 secunde pentru procesarea unei imagini, ceea ce duce
la prelucrarea a circa 5 cadre pe secund.
Calculul economic reprezint un calcul foarte amnunit privind costul de producie suportat
de ntreprinztor pentru producerea i desfacerea unui bun material. n sfera produciei materiale,
66
costul de producie este forma bneasc a unui coninut ce reprezint consumul de mijloace
materiale i for de munc, necesare pentru producerea bunurilor.
Realizarea acestui proiect a impus utilizarea platformei de dezvoltare EZ-KIT LITE ADSP
BF533, care se gsete, la ora actual pe pia, la un pre aproximativ de 400USD.
Accesarea de la un calculator a procesorului embedded este posibil prin intermediul unui
emulator JTAG. Acesta poate fi achiziionat contra unei sume de 4000USD.
Pentru captarea imaginilor de prelucrat s-a utilizat o camer video in valoare de 100USD, n
plus, n cadrul aplicaiei de recunoatere i urmrire fiind necesare i dou servomotoare de tip
RC, al cror pre este de 12USD.
Astfel, partea hardware necesar dezvoltrii proiectului a costat aproape 4560USD, ceea ce
inseamna 13860 RON.
Preul pachetului software necesar implementrii este mai mic decat al prii hardware,
pachetul VisualDSP++ costand 1000USD. Acest mediu de dezvoltare poate fi descrcat gratuit
de pe site-ul celor de la Analog Devices, ns astfel poate fi utilizat o perioad de timp limitat.
A fost necesara o perioada de documentare de circa 500 de ore. Considerand ca o ora de
studiu se plateste cu 5USD, se obtine o suma de plata de 2500USD.
Programarea ca form de munc este pltit cu circa 40USD/zi. Aceast sum poate varia de
la o firm la alta, n funcie de norma pe care o are programatorul. In cazul de fata, prelucrarile
prezentate s-au implementat in aproximativ 50 de zile.
n concluzie, pentru a realiza procesare de imagini ntr-un sistem embedded este nevoie de un
capital de aproape 10100USD.
Bibliografie
[1]. http://www.generation5.org/content/2002/im01.asp
67
[2]. http://www.actrus.ro/buletin/2_2004/a16.pdf
[3]. http://apollo.eed.usv.ro/~remus/arhive/PID/Curs9/Curs_9.pdf
[4].
ADSP-BF533
Blackfin
Processor
Hardware
Reference,
Revision
3.3,
September 2008
[5]. http://docs.blackfin.uclinux.org/doku.php?id=ppi
[6].Universitatea Tehnica din Cluj-Napoca, Catedra de Calculatoare, Procesarea
Imaginilor Laborator 4: Etichetarea obiectelor din imagini binare.
[7]. VisualDSP++ 4.5 Compiler and Library Manual for Blackfin Processors.
[8]. Laurentiu Frangu Recunoasterea Formelor si Prelucrarea Imaginilor,
Academica, 2001.
[9]. Image Analysis and Image Processing Algorithms for the ADSP-BF5XX
Anexe
void erodare_dilatare(void){
68
69
mat1[i][j]=im1[i][j];
mat2[i][j]=im2[i][j];
mat3[i][j]=im3[i][j]; } }
// filtrarea se realizeaza numai dupa ce s-au captat 3 imagini
if(k%3==1 && k>3){
/*se respecta algortimul prezentat in figura 28. Functia matsmltf
realizeaza produsul unei matrici cu un scalar, iar matmaddf sumeaza
rezultatele celor 3 produse*/
matsmltf(*mat1,mask[2],xx,yy,*aux1);
matsmltf(*mat2,mask[0],xx,yy,*aux2);
matsmltf(*mat3,mask[1],xx,yy,*aux3);
matmaddf(*aux1,*aux2,xx,yy,*rez1);
matmaddf(*rez1,*aux3,xx,yy,*rez1); }
if(k%3==2 && k>3){
matsmltf(*mat1,mask[1],xx,yy,*aux1);
matsmltf(*mat2,mask[2],xx,yy,*aux2);
matsmltf(*mat3,mask[0],xx,yy,*aux3);
matmaddf(*aux1,*aux2,xx,yy,*rez1);
matmaddf(*rez1,*aux3,xx,yy,*rez1); }
if(k%3==0){
matsmltf(*mat1,mask[0],xx,yy,*aux1);
matsmltf(*mat2,mask[1],xx,yy,*aux2);
matsmltf(*mat3,mask[2],xx,yy,*aux3);
matmaddf(*aux1,*aux2,xx,yy,*rez1);
matmaddf(*rez1,*aux3,xx,yy,*rez1); }
// se sumeaza elementele positive din masca
for(t=0;t<3;t++){
if(mask[t]>0)
sum_poz=sum_poz+mask[t]; }
/*se realizeaza o scalare in vederea obtinerii de elemente de tip
unsigned char din intervalul [0,255]*/
for(i=0;i<xx;i++){
for(j=0;j<yy;j++){
rez[i][j]=rescalare(rez1[i][j]); } }
k++;
}// sfarsit bucla while
}// sfarsit filtrare_timp();
void Init_MDMA_2D_filtr(void){
// din matricea im[525][720] se obtine im1, im2 sau im3
//Configurarea canalului sursa S1
*pMDMA_S1_CONFIG = 0x90;
*pMDMA_S1_START_ADDR = im;
// se transfera 180 de coloane
*pMDMA_S1_X_COUNT = 180;
// se citesc din 4 in 4 elemente pe linie
*pMDMA_S1_X_MODIFY = 0x4;
// se transfera 133 de linii (jumatate din primul camp video)
*pMDMA_S1_Y_COUNT = 133;
// se citesc din doua in doua linii
*pMDMA_S1_Y_MODIFY = 724;
//Configurarea canalului destinatie D1
*pMDMA_D1_CONFIG = 0x92;
/*adresa de la care incepe sa se scrie im memorie depinde de
valoarea lui k*/
if(k%3==1)
*pMDMA_D1_START_ADDR = im1;
else if(k%3==2)
*pMDMA_D1_START_ADDR = im2;
else
*pMDMA_D1_START_ADDR = im3;
*pMDMA_D1_X_COUNT = 180;
*pMDMA_D1_X_MODIFY = 0x1;
*pMDMA_D1_Y_COUNT = 133;
*pMDMA_D1_Y_MODIFY = 0x1;
// activarea canalelor DMA
*pMDMA_S1_CONFIG = *pMDMA_S1_CONFIG | 0x01;
*pMDMA_D1_CONFIG = *pMDMA_D1_CONFIG | 0x01;
}
70
if(h1[k]<hmin){
hmin=h1[k];
Th=k;
}
//binarizare: pixelii obiect negri, fondul - alb
for(i=0;i<xx;i++)
for(j=0;j<yy;j++)
im2[i][j]=(im2[i][j]<Th)?0:255;
} // sfarsit segmentare();
void perimetru(void){
/* se determina pixelii contur ai obiectelor din imaginea binara im2,
cu functia _perimeter*/
register int i,j;
/* intrucat functia _perimeter lucreaza cu valori de 0 si 1, se
asociaza valoarea 1 obiectelor si 0 fondului*/
for(i=0;i<xx;i++){
for(j=0;j<yy;j++){
im2[i][j]=(im2[i][j]==0)?1:0; } }
// perim = matricea obtinuta in urma aplicarii functiei
_perimeter(*im2, xx, yy, *perim);
// pixelii contur vor fi negri, iar fondul alb
for(i=0;i<xx;i++){
for(j=0;j<yy;j++){
im2[i][j]=(perim[i][j]==1)?0:255; } }
}// sfarsit perimetru();
void etichetare(void){
register int i,j,l,c;
/*Pasul 1: implementarea schemei bloc a algoritmului
X=im2[i][j]; A=im2[i][j-1]; B=im2[i-1][j-1]; C=im2[i-1][j]; D=im2[i1][j+1];*/
/*parcurgerea imaginii segmentate se face ncepnd cu a doua linie i
a doua coloan i se termina pe ultima linie i penultima coloan*/
for(i=1;i<xx;i++){
for(j=1;j<(yy-1);j++){
if(X!=0xff){
if(B!=0xff){
X=B;
// ramura 2
if(C==0xff && D!=0xff){
// ramura 1
B=D; X=B; }
}
else{
if(A!=0xff){
if(C!=0xff){
// ramura 3
A=C; X=A; }
else{
X=A;
// ramura 5
if(D!=0xff){
// ramura 4
A=D; X=A; }
}
}
else{
X=C;
// ramura 6
if(C==0xff){
X=D;
// ramura 7
if(D==0xff){
// ramura 8
X=et; et+=pas; }
}
}
}
}
}
}
//Pasul 2: Reetichetarea.
for(i=0;i<(xx-1);i++){
for(j=1;j<(yy-1);j++){
if (im2[i][j]!=255&&im2[i-1][j]!=255 && im2[i-1][j]!=im2[i][j]){
min1=min(im2[i-1][j],im2[i][j]);
71
max1=max(im2[i-1][j],im2[i][j]);
reetichetare(); }
if(im2[i][j]!=255&&im2[i-1][j+1]!=255 && im2[i-1][j+1]!=im2[i]
[j]){
min1=min(im2[i][j],im2[i-1][j+1]);
max1=max(im2[i][j],im2[i-1][j+1]);
reetichetare(); }
if(im2[i][j]!=255&&im2[i][j+1]!=255 && im2[i][j+1]!=im2[i][j]){
min1=min(im2[i][j],im2[i][j+1]);
max1=max(im2[i][j],im2[i][j+1]);
reetichetare(); }
if(im2[i][j]!=255&&im2[i+1][j+1]!=255&&im2[i+1][j+1]!=im2[i][j])
{
min1=min(im2[i][j],im2[i+1][j+1]);
max1=max(im2[i][j],im2[i+1][j+1]);
reetichetare(); }
}
}
} // sfarsit etichetare();
void reetichetare(void){
register int i,j;
for(i=0;i<xx;i++){
for(j=0;j<yy;j++){
if(im2[i][j]==max1)
im2[i][j]=min1;
}
}
}
void masuratori(void){
/* functia in care se calculeaza diferiti parametri ai obiectelor din
imaginea im2 */
register int i,j,k;
int x_init1,y_init1,x_init2,y_init2,x_init3,y_init3;
int n1=1,n2=1,n3=1;
// x_im, y_im coordonatele centrului imaginii
x_im=xx>>1; y_im=yy>>1;
/*calculul ariei si coordonatelor centrului de greutate pentru fiecare
obiect; et1= prima eticheta asociata unui obiect; pas = diferenta dintre
doua etichete consecutive;*/
for (k=et1; k<et; k+=pas){
for(i=0;i<xx;i++){
for(j=0;j<yy;j++){
if(im2[i][j]==k){
x[t]+=i;
// suma ordonatelor
y[t]+=j;
// suma absciselor
ob[t].arie++;
// aria obiectului t
}}}
// obiectele cu aria mai mica de 10 pixeli nu se iau in considerare
if(ob[t].arie<=10)
t--;
t=t+1;
}
nr_obj=t-1;
// numarul de obiecte din
imagine
for (t=1;t<=nr_obj;t++){
// ordonata centrului de greutate al obiectului t
ob[t].xcg=x[t]/ob[t].arie+1;
//abscisa centrului de greutate al obiectului t
ob[t].ycg=y[t]/ob[t].arie+1;
ob[t].id=t;
// id= indice
}
/* se ordoneaza descrescator ariile obiectelor si se plaseaza in
vectorul arie_ord*/
for (t=1;t<nr_obj+1;t++)
arie_ord[t]=ob[t].arie;
72
cod_lant(i,j);
for(k=1;k<max_arie2;k++){
d2[k]=d[k];
}
i=x_init3; j=y_init3; e=e3; n=n3;
max_arie=max_arie3; t_max=t_max3;
cod_lant(i,j);
for(k=1;k<max_arie3;k++){
d3[k]=d[k];
}
//se determina mediile celor 3 obiecte
m1=meanf(d1,max_arie1);
m2=meanf(d2,max_arie2);
m3=meanf(d3,max_arie3);
//se determina variantele celor mai mari 3 obiecte
var1=varf(d1,max_arie1);
var2=varf(d2,max_arie2);
var3=varf(d3,max_arie3);
/*se calculeaza valorile dx si dy ce vor ajuta ulterior la determinarea
valorilor de transmis pe seriala pentru urmarirea obiectului cu
varianta cea mai mica; dx, dy = distantele de la centrul de greutate al
obiectului la centrul imaginii*/
if(var1<=var2&&var1<=var3){
dx=x_im-ob[t_max1].xcg;
dy=ob[t_max1].ycg-y_im; }
else{
if(var2<=var1&&var2<=var3){
dx=x_im-ob[t_max2].xcg;
dy=ob[t_max2].ycg-y_im; }
else{
dx=x_im-ob[t_max3].xcg;
dy=ob[t_max3].ycg-y_im; }
}
} // sfarsit masuratori();
void setare_servo(void){
/* se comanda cele doua servomotoare prin transmiterea pe seriala a
cate 3 octeti pentru fiecare servomotor */
unsigned int a=1;
/* valorile transmise pe seriala pentru urmarirea obiectului cu
varianta cea mai mica*/
ax=ax+dx*0.56;
ay=ay+dy*0.75;
ax=min(ax,180);
ax=max(ax,100);
ay=min(ay,200);
ay=max(ay,100);
*pUART_THR=255;
// octet de sincronizare
//cat timp bufferul de transmisie nu s-a golit, ramai in bucla
while((*pUART_LSR & 0x20)==0){
a=1;}
*pUART_THR=0; // se comanda servomotorul 0 - vertical
while((*pUART_LSR & 0x20)==0){
a=1; }
*pUART_THR=ax;
// servo ajunge in pozitia ax
while((*pUART_LSR & 0x20)==0){
a=1;
}
*pUART_THR=255;
// octet de sincronizare
while((*pUART_LSR & 0x20)==0){
a=1; }
*pUART_THR=1; // se comanda servomotorul 1 - orizontal
while((*pUART_LSR & 0x20)==0){
a=1; }
*pUART_THR=ay;
// servo ajunge in pozitia ay
while((*pUART_LSR & 0x20)==0){
a=1; }
}// sfarsit setare_servo();
void init_seriala(void){
*pUART_GCTL=UCEN;
*pUART_LCR=0x83;
//baud_rate=9600; divisor = SCLK/(16 * BAUD_RATE)
*pUART_DLL=0x05;
*pUART_DLH=0x03;
*pUART_LCR=0x03;
}//sfarsit init_seriala();
73