Analiza Si Proiectarea Sistemului de Recunoastere Si Ghidare a Obiectelor In Timp Real

INTRODUCERE

Din vasta știință a informaticii mi-am propus la teza de licență drept domeniu de studiu și analiză, prelucrarea și analiza imaginilor (adică de recunoașterea obiectelor). Din start trebuie de precizat, că analiza imaginilor este cu un pas mai înainte decît simpla înlocuire a omului, deoarece au apărut soluții inovatoare pentru probleme cu care acesta nu mai fusese confruntat – precum în cazul imaginilor non-vizibile (imagini acustice, ultrasonore, radar). Prelucrarea imaginilor înglobează posibilitatea de a dezvolta mașina totală de viziune, capabilă să realizeze funcțiile vizuale ale oricărei viețuitoare.

Ideea elaborării lucrării de licență s-a născut datorită necesității de a înlocui observatorul uman prin lucrul rapid și eficient al calculatorului. Importanța și actualitatea lucrării constă în faptul că la momentul dat prelucrarea imaginilor și anume recunoașterea obiectelor cuprinde o arie foarte largă de utilizare cum ar fi[8]:

Astronomie – pentru prelucrarea imaginilor preluate de la diferitele telescoape;

Fizica pământului – pentru prelucrarea imaginilor preluate de la sateliții geostaționari în vederea prognozei meteo, a stării atmosferei, a controlului creșterii vegetației și a comportamentului vulcanilor, etc.;

Fizica atomică sau cuantică – pentru prelucrarea imaginilor preluate în experimente cu particule subatomice;

Microelectronică – pentru prelucrarea și detectarea calității circuitelor pe bază de imagini microscopice;

Televiziune – pentru prelucrarea controlului și securității pe bază de camere video de urmărire continuă prin detectarea și recunoașterea în timp real a situațiilor frauduloase (controlul circulației prin camere video și radar, controlul bagajelor pe aeroporturi, urmărirea persoanelor în incinta băncilor, etc.);

Armată – pentru depistarea țintelor și pentru dirijarea în mod direct a rachetelor sau avioanelor de luptă;

Inspecția non-chirurgicală – mai ales pentru detectarea și marcarea automată a zonelor sau organelor suspecte, din imaginile preluate prin microscopie electronică, tomografie, radiologe, etc;

Analiza compoziției chimice – pentru prelucrarea automată a informației achiziționate pe criterii spectrale, cromatice, etc.;

Microscopie – pentru recunoașterea structurilor moleculare și atomice ale substanțelor studiate;

Data mining – regăsirea informațiilor de diverse tipuri în volume mari de date structurate;

Document image analysis – presupune căutarea, regăsirea în text a unor documente păstrate sub formă de imagini;

Prelucrarea imaginilor prin algoritmii realizați în cod de limbaj de programare este mai avantajoasă, ținînd cont de cercetările cu succes duse la nivel mondial în domeniul programării. În mediul tehnologic modern, favorabil dezvoltării aplicațiilor și concepțiilor soft, pe zi ce trece se elaborează noi algoritmi și metodologii de prelucrarea a imaginilor care nemijlocit ridică calitativ nivelul operațiilor, iar în combinație cu mijloacele hardware care se dezvoltă de asemenea într-un temp rapid, se reduce vizibil timpul operațiilor.

În teza dată sînt prezentate diverse metode, tehnici și algoritmi utilizați în reprezentarea și prelucrarea digitală a imaginilor, atît în vederea creșterii calității imaginii destinate ochiului uman (îmbunătățirea imaginilor, prin operațiuni de curățire a imaginii) cît și în scopul recunoașterii formelor (transformări ale imaginilor cuprinzînd algoritmi de determinare a conturului, segmentare și subțiere, extragere contur, filtre, etc).

Pot fi menționate două obiective ale tezei:

evaluarea  situației existente în domeniul prelucrării imaginilor, clasificarea algoritmilor existenți la ora actuală, analiza unor algoritmi concreți din domeniul dat;

aplicarea practică a algorimilor teoretici de prelucrare a imaginilor, deja existenți, într-un instrument soft, prin intermediul limbajlui de programare C++.

Scopul lucrării este elaborarea și implementarea în practică a produslui program ce va avea ca efect analiza și detecția obiectelor în timp real. Printr-o astfel de aplicare se înțelege capacitatea calculatorului prin softul său, de a determina conținutul unei imagini imitînd capacitatea umană în vederea luării unor decizii ulterioare. În secolul XXI oamenirea își propune să folosească calculatorul pentru a înlocui munca fizică și intelectuală. Cînd omul este pus în situații obositoare de-a lua în mod repetat aceleași decizii, ideal este ca el să fie înlocuit de un sistem de calcul, cu softul său adecvat, ce nu va cunoaște noțiunea de oboseală și va reduce la maxim erorile în producție.

Reieșind din structura programului și din complexitatea lui am ajuns la factorul structural al tezeii elaborate. Teza dată este compusă din 3(trei) capitale, fiecare capitol fiind compus din mai multe subpuncte, repere ale tezei de licență.

În capitolul întîi al lucrării sunt prezentate și subliniate aspecte privind integrarea sistemelor de recunoaștere a formelor în cadrul sistemelor informaționale. Am specificat că recunoașterea formelor reprezintă de fapt extragerea informațiilor din imaginile prelucrate și că cu ajutorul lor se poate de recunoscut un vast domeniu ce include: recunoașterea scrisului, obiectelor, amprentelor, chipului uman, etc.

S-a indicat că un sistem general de recunoaștere a formelor translatează informția intrată în sistem, după care selectează setul de caracteristici(în dependență de ce va recunoaște), le clasifică și tot de atîtea ori execută acest proces, pînă cînd în final va fi recunoscut obiectul. Obiectivul acestui capitol, îl constituie introducerea unor noțiuni de bază din domeniul recunoașterii formelor, cu un accent special pe metodele de clasificare statistice, mai apropiate de materialul prezentat în capitolele următoare.

Capitolul doi al lucrării este dedicat metodelor de analiză și proiectare, în special metodelor de proiectare obiectuală și a facilităților oferite de UML în procesul de analiză și proiectare, precum și descrierea și arhitectura UML. Se prezintă caracteristicile metodelor sistemice și avantajele utilizării metodelor orientate în proiectarea sistemelor informatice, cum ar fi: întreținerea ușoară, economie de timp și costuri prin reutilizare, productivitate crescută prin maparea directă cu caracteristicile limbajelor de programare OOP și flexibilitatea aplicațiilor realizate. Avantajul oferit de abordarea orientată obiect îl constituie liniaritatea procesului de dezvoltare a sistemului, datorită faptului că obiectele sunt definite din primele faze ale procesului, acestea fiind folosite și extinse pe parcursul întregului proces.

Capitolul trei este partea practică a tezei ce prezintă dezvoltarea pe larg a tehnologiei orientată spre obiect, și anume modalități de realizare a persistenței sistemului, managementul memoriei și aspecte privind memorarea, interogarea și protejarea obiectelor. Limbajele de programare orientate spre obiect au fost extinse spre persistență prin utilizarea unor strategii de bază. Tot în acest capitol sunt prezentate mecanismele prin care sunt specificate clasele de capacitate persistentă și posibilitățile de definire a obiectelor persistente ca un avantaj al sistemelor de gestiune orientate pe obiect. Prezentarea sistemului în detaliu face parte din efectele capitolului în care sunt prezentate imagini din procesul de lucru în cadrul sistemului.

1. RECUNOAȘTEREA FORMELOR NOȚIUNI GENERALE

1.1. Introducere în recunoașterea formelor

Recunoașterea formelor prezintă o modalitate folosită pe larg în extragerea informațiilor din imaginile achiziționate cu ajutorul programului. Este un domeniu vast, ce include[10]:

recunoașterea scrisului;

recunoașterea fețelor(chipuri) umane;

recunoașterea diverselor amprente;

obiectelor, etc.

Recunoașterea formelor constă într-o clasificare și/sau o descriere a conținutului imaginii. Clasificarea constă în atribuirea unei forme necunoscute din imaginea preluată la o clasa dintr-un set predefinit de clase. Operația de clasificare la final va conține o nouă imagine care reprezintă o hartă a obiectelor aflate în prim plan. În imaginea noua, valorile pixelilor de fapt reprezintă codurile asociate claselor corespunzătoare. Ca bază de lucru, clasificarea folosește metode matematice numite metode de recunoaștere teoretic-decizionale sau statistice, metode ce se bazează pe elemente din teoria deciziilor statistice.

Clasificatoarele se împart în două categorii:

semiautomate – presupun prezența unui operator uman la începutul procesului de clasificare care va specifica cîte clase vor rezulta la finalul operației;

automate – se face o clasificare a imaginii,dar fără a ști ce reprezintă fiecare clasă.

Algoritmii de clasificare în extragerea caracteristicilor e bazează pe o măsură a similarității (o distanță, de exemplu). O latură importantă în proiectarea sistemelor de clasificare automată este selecția caracteristicilor, deoarece componentele vectorului de caracterisitici presupune prezența unei cantităție destul de mari de informație. Această selecție este o problemă dependentă de numărul de clase și de formele analizate.

Un clasificator conține, în general, trei module: modulul de clasificare propriu-zis, un modul de cunoaștere(presupune prezența unui set de eșantioane/imagini de antrenare) și un modul de selecție și extragere a caracteristicilor(presupune partea finală a lucrului). Setul de antrenare poate conține de exemplu o bază de date cu diferite caracteristici ale obiectelor ce pot apare în scenă (semnături spectrale de exemplu sau semnături geometrice). Învățarea(modul de cunoaștere) presupune existența acestuia în procesul de antrenare, set ce cuprinde eșantioane pentru care se știe apartenența claselor. Prezența setului de antrenare este necesară în cadrul clasificării supervizate.

1.2. Caracteristicile unui sistem general de recunoașterea formelor

Un astefel de sistem este extrem de important în zilele noastre, astfel încît acesta asigură o parte din securitatea și siguranța utilizatorului.Un sistem de recunoaștere a formelor trebuie să asigure corect și eficient observarea, transformarea, prelucrarea preliminară (selectarea) și clasificarea eșantionului de date.

Elementele esențiale ale unui sistem general de recunoaștere a formelor sunt următoarele: translatorul, selectorul de caracteristici (care realizează o prelucrare preliminară) numit și preprocesor, sau extractor de caracteristici și clasificatorul (Fig. 1.1). Deși aceste 3 subunități sunt interdependente, în cele ce urmează le vom prezenta separat[10].

Fig. 1.1. Sistem general de recunoaștere a formelor

Translatorul transformă și transferă informațiile din lumea reală în spațiul formelor într-o formă compatibilă cu modul de reprezentare din calculatoarele electronice.Ca rezultat datele primare, rezultat al observației sunt transformate într-un șir de mărimi scalare care formează vectorul de formă n-dimensional. Fiecare componentă xi a vectorului de formă X reprezintă o cantitate fizică măsurabilă.

Modul de implementare al translatorului depinde exclusiv de natura datelor primare. Dacă acestea sunt structurate dintr-o succesiune de valori ce sunt măsurate la intervale de timp, atunci se necesită anumite procedee de eșantionare în timp, in moment ce acestea au funcție de frecvență, cum sunt de exemplu spectrele în infraroșu ale compușilor chimici.Ca rezultat al acestui exemplu se solicită dezvoltarea procedeelor de eșantionare a frecvenței (respectiv numerelor de undă). În cazul prelucrării imaginilor sunt luate în considerare suprafețele mai luminoase sau mai întunecate, muchiile sau formele geometrice. Aceasta etapă este o problemă ceva mai complicată și, de aceea , au fost propuse o serie de metode pentru reducerea complexității imaginilor la un șir de măsurători.

O situație fericită, în care translatorul nu mai este necesar, apare atunci când informațiile din lumea reală sunt exprimate numeric (de exemplu, în cazul spectrelor de masă).

Vectorii de formă dezvoltați de translator constituie mărimile de intrare pentru selectorul de caracteristici.

Scopul selectorului de caracteristici constă în prelucrarea vectorilor de formă în așa fel încât procedeul de clasificare să fie optimizat.

Selectorul de caracteristici (denumit și extractor de caracteristici sau preprocesor) acceptă ca mărimi de intrare vectorii de formă produși de translator și lucrează asupra lor transformându-i pentru a elimina sau, cel puțin, pentru a reduce cantitatea de informație irelevantă sau confuză menținând în vectori suficientă informație pentru a putea determina între diferitele clase de forme și descoperi invarianțele dintre formele aceleiași clase.

Pentru realizarea acestor deziderate au fost propuse și utilizate o mare varietate de metode.

Una dintre cele mai simple metode pentru prelucrarea vectorilor de formă constă în normarea acestora. O astfel de normare implică egalarea sumei componentelor fiecărui vector de formă (respectiv suma pătratelor componentelor lor) cu o constată arbitrară convenabil aleasă. Un alt procedeu, mult mai complicat, care utilizează matricea de covarianță duce, în final, la o ecuație matricială din care se obțin vectorii proprii și valorile proprii ( procedeul numit analiza componentelor principale sau analiza Karhuneu-Loeve).

Pentru prelucrarea vectorilor de formă și selectarea celor mai reprezentative caracteristici au fost utilizate și o serie de transformări mult mai complexe, cum ar fi transformata Fourier.

Pentru identificarea caracteristicilor mai importante au fost utilizate forme model sau prototip, s-au dezvoltat și implementat tehnici interactiv, implicând reprezentări grafice și rutine speciale de comparare, s-au calculat parametrii statistici, cum sunt momentele sau histogramele direct din forme.

Această etapă este esențială, de ea depinde succesul sau insuccesul oricărui studiu de recunoaștere a formelor.

Sarcina oricărui clasificator este, în general, următoarea: având dată o mulțime de vectori de formă prelucrați corespunzător, numită set de formare, se pune problema determinării unei funcții de decizie f(X) astfel încât dacă: f(X) > 0 atunci X aparține clasei 1, iar dacă f(X) >= 0 atunci X aparține clasei 2.

Această etapă în care este determinată funcția de decizie f(X) este cunoscută sub numele de fază de formare (formarea), de adaptare sau uneori de învățare. Scopul urmărit este minimalizarea probabilității de eroare în procesul de clasificare.

Conceptul de clasificare a formelor poate fi înțeles ca o partiționare a spațiului formelor, prin atribuirea fiecărui vector X sau punct X (x1, …,xn) la o clasă de forme corespunzătoare în regiuni reciproc exclusive, fiecare regiune corespunzând unei clase de forme particulară. Din punct de vedere matematic problema clasificării poate fi formulată sub forma funcțiilor de decizie discriminate.

1.3. Modelul general al procesului recunoașterii formelor

Procesul recunoașterii formelor este partea importantă a muncii, deoarece ea cuprinde toate rezultatele funcției din conceptul de clasificare a formelor. Pentru a se face distincție clară între problema recunoașterii din perspectiva prelucrării digitale a imaginilor și aceeași problemă din perspectiva inteligenței artificiale și robotizate, terminologia de specialitate folosită în limba engleză este pattern recognition și mai puțin object recognition. Chiar dacă vom folosi expresii ca recunoașterea formelor, recunoașterea obiectelor sau clasificarea imaginilor, în continuare ne vom referi doar la ceea ce literatura engleză de specialitate numește pattern recognition.

Recunoașterea formelor și/sau clasificarea imaginilor este un proces ce ține la baza sa un model structurat în patru pași. Chiar dacă în sistemele automate de recunoaștere și clasificare etapele nu apar întotdeauna ca fiind separate, ele vor fi în continuare prezentate distinct. Se urmărește astfel scoaterea în evidență a trăsăturile esențiale ale fiecărui pas /etapă, așa cum se poate observa în schema următoare[8]:

Fig.1.2. Modelul general al procesului recunoașterii formelor și clasificării imaginilor

Preprocesarea imaginii de obicei este etapa privită împreună cu etapa a doua dar importanța capitală pe care noi dorim să o acordăm etapei de extragere a atributelor ne-a făcut să le tratăm separat. Prin această etapă de preprocesare se înțelege de fapt aplicarea, unor algoritmi DIP specializați de îmbunătățire a calității imaginii. Unii dintre cei mai întrebuințați algoritmi de preprocesare, sînt[8]:

algoritmi de amplificare a contrastului;

algoritmi de eliminare a paraziților și a "zgomotului" (noise reduction);

algoritmi de transformare Fourier a imaginii, folosiți mai ales pentru analizarea texturii imaginii;

Rezultatul final al acestei etape poate fi:

aceeași imagine dar îmbunătățită, avînd unele detalii puse în evidență;

aceeași imagine dar într-o altă descriere ce facilitează recunoașterea obiectelor componente;

doar părți componente ale imaginii în diverse descrieri și formalizări.

Extragerea atributelor sau descriptorilor de imagine (feature extraction) este etapa cheie. Această etapă oferă măsura performanțelor și a profesionalismului aplicației de recunoaștere. Ea constă în aplicarea, împreună sau separat (după necesități), a unor algoritmi DIP specializați care urmează să fie prezentați în această lucrare, cum ar fi[8]:

îngroșarea, extragerea și/sau detectarea liniilor, muchiilor sau contururilor;

concatenarea segmentelor și conectarea contururilor;

segmentarea imaginii în zone de interes;

introducerea unor reprezentări sau descrieri ajutătoare a contururilor, zonelor sau obiectelor cu contururi delimitate prin metodele anterioare;

Alegerea unor atribute sau caracteristici cît mai potrivite este cheia succesului algoritmilor de recunoaștere. În general vorbind, obiectele sînt înzestrate cu doar trei atribute principale mărimea, culoarea și forma, totuși în practică recunoașterea cu exactitate și completă a celor trei caracteristici fundamentale este extrem de dificilă sau chiar imposibilă și presupune proiectarea și implementarea unor metode de aproximare a lor, însă numărul posibilităților de aproximare a mărimii și formei combinate între ele și înmulțite cu numărul imens de nuanțe de culori (ce sînt conținute de exemplu în textura obiectelor) conduce la un număr foarte mare de alegeri posibile. Marea taină a reușitei în problema recunoașterii constă tocmai în reducerea numărului uriaș de posibilități de a alege dintre mărimile, formele și culorile "sugerate" de imagine. Rezultatul final al acestei etape este un vector de n atribute extrase (x1, x2, …, xn) nu neapărat numerice.

Măsurarea atributelor sau descriptorilor (feature/pattern measurement), această etapă în practica recunoașterii imaginii nu este separată de cea anterioară întrucît, odată alegerea atributelor fiind făcută, se presupune că pentru ele a fost aleasă deja o metodă de măsurare, evaluare și comparare (discriminare). Reieșind din cele menționate anterior, cărțile de specialitate scot în evidență această etapă și, deseori, doar ea este cea care e prezentată în capitolul Object recognition and pattern clasification. Un motiv pentru care această etapă este atît de bine tratată teoretic este faptul că există un aparat matematic bine pus la punct – Teoria măsurii – cu ajutorul căreia se pot introduce diferite matrici n-dimensionale sau metode discriminative eficiente. Toate astea fiind spuse se bazează pe teoria științifică însă în practică se constată că folosirea unei singure măsuri (a unei singure matrici) nu este o metodă suficient de discriminativă (nu conduce la separarea precisă în clase distincte) și de aceea majoritatea aplicațiilor folosesc mai multe matrici in același timp. Cel mai des atragem atenția că această etapă "vulnerabilă" a întregului proces poate conduce în final la confuzii, rezultate eronate sau chiar mistificări[8].

Rezultatul final al acestei etape este de obicei o valoare numerică uni- sau multi-dimensională (un vector) privită ca fiind "distanța" vectorului de atribute față de "bornele" de clasificare.

Clasificarea imaginii constituie etapa finală în care se colaborează toate rezultatele măsurătorilor multiple anterioare (realizate cu mai multe matrici diferite) și se stabilește apartenența formei obiectului sau a imaginii descrise prin vectorul de atribute la o anumită clasă. Cu ajutorul unor metode ce sînt specifice strategiei de recunoaștere folosite putem spori viteza de clasificare a apartenenței la o clasă. Aceste metode poartă denumirea de criterii matematice sau funcții de apartenență, ce se bazează pe poziția spațială a vectorului de semnificanți față de granițele (liniile, planele sau hiperplanele) de delimitare între clase, sau reguli structurale (sintactice) de decizie (acceptare) a apartenenței la o clasă. Punerea în practică a acestor metode de clasificare nu estetot timpul o problemă simplă de calcul ci, de cele mai dese ori, necesită un aparat teoretic complicat și cîțiva algoritmi pe măsură. Finalul etapei de clasificare este numărul clasei de apartenență sau implicit denumirea acesteia, de unde și se obține implicit numele obiectului care se dorește a fi recunoscut.

Literatura de specialitate sau mai bine zis întreaga teorie a programării grupează modelele și metodele generale de recunoaștere și clasificare în patru mari categorii sau strategii, denumite abordări (pattern recognition approaches)[7-8]:

Recunoașterea prin potrivirea cea mai bună.

Recunoașterea prin metode statistice.

Recunoașterea cu ajutorul rețelelor neuronale.

Recunoașterea sintactică sau structurală.

Există și o altă clasificare în doar două mari categorii:

Recunoașterea bazată pe metode teoretice de decizie.

Recunoașterea sintactică sau structurală.

Potrivit celei de-a doua clasificare, metodele „a”, „b”, „c” ale clasificării anterioare sînt cuprinse toate într-o singură categorie. Diferența între cele două clasificări constă în faptul că, cele trei metode grupate împreună, deși par a fi diferite între ele, au comună totuși la etapa clasificării aceeași abordare funcțională. Categoria „d” a celei dintîi clasificare este aceeași cu categoria „b” de metode din cea de-a doua clasificare și conține în etapa finală a procesului de recunoaștere (etapa clasificării), este aceeași metodă de discriminare bazată pe algoritmi de apartenență, folosind arbori sintactici de acceptare. Această metodă de recunoaștere a apartenenței la o clasă este o metodă structurală ce este inspirată din Teoria gramaticilor și limbajelor formale[7-9].

Înainte de cumula întregul proces de funcționare a numeroaselor strategii de modelare și a algoritmilor utilizați în sistemele de recunoaștere a formelor și de clasificare a imaginilor, scopul urmărit este de a aduce un spor de claritate, care poate să conducă mai apoi la un plus de utilitate practică. Parcurgerea matricei pe linii și pe coloane permite realizarea de legături între modelul matematic și modelul teoriei deciziilor statistice.

Dacă e să facem anumite concluzii ce țin de literatura de specialitate din colecția articolelor din International Journal on Document Analysis and Recognition, Springer-Verlag, 2004 – se pot identifica o varietate impresionantă de metode, tehnici și algoritm, ce au fost utilizați în abordarea dificilei probleme a recunoașterii și clasificării automate. Pentru a crea o imagine corectă a unei multitudini de perspective diferite existente, vom trece în continuare în revistă. Pentru acuratețe și pentru a permite rafinarea ulterioară a termenilor ce apar, ei vor apare în limba engleză fără traducere în limba romînă.

În sursele de specialitate sunt oferite trei strategii generale de recunoaștere și regăsire a imaginilor: the signature-based technique, the partition-based approach and the cluster-based approach.

Sursele de specialitate propun o clasificare asemănătoare, tot în trei mari strategii: semantic-basedretrieval, content-based retrieval, and text-based retrieval. Tot aici sunt menționate metodele utilizate de sistemele autoamte de regăsire și recunoaștere a imaginilor existente pe piață. Există șase astfel de criterii generale de căutare, recunoaștere și regăsire: Color Content, Color Structure, Shape Content, Texture Content, Aspect Ratio and Brightness Structure.

Pe lîngă aceste modele generale sau strategii, pot fi găsite și alte abordări generale: classification component using fuzzy approach, user and Task-Based Approach, contextual clues and automatic pseudofeedback, relevance feedback, etc.

Fără a epuiza subiectul, lista următoare conține o altă metodă tehnici, algoritmi ce combină strategiile de mai sus sau introduc altele noi: multi-level color histogram, Fourier transform for segmentation, wavelets analysis methods, joint histograms, Similarity Measure methods, Dominant color classification, Hough transform based methods, Edge angle distribution, 3D neighborhood graph model, Statistical image differences methods, data covariance matrix based methods, connected component analysis, Clustering methods, degradation features based techniques, skew detection using morphology, Skew estimation methods, classification and segmentation using support vector machines, Multilevel thresholding – Region growing – Complex background analysis, classification and segmentation using boundary characteristics, etc.

1.4 Concluzii la capitolul 1

Ca formă de concluzionare putem afirma sus și tare că, implimentarea formelor de recunoștere a imaginii este un punct forte în zilele noastre. Această recunoaștere fiind însoțită de anumiți factori: clasificarea obiectelor și recunoașterea propriu-zisă. Problema clasificării automate a imaginilor pe baza recunoașterii formelor din imagini este o problemă de importanță strategică în multe domenii de mare interes. Sistematizarea metodelor și informațiilor care tratează acest subiect este un demers foarte dificil dar în același timp necesar. Rezolvarea ei se bazează pe metodele de recunoaștere a formelor sau a conținutului din imagini. Contribuția mea este tocmai realizarea acestui efort ce permite o viziune de ansamblu asupra problemei studiate și creează premisele pentru modelarea acesteia. Clasificarea automată a imaginilor va permite nu numai recunoașterea lucidă a imaginii, dar va spori și productivitatea lucrului în cadrul instituțiilor și va facilita procesul acestuia. Demersul original al acestor pagini este de a sistematiza mulțimea abordărilor existente pentru a permite obținerea unei baze în vederea modelării acestei probleme.

Parcurgând atent literatura de specialitate putem spune că recunoașterea și clasificarea imaginilor este un proces ce se desfășoară în patru pași – etape – esențiali și inevitabili. Evidențierea acestor patru etape ale procesului de recunoaștere și clasificare a imaginilor permite apoi sistematizarea gradată a tuturor metodelor existente. Potrivit acestor două forme de oformare a programului ce operează cu imaginea, avem posibilitatea de a depista ușor și fără erori obiectul necesar, indiferent de domeniul dorit, însă cea ma importantă latură a programului o are forma de clasificare, aceasta fiind cheia succesului pe tot parcursul operțiunilor.

2. ANALIZA ȘI PROIECTAREA SISTEMULUI DE RECUNOAȘTERE ȘI GHIDARE A OBIECTELOR ÎN TIMP REAL

În acest capitol va fi prezentată informația teoretică și practică despre procesul de proiectare și elaborare a produsului elaborat în totalitate și detaliat. Sarcina tehnică constă în elaborarea pachetului de programe pentru organizarea lucrului de recunoaștere și ghidare a obiectelor în timp real.

2.1. Instrumentarii de elaborare a aplicației

Există o multitudine de modalități ce se ocupă de crearea aplicațiilor de tipul dat, însă pentru realizarea acestei aplicații pot fi utilizate următoarele instrumente:

Platforma Windows 2000/XP sau Windows 7/8;

Mediu de programare orientat pe obiect;

Biblioteci speciale de prelucrare a imaginilor;

Componente speciale;

Mediu de procesare text și grafică pentru design.

Instrumentele folosite la realizarea proiectului sunt:

Sistemul de operare: Windows 7;

Limbaj de programare: Embarcadero RAD Studio XE6;

Biblioteci: OpenGL Image, HGE version 1.81, Open CL;

Componente: TMS components, RZ Component;

Editor grafică: Adobe Photoshop;

Ideea care a stat la baza creării aplicației a fost ca să fie posibilă recunoașterea și ghidarea obiectelor în timp real, precum și amplasarea acestuia din urmă pe orice calculator. Astfel aplicația reprezintă un modul integru, care fiind instalat pe un calculator va funcționa indiferent de platforma existentă(windows xp/7/8).În acest sens la crearea lui s-a ținut cont de faptul că sistemul dat să fie conectat la o sursa de captare video(foto,web camera, camera, etc), aceasta la rîndul să poată furniza informația care este prelucrată de un set de algoritmi, ce au ca rezultat depistarea obiectelor. Însă pentru a fi ghidate, acestora li se va indica niște puncte speciale. Sistemul cu care se operează va compara punctele între ele și va preciza în ce direcție sa deplasat obiectul. A scrie o aplicație de recunoaștere și ghidare a obiectelor este posibilă în orice limbaj de programare orientat pe obiect, însă principalul lucru este ca bibliotecile adăugătoare în prelucrarea imaginilor să fie compatibile. Toate acestea au fost realizate cu ajutorul limbajului de programare Embarcadero RAD Studio XE6. Orice produs program creat, pe lângă faptul că trebuie să fie proiectat bine și comod în utilizare, este necesar ca să posede și o interfață plăcută, adică să aibă un design reușit. În acest scop a fost utilizat un set de componente adăugătoare precum TMS component și redactorul de imagini Adobe Photoshop.

Justificarea oportunității realizării sistemului

În economia actuală, unde este prezentă concurența, o importanță deosebită o are modul de gestionare a informației, timpul și mai ales operativitatea de prelucrare a informației, deoarece de acești parametri depinde activitatea oricărei instituții. Rapiditatea furnizării informației și respectiv luarea deciziei va fi rezultatul posedării unei cote de piață mai mare și deci obținerii unui profit considerabil, iar acesta din urmă va duce la prosperitate. Majoritatea instituțiilor de producere au înțeles direcția ce va duce la succes, la dezvoltarea ulterioară, anume utilizând tehnologiile informaționale moderne.

Orice instituție se străduiește să-și extindă aria de acoperire, prin atragerea de noi investiții și prin acordarea unor condiții mai bune de muncă angajaților utilizînd tehnica de calcul pentru a înlocui munca fizică cu cea intelectuală. Cînd angajații sunt puși în situații obositoare de-a lua în mod repetat aceleași decizii ideal este ca el să fie înlocuit de o mașinărie, cu softul dat specializat în anumit domeniu se va reduce erorile ce pot apărea în producere.

De menționat că aplicația propusă prezintă în sine un modul independent și poate fi plasat pe orice calculator personal ce posedă o sursă de captare video. Posesia produsului program va permite:

pentru utilizator:

interfață simplă de lucru;

meniu comod;

identificarea obiectelor simple(patrat, triunghi, romb, etc);

determinarea focusării obiectelor;

posibilitatea vizualizării informației reale și celei prelucrate în timp real;

prelucrarea informației statice(foto);

prelucrarea informației dinamice(video);

posibilitatea conectării diverselor surse de captare video;

posibilitatea setării surselor de captare video.

posibilitatea păstrării informației de lucru;

pentru administrator/programator:

posibilitatea gestionării funcțiilor;

corecții erori.

resursele necesare pentru lucrul cu aplicația web sunt minime:

un PC standard;

Windows 7

o sursă de captare video;

2.3. Alegerea instrumentarului

Ca instrument principal pentru crearea sistemului dat va fi utilizat limbajul de programare orientat pe obiect Embarcadero RAD studio XE6 cu trei pachete adăugătoare de biblioteci în prelucrarea imaginilor. Cauza principală este dorința de a creea o aplicație descktop, ce va avea ca efect recunoașterea și ghidarea obiectelor în timp real. Un al doilea limbaj de programare s-a ales limbajul unificat de modelare (UML), ce ne va permite crearea schemei funcționale, deoarece orice sistem înainte de a fi elaborat, trebuie să fie proiectat.

Mediul de proiectare "Rational Rose"

Rational Rose este un limbaj unificat de modelare(UML) utilizat ca instrument de proiectare software orientat pe obiect destinat pentru modelarea și construcția aplicațiilor software. Programatorul de software foloseste Rational Rose pentru a crea vizual modelul funcțional al aplicației prin utilizarea claselor, actorilor, elementelor de caz (ovale), obiecte și mesaje/relații(săgeți), folosind simboluri drag-and-drop. Rational Rose documentează diagrama construită și apoi generează codul la alegerea programatorului în C++, Visual Basic, Java, Oracle sau Corba.

Rational Rose a fost un produs al companiei Rational Software Corporation, după care a fost cumpărat de International Bussines Machine Rational, la cârma căreia stau trei dintre cei mai valoroși autori de metode de analiză și proiectare orientată pe obiecte: Grady Booch, James Rumbaugh și Ivar Jacobson. Pînă nu demult dezvoltarea metodelor de analiză și proiectare orientată pe obiecte se făcea în mod independent, începând cu anul 1995 s-a constatat o tendințã de unificare a acestora în scopul creșterii eficienței. Astfel, firma IBM Rational promite pe viitor introducerea așa-zisei Metode Unificate (Unified Method), care reprezintă o "super-metodã" de analizã și proiectare ce va conține cele mai importante caracteristici ale metodelor propuse de Booch, Rumbaugh (OMT) și Jacobson (Objectory). Acest produs este disponibil pe următoarele platforme: sistemele și mediile de operare din familia Windows și OS/2, Unix[19].

Varianta demonstrată a produsului poate fi găsita pe Internet sau procurată. Aceastã variantã este formatã dintr-o aplicație care permite analiza și proiectarea unei aplicații folosind diagrame de clase, diagrame de stări, scenarii, diagrame de module și diagrame de procese, precum și generarea de cod sursã, un analizor care realizează analiza unui text sursã și modelarea unei aplicații prin reverse engineering și un tutorial care prezintă într-o manierã foarte elegantã principalele caracteristici ale produsului.

Pentru a înțelege UML(Limbajul unificat de programare), trebuie înțelese trei elemente majore: blocurile constructive , regulile care dictează modul în care aceste blocuri pot fi combinate, precum și mecanismele generale, utilizate de OMT. Blocurile constructive se împart în trei categorii: diagramele, relațiile și elementele. Pentru fiecare dintre acestea s-a încercat identificarea metodelor de analiza și proiectare din care provin. Elementele sunt abstracțiuni care reprezintă piesele fundamentale într-un model. La rândul lor se împart în: elemente comportamentale, elemente structurale, elemente de adnotare grupare și elemente de adnotare. Relațiile sunt abstracțiuni ce leagă elementele între ele. O relație reprezintă o conexiune între elemente.[19] În modelarea orientată pe obiect, există patru tipuri de relații: generalizările, asocierile, realizările și dependentele. Diagramele reprezintă prezentări grafice ale unui set de elemente, cel mai adesea exprimate ca un graf de noduri (elementele) și arce (relațiile). Regulile stabilesc cum trebuie grupate blocurile constructive. Exista reguli detaliate pentru definirea modelelor bine formate. Sunt admise însă și modele mai puțin decât bine formate, în sensul că se pot admite și modele cu elemente ascunse, modele incomplete sau modele inconsistente, cel puțin pentru iterațiile preliminare ale procesului de dezvoltare. Mecanismele generale simplifică dezvoltarea modelelor UML. Există patru mecanisme generale, aplicate uniform în întreg limbajul: ornamente, mecanisme de extensie, specificații, și diviziuni generale. În ce privește generarea codului Rational Rose, el oferă posibilitatea proiectantului de aplicații să genereze cod din modelul realizat folosind una dintre metodele amintite mai sus. Generarea de cod se realizează doar la nivelul diagramelor de clasã, și deci se generează doar șabloane. Astfel, pentru fiecare clasã din model se vor genera douã fișiere: un fișier header, cu extensia „.h”, în care vor fi incluse declarația clasei, declarațiile tuturor variabilelor și funcțiilor membru existente în model precum și declarații de variabile membru corespunzătoare tuturor asociațiilor și agregărilor[19].

2.3.2. Mediul de programare Embarcadero RAD Studio XE6

Trebuie de indicat faptul că sintaxa limbajului Embarcadero RAD Studio XE6(operatorii, tipurile de date), cît și principiile acestuia de lucru sunt similare atît limbajului C++, cît și lui Pascal, deoarece se lucrează cu obiecte și clase și respectivele proprietăți ale acestora (clase, moștenire, încapsulare, limitarea accesului, zona vizibilității variabililor, constantelor și funcțiilor etc.). O caracteristică foarte utilă a limbajului Embarcadero RAD Studio XE6 este c[ se pot prelucra excepții. În timpul execuției programului pot apărea diverse erori, cum ar fi: împărțirea la 0, încercarea de a deschide o informație inexistentă, etc. În așa cazuri, programul generează așa-zisele excepții și executarea operațiilor ulterioare în bloc se termină. Excepția este un obiect de tip special, ce caracterizează situația apărută. Paroprietatea excepțiilor constă în faptul că ele sunt obiecte temporare, adică imediat ce sunt prelucrate, se distrug. Reacția standart la majoritatea excepțiilor apărute este afișarea unei informații succinte despre eroare și distrugerea exemplarului dat de excepție. Am ales acest mediu de programare deoarece el dispune de următoarele avantaje:

Înaltă performanță – cu unul din cele mai rapide compilatoare;

RAD – Rapid Application Development, această tehnologie a fost creată datorită progamării vizuale orientat pe obiect;

reutilizarea componentelor – un adevărat mediu orientat pe obiect;

conține biblioteci specializate în programarea grafică;

este simplu și rapid în utilizare;

simplu și comod la construcția formelor;

posibilitatea vizualizării codului pentru fiecare bibliotecă;

posibilitatea modificării componentelor și bibliotecilor;

comoditatea legării între componente și biblioteci;

Dacă e să facem o analiză dintre mediile de programare ca C++ Visual și Borland Embarcadero RAD Studio XE6, aș putea spune că după comfortul de lucru și rapiditate în compilare, Embarcadero RAD Studio XE6 e la un nivel foarte mare. Aceasta s-ar putea spune prin faptul că în Embarcadero RAD Studio XE6 sunt date la vederea programatorului caracteristicile atît a ferestrelor cît și a componentelor de pe această fereastră, iar la tastarea dublu clic pe component ne transferă automat la funcția componentei. O altă comoditate este ca Embarcadero RAD Studio XE6 generează automat corpul funcției, în ceea ce privește Visual C++ pentru a crea o nouă componentă sau de creat corpul funcției, trebuie de compus de către programator textul funcției și de aceea nu întodeauna lucrează corect. În fine aș putea spune că după în viziunea mea de programator este foarte util și eficient de utilizat mediul de programare Embarcadero RAD Studio XE6.

Embarcadero RAD Studio XE6 oferă programatorilor posibilitatea rapidă și eficientă de personalizare a Paletei de componente; proiectrea rapidă a aplicației (RAD); administrarea totală a codurilor și obiectelor vizuale cu Object Inspector; biblioteca VCL (Visual Component Library) permite crearea unor baze de date complete foarte rapid.

2.3.2.1. Structra funcțiilor utilizate în Embarcadero RAD Studio XE6

La definirea formelor se pot utiliza 55 de proprietăți și 30 de evenimente, dintre care unele pot caracteriza majoritatea componenetelor.

Principalele proprietăți ale formelor sunt:

ActiveControl permite alegerea unei componente a formei care să fie în focar;

AutoScroll permite atașarea automată a barelor de defilare (valoare True);

BorderIcons permite atașarea la bara de titlu (a meniului sistem, a butoanelor de minimizare și maximizare, și eventual a butonului de help ? );

BorderStyle definește chenarul formei;

Caption reprezintă denumirea formei care va fi afișată în bara de titlu, iar în cazul unei componente reprezintă eticheta atașată acesteia (dacă este precedată de caracterul & atunci se poate selecta prin Alt + litera subliniată );

Color definește culoarea de fond a formei (culori predefinite, implicit clBtnFace, sau valori returnate de funcția RGB);

Ctl3D precizează dacă forma sau componenta are aspect tridimensional (val. True);

Cursor definește aspectul cursorului de mouse (valoarea implicită este crDefault);

Enabled forma sau o componentă poate fi înhibată (dacă valoarea este False, caz în care va fi afișată cu caractere estompate, valoarea implicită fiind True);

Font definește tipul caracterelor utilizate;

FormStyle stabilește stilul formei (copil, pa rinte);

Height și Width stabilesc dimensiunile formei (inclusiv chenarul) exprimate în pixeli;

Hint definește mesajul care va fi afișat când o componentă este indicată de cursorul de mouse (este activ dacă proprietatea ShowHint= =true);

HorizScrollBar și VertScrollBar – stabilesc dacă forma are sau nu bare de defilare (orizontale respectiv verticale) cu următoarele caracteristici;

Principalele evenimente ale formelor sunt:

OnActivate are loc când o formă devine activă. La această comandă este chemată numele funcției din clasa Tform1. Procedura corespunzătoare fiind:

void __fastcall TForm1::FormActivate(TObject *Sender)

{//lista de instrucțiunni …}

OnClick apare când se efectuează un clic de mouse pe zona liberă a formei. Ca și la funcția anterioară aici are loc chemarea numelui funcției din biblioteca Tform1:

void __fastcall TForm1::FormClick(TObject *Sender)

{//lista de instrucțiunni …}

OnMouseMouve are loc când o se deplasează cursorul de o zonă de lucru indicată. La această comandă este chemată numele funcției din clasa Tform1. Procedura corespunzătoare fiind:

void __fastcall TForm1::MouseMouve(TObject *Sender)

{//lista de instrucțiunni …}

OnMouseUp apare când se efectuează un clic de mouse pe zona liberă a formei. Ca și la funcția anterioară aici are loc chemarea numelui funcției din biblioteca Tform1:

void __fastcall TForm1::MouseUp(TObject *Sender)

{//lista de instrucțiunni …}

OnDblClick – la un dublu clic de mouse pe zona liberă a formei se execută. Ca și la funcția anterioară aici are loc chemarea numelui funcției din biblioteca Tform1:

void __fastcall TForm1::FormDblClick(TObject *Sender)

{//lista de instrucțiunni …}

OnCloseQuery se activează când utilizatorul dorește să închidă forma (cu metoda Close, clic pe butonul de închidere și prin meniul sistem sau comanda Alt+F4). Ca și la funcția anterioară aici are loc chemarea numelui funcției din biblioteca Tform1:

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)

{//lista de instrucțiunni …}

Dacă se atribuie parametrului CanClose valoarea True, atunci se poate închide forma și se lansează procedura corespunzătoare evenimentului OnClose, iar dacă i se atribuie valoarea False, atunci forma nu poate fi închisă.

OnClose se produce la închiderea formei dupa evenimentul OnCloseQuery:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{//lista de instrucțiunni …}

Parametrul Action poate primi una din următoarele valori:

None – nu se va închide forma;

Hide – ascunde fereastra, care poate fi reafișată cu metoda Show;

Free – închide forma;

Minimize – minimizează forma.

OnCreate se produce la prima execuție a formei, când se pot inițializa proprietățile formei și ale componentelor acesteia, prin procedura:

void __fastcall TForm1::FormCreate(TObject *Sender)

{//lista de instrucțiunni…}

Dacă proprietatea Visible = true, atunci se vor declanșa în ordine următoarele evenimente:

OnDeactivate se produce când o fereastra se dezactivează, moment în care se lansează în execuție procedura:

void __fastcall TForm1::FormDeactivate(TObject *Sender)

{//lista de instrucțiunni …}

OnDestroy se realizează când se distruge forma:

void __fastcall TForm1::FormDestroy(TObject *Sender)

{//lista de instrucțiunni …}

OnHide apare în momentul în care forma este ascunsă (Visible= false):

void __fastcall TForm1::FormHide(TObject *Sender)

{//lista de instrucțiunni …}

OnShow apare în momentul în care forma este afișată (Visible= true):

void __fastcall TForm1::FormShow(TObject *Sender)

{//lista de instrucțiunni …}

OnPaint este declanșat când diverse zone ale formei trebuie să fie redesenate:

void __fastcall TForm1::FormPaint(TObject *Sender)

{//lista de instrucțiunni …}

În fine aș putea spune că am prezentat mai detaliat unele corpuri ale funcțiilor, deoarece să fie pe viitor mai ușor de înțeles structura și cum sa elaborat programul.

2.4 Algoritmi implimentați la depistarea și ghidarea obiectelor

Sitemul informatic de recunoaștere și ghidare a obiectelor în timp real va prelucra imaginile preluate de la dispozitivele optice, cum ar fi:

Web cameră.

Aparat de fotografiat.

Cameră video.

Produsul program implimentat în lucrarea dată, va rezolva problema recunoașterii și ghidării obiectelor în timp real. Vreau să menționez faptul că pentru ca un obiect de pe o imagine să fie recunoscut, este nevoie ca acea imagine să fie readusă la niște condiții în așa fel încît obiectul să fie ușor detectabil (utilizarea algoritmilor). Pentru a face ca numai anumite obiecte să fie recunoscute dintr-o mulțime posibilă, am folosit metoda spectrului de culore și a marcării. Am ales așa cale, deoarece majoritatea jocurilor, filmurilor, etc. folosesc această metodă, ea reduce considerabil viteza de lucru a aplicației și nu necesită utilizarea super calculatoarelor.

Principiul de lucru este acela că orice cadru din fluxul video, este prelucrat ca o imagine. Pentru ca obiectul să fie recunoscut, imaginea trece prin algoritmul de extragere a conturului, după care se segmentează/subțiere și nu în ultimul rînd se urmărește conturul acesteea. O dată ce am depistat conturul obiectului, îl marchez cu niște puncte speciale de o culoare, pe care utilizatorul o alege și verific la fiecare cadru acele puncte. În dependență de amplasarea acestora se efectueză ghidarea conturului, adică a obiectului: sus, jos, stînga, dreapta. Programul dat se poate de complicat la maxim prin formarea figurei 3D, prin indicarea grafică a direcției de deplasare, etc. însă este nevoie de echipament informatic performant.

Îmbunătățirea imaginilor se referă la o clasă largă de operații al căror scop este mărirea detectabilității componentelor imaginii. În final mă voi folosi de algoritmul de urmărire a conturului petru ca să pot obține diferențierea intre doua sau mai multe imagini primite de la dispozitivele optice, pentru a verifica dinamica obiectelor.

2.4.1. Algoritmul de recunoaștere

Descrierea bazată pe conținut a imaginii se realizează în principal prin recunoașterea și interpretarea unor caracteristici esențiale ale tipului de mediu, cum ar fi:

culoarea,

textura,

forma,

locația spațială,

regiunile de interes,

caracteristicile faciale,

cadrele cheie,

detectarea modificărilor de scenă.

Recunoașterea automată a caracteristicilor importante ale unui mediu necesită un algoritm corespunzator, ale căror criterii de optimizare sunt atât viteza de lucru cît și micșorarea costurilor, dar nu și în ultimul rînd asigurarea unei indexări consistente.

Algoritmii ce au fost implimentați la recunoașterea obiectelor sunt:

algoritmul de extragere a conturului.

algoritmul de urmărire a conturului

algoritmul de segmentare

algoritmul subțiere.

Una dintre cele mai des folosite operații în domeniul analizei imaginilor și în același timp una dintre problemele fundamentale în acest domeniu este detecția și extragerea de contur. Un contur sau o muchie, reprezintă limita dintre obiect și fundal, așadar cunoașterea acestuia este folositoare pentru următoarele etape de analiză a imaginii[15]:

segmentare;

înregistrare;

identificarea obiectelor

Un contur este definit ca fiind totalitatea pixelilor în care există discontinuități abrupte de nivele de gri. În imaginile binare, punctele de graniță se definesc ca fiind pixelii negri având cel puțin un vecin alb în vecinătate.

Pentru a începe execuția algoritmului dat, este nevoie de un punct de start astfel încât vecinul său de pe linie, din stînga, să nu aparțină zonei. Alegerea se bazează pe cunoașterea intensității pixelilor din zonă. La indicarea algoritmului în cod c++ și explicarea acestuia, voi avea nevoie de cîteva însemnări și anume variabile: s –va reprezenta pixelul de start, c –va reprezenta pixelul current și d – va indica direcția de căutare a următorului pixel de contur. Pe lîngă variabile voi avea nevoie de niște indicatori precum: urm – indică pixelul din vecinatatea celui curent, care ar putea fi următorul pixel de contur, contur va indica vectorul în care se memorează direcția de deplasare în fiecare pas și urm va indica dacă aparține sau nu regiunii. O deosebită importanță în lucrul algoritmului o are operația modulo, cu ajutorul căruia se poate de ales direcția acestuia. Algoritmul se termină când pixelul curent este cel de start. Este posibil ca pixelul de start să fie un punct izolat. De aceea, dacă după trei cicluri nu s-a găsit un alt punct de contur, va rezulta că punctul de start va fi un punct izolat.

Functia Contur prezentata mai jos primește că parametru punctul de contur curent și întoarce următorul punct de contur, sau punctul curent dacă în vecinătățile nu se gasește un punct de contur. Direcția în care s-a găsit următorul punct de contur este memorata în vectorul contur.

char *contur;

int n=0, d;

void Contur (Punct c)

{

urm = vecin(c, d % 1);//se utilizează operația modulară

if (urm in R)

{

contur[n] = (unsigned char) (D % 1); d %= 2; return (urm); n++

}

urm = vecin(c, d);

if (urm)

{

contur[n] = (unsigned char)D; return (urm); n++

}

urm = vecin(c, d % 1);

if (urm)

{

contur[n] = (unsigned char)(D % 1); return (urm); n++

}

d %=2;

return (c); // în caz că nu se găsește se va returna punctual curent

}

Așadar funcția principală de extragere a conturului “Extrage” primește ca parametru punctul de start a conturului.

int Extrage (Punct k)

{ Punct y = k;

d = 6; // direcția de căutare inițială, caută al doilea punct de contur

for (int k = 0; k<3; k++)

{ y = Contur(c);

if (y !=s) break; //dacă y este neegal cu s

}

if( k==3) return(0); // dacă k=0, punct izolat traverseaza conturul

while( y != k)

y = PunctContur(y);

return (1);

}

În cazul cînd este nevoie de extras toate contururile unei zone, atunci se începe cu extragerea conturului exterior, executînd algoritmul „Contur” puțin modificat astfel încât:

punctul de start să fie memorat într-un vector Pstart;

codurile de înlănțuire să fie memorate în vectorul contur;

la traversarea unui contur, valoarea pixelilor conturului se incrementează.

Algoritmul de extragere a tuturor contururilor are următorii pași:

se extrage conturul exterior;

se caută un punct pe contur din care va începe parcurgerea regiunii pentru găsirea contururilor interioare. Parcurgerea regiunii are loc întotdeauna spre dreapta, de aceea punctul de start pentru parcurgere se alege de pe un arc coborîtor;

se parcurge regiunea din punctul de start determinat, spre dreapta, căutînd fie un punct de start pentru un contur interior, fie marginea regiunii.

Un alt algoritm utilizat este algoritmul de urmărire a conturului ce este utilizat pentru urmărirea conturului obiectelor dintr-o imagine. La aplicarea acestui algoritm presupunem că imaginea este binără sau că obiectele din imagine au fost etichetate în prealabil.

Pașii algoritmului[11]:

Se scanează imaginea din colțul stînga sus pînă cînd se primește un pixel care aparține unei regiuni; acest pixel P0 reprezintă pixelul de start al conturului regiunii. Se definește o variabilă dir în care se reține direcția mutării anterioare de-a lungul conturului de la elementul anterior spre elementul curent. Se inițializează:

Dir =0 dacă conturul este detectat folosind vecinătatea de 4 (Fig. 2.1 a)

Dir =7 dacă conturul este detectat folosind vecinătate de 8 (Fig. 2.1 b)

Se parcurge vicinătatea de 3×3 a pixelui curent în sens invers acelor de ceasornic, începînd cu pixelul corespunzător poziției:

(dir +3) mod 4 (Fig. 2.1c)

(dir+7) mod 8 dacă dir este par (Fig.2.1d)

(dir+6) mod 8 dacă dir este impar (Fig.2.1e)

Primul pixel găsit care are aceeași valoare ca și pixelul curent este noul element Pn al conturului. Se actualizează valoarea lui dir.

Dacă elementul curent Pn al conturului este egal cu al doilea element P1 din contur și dacă elementul anterior Pn-1 este egal cu primul element P0 , atunci algoritmul se încheie. Altfel se repetă pasul (2).

Conturul detectat este reprezentat de pixelii P0…Pn-2 .

Fig.2.1 (a) Reprezintarea direcției, vecinătate de 4, (b) vecinătate de 8, (c) secvență de căutare în cazul vecinătății de 4 pixeli, (d), (e) secvența de căutare în cazul vecinătății de 8 pixeli, (f) urmărirea conturului pentru vecinătate de 8 .

Determinarea conturului este transformarea unei imagini de tip albnegru în imagine de tip formată din linii și curbe[11].

Muchiile, care caracterizează conturul obiectului (conturul fiind descries prin muchii), sunt utile în recunoașterea obiectelor (clasificarea in cazul reprezentărilor codificate). Muchiile sunt locații de pixeli cu salturi mari de nuanță (nivel) de gri. În imaginile alb-negru, muchiile sunt formate din puncte (pixeli) de culoare neagră cu cel puțin un punct alb în vecinătate.

În rezolvarea aceste probleme trebuie precizate următoarele :

Conexitatea, adică definirea vecinătății.

Putem considera că un punct P(j,i) are patru vecini ( pe cele patru direcții, r(P), u(P), l(P), d(P) ) din fereastra ecran (VE) :

Fig.2.2 Cu patru vecini.

Precizarea apartenenței conturului (Interior sau Exterior). Dacă imaginea este alb-negru, atunci vom preciza culoarea fondului și culoarea obiectului. Practic vom preciza o culoare (alb sau negru) care reprezintă culoarea punctelor pentru care se verifică apartenența la contur (vezi figurile de mai jos, unde conturul poate fi unul din cele două).

Fig. 2.3 Culoarea alb si negru care reprezintă culoarea punctelor pentru care se verifică aparența la contur.

Obținerea descrierii conturului prin traversarea punctelor determinate. Mulțimea punctelor P determinate anterior se va ordona, prin parcurgerea acestei din vecin în vecin (rezultand și șirul comenzilor de descriere, adică Π- cuvantul corespunzător) începand cu un punct ales din contur (de exemplu cel mai din stanga-sus), pană se revine la punctul inițial sau nu se mai poate deplasa.

Un următor algoritm în depistarea obiectelor este segmentarea, ce reprezintă împărțirea imaginilor pe zone de interes. De regulă segmentarea urmărește extragerea, identificarea sau recunoașterea unui anumit obiect dintr-o imagine.

Pentru algoritmul segmentare voi arăta chiar codul implimentat în softul elaborat. Acest algoritm este o procedură iterativă(repetitivă) care include în fiecare iterație divizare și unificare, ce trece prin următorii pași[12]:

dacă o parte este neomogenă, ea este separtă în patru părți;

dacă două părți adiacente sunt similare, ele sunt unificate;

algoritmul se termină atunci când nu mai este posibilă nici-o unificare. Algoritmul se execută recursiv(adică o funcție se chiamă pe ia însuși tot de atîtea ori cît se satisface o condiție):

dacă partea curentă nu este omogenă, ea este divizată în patru și procedura este apelată recursiv.

dacă partea este omogenă, se calculează media sa și se compară cu mediile regiunilor(părților) vecine, verificînd posibilele unificări. Astfel, dacă diferența dintre media regiunii curente și media unei regiuni adiacente este sub o valoare de prag, atunci cele două regiuni se unifică și se calculeaza media valorilor pixelilor celor doua regiuni si se atribuie pixelilor celor două regiuni în imaginea de ieșire;

dacă nici o unificare nu este posibilă, se atribuie pixelilor regiunii din imaginea de ieșire valoarea medie a pixelilor săi;

dacă mai multe unificări sunt posibile, se alege cea mai bună, adică unificarea cu regiunea vecină care are valoarea medie cea mai apropiată de valoarea medie a regiunii curente.

Implimentarea algoritmului de segmentare în Embarcadero RAD Studio XE6: sunt date două imagini, x este imaginea de intrare iar y este imaginea de ieșire. Parametrii A1, B1, A2 și B2 sunt colțurile stînga sus și dreapta jos ale dreptunghiului care încadrează imaginea segmentată. T este pragul folosit în criteriul de omogenitate și N va memora numarul de regiuni rezultate din divizarea recursivă – long s.

void imReg(imagine x, imagine y, int *N, int A1, int B1, int A2, int B2, int T)

{

if(!omogen(a,A1, B1, A2, B2,T) && (A2-A1) > 1 && (B2-B1) >1)

{ //dacă nu e omogen se împarte în patru părți

imReg(x, y, A1, B1, (A1+A2)/2, (B1+B2)/2, T, N); //funcția se apelează pe ia însăși

imReg(x, y, (A1+A2)/2, B1, A2, (B1+B2)/2, T, N); //funcția se apelează pe ia însăși

imReg(x, y, A1, (B1+B2)/2, (A1+A2)/2, B2 , T,N); //funcția se apelează pe ia însăși

imReg(x, y, (A1+A2)/2, (B1+B2)/2, A2, B2, T, N); //funcția se apelează pe ia însăși

}

else

{ (*N)++; s=0; //regiunia se incrimentează

for(int i=B1; i<B2; i++) //ciclăm tabloul bidimensional

for(int j =A1; j<A2; j++)

s+ = x[i][j]; s/ =(A2-A1)*(B2-B1);

for(i=B1; i<B2; i++) //ciclăm tabloul bidimensional

for(j=A1; j<A2; j++)

y[i][j] = (unsigned char) s; //elementului tabloului i se atribuie valoarea s

}

return (1);

}

Funcția de verificare a omogenității

int omogen( imagine a, int A1, int B1, int A2, int B2, int T)

{ //dacă e omogen

int max =0, min = Lmax; // nivelul maxim de intensitate

for(int i=B1; i<B2; i++)

for(int j=A1; j< A2; j++)

{

if(x[i][j] < min) min = x[i][j]; //verificăm elementul minimal

if(x[i][j] > max) max = x[i][j]; //verificăm elementul maximal

}

if(max – min < T) return (1); //daca din max scădem minim și valoarea e mai mică de T

else return (0);

Următorul algoritm utilizat este cel de subțiere, care reprezintă o procedură prin care sunt eliminați pixeli selectați din zona unei imagini binare. Subtierea se folosește pentru a scheletiza regiuniile rezultate din segmentarea imaginilor dar și pentru imbunătățirea rezultatului detectoarelor de bordură. Procesul de subțiere folosește un șablon binar numit element de structurare. Acesta este caracterizat printr-un tablou bidimensional de 3×3 elemente avînd numai valori 1 și 0. Punctul de origine fiind în centrul șablonului. Algoritmul de subțiere este caracterizat prin următoarele[13]:

procedura de subțiere, adică algoritmul este ciclic;

un ciclu al algoritmului constă în aceia că dacă toate valorile 1 ale șablonului acoperă biți egali cu 1 în imagine și dacă toate valorile 0 ale șablonului acopera biți egali cu 0 în imagine, atunci pixelul imagine acoperit de originea șablonului este setat la zero, adică devine pixel de fond. În caz contrar nu este modificat;

procesul se incheie atunci cînd într-o iteratie nu se produce nici-o modificare a imaginii.

Implimentarea algoritmului de subțiere în Embarcadero RAD Studio XE6: sunt date două imagini, a este imaginea de intrare iar b este imaginea de ieșire. Parametrii A1, B1, A2 și B2 sunt colțurile stînga sus și dreapta jos ale dreptunghiului care încadrează șabloanele prelucrate. În fiecare ciclu se efectuează procedura de subțiere mai întîi cu șablonul din stînga, apoi cu cel din dreapta.

void subtiere( imagine a, int A1, int B1, int A2, int B2 )

{// în fiecare ciclu imaginea este parcursă o singură dată;

int I, j, k, l, inreg, tranz, STOP, m, b [9];

do

{

STOP = 1;

for ( k = A1 + 1; k<A2 – 1; k ++ )

for (I = B1 + 1;I< B2 – 1;I++ )

if ( a[k] [I] = = 1 )// pixel in regiune

{ // numara pixelii = 1 din vecinatatea de 3 x 3 (pixeli interiori) inreg = 0;

for ( i = -1; i <=1; i++ )

for ( j = -1; j <=1; j++ )

if ( a[k+i] [l+j] = = 1) inreg++;

if((inreg>2) &&( inreg<8))

{ m = 0;

for (i = -1; i <=1; i++ )

b[m++] = a[k-1][l+i]; b[3] = a[k][l+1];

b[4] = a[k+1][l+1]; b[5] = a[k+1][l];

for ( i = 1, m = 6; i >= -1; i–)

b[m++] = a[k+i][l-1];

tranz = 0;

for ( m=0; m<=7; m++ )

if ( b[m] = = 0 && b[m+1] ==1 )

tranz++;

if ( tranz = =1 ) { a[k][l] = 0; STOP = 0; }}}}

while (!STOP);

}

2.4.2 Algoritmul de ghidare

Un algoritm din categoria celor de recunoaștere este cel ce permite extragerea caracteristicilor de mișcare dintr-o secvență video, luîndu-se în considerare atât operațiile efectuate cu camera video cît și conținutul video prin caracteristicile sale temporale, algoritmul de determinare a muchiilor în mișcare. Un astfel de algoritm este foarte important pentru luarea în considerare a conținutului video prin caracteristici temporale, folosite apoi la clasificarea și regăsirea cadrelor în relație cu un anumit eveniment. Algoritmul de recunoaștere a mișcării care determină muchiile în mișcare între cadrele succesive se bazează pe sesizarea poziției și a mișcării obiectelor și parcurge trei etape[22]:

procesarea imaginilor pentru a determina locația muchiilor în mișcare. Modelarea datelor video se face ca un șir de imagini ce variază în timp, exprimate prin variabila I(x, y, t). Derivata partială în raport cu timpul acesteia estimează diferențele dintre două imagini cadru succesive din secvența video. Aceste imagini se convertesc în imagini formate din muchii spațiotemporale și se normalizează cu valori cuprinse în intervalul 0 și 1.

calculul succesiunii cîmpurilor ce determină viteza punctelor muchiilor în mișcare de-a lungul mai multor cadre. Algoritmul implică selectarea punctelor dominante ale muchiilor, distribuite în fiecare imagine-cadru, calculînd un cîmp de derulare inițial și apoi netezînd acest cîmp prin aplicarea unei restricții. Pentru a asigura împrăștierea punctelor dominante se divide imaginea cu muchii în mișcare în zone de 10*10 pixeli și se selectează un punct dominant în fiecare zonă. Dintre punctele dominante se aleg numai acelea cu mai mult de două puncte vecine și cu panta spațio-temporală cea mai mare. Setul de punctele dominante este indicat în imaginea Et(x,y,t) ca Dt. De la acestea se obține un set inițial de asemănări vector prin calculul unei corelații de diferențe absolute, pornind de la imaginea I(x,y,t) pâna la imaginea I(x,y,t+t *t) pentru toate punctele dominante Dt. Se produce o lista de asemanari posibile V(xe, ye) pentru fiecare punct din setul de puncte dominante, (xe, ye). Lista aceasta de asemănări este ordonată după resturile corelației diferenței absolute. Luînd în considerare asemănarea cea mai mare dintre punctele v(xe, ye) ce aparține V(xe, ye) se obține un cîmp inițial de zgomot.

Scopul final este de-a găsi un optim global (xe, ye) pentru fiecare punct muchie ales din candidații posibili V(xe, ye). Optimul se găsește folosind un alt algoritm, ce minimizează varianta dintre puncte prin modificarea vectorilor viteză în puncte și prin eliminarea vectorilor viteza redundanți. Acest algoritm pornește cu setul de cele mai bune perechi locale care pot estima cîmpul. Procesul continuă pînă cînd se creaza o diferență mai mică decît o valoare prag sau se atinge numărul maxim de iterații. Rezultatul este supus procesului de rafinare.

c) Gruparea vectorilor într-o succesiune coerentă ce determină calea de mișcare (direcția) a obiectelor din imagine. Se consideră că vectorii apropiați din același cadru și punctul cu aceeași direcție generală aparțin aceluiași grup. Algoritmul determină iterativ grupurile corespunzătoare din fiecare cadru, considerînd pe rînd fiecare vector. Dacă nu exista un grup compatibil se crează unul nou pentru a putea include vectorul. Odată ce vectorii din fiecare cadru sunt grupați se aplică un criteriu de trasare a căii de mișcare a grupurilor vector prin mai multe cadre. Direcția medie a fiecărui grup prezice locația grupului în următorul cadru prin proiecție liniară.

2.5 Prezentarea funcționalității sistemului în formă de diagrame

Un caz de utilizare este o secvență a tranzacțiilor realizate de sistem ca răspuns la evenimentele declanșate de un actor a sistemului. Un caz de utilizare complet trebuie să ofere o valoare măsurabilă unui actor cînd actorul execută o sarcină anume. Un caz de utilizare conține toate evenimentele care pot surveni în cadrul perechii actor – caz de utilizare, nu neapărat unul ce va apărea în orice scenariu particular. Un caz de utilizare conține un set de scenarii care explică diferitele secvențe ale interacțiunii din interiorul tranzacției[21].

Cu alte cuvinte s-ar putea spune că diagrama variantelor de utilizare prezintă acțiunile reciproce dintre variantele posibile de utilizare și personale sau sisteme. Diagramele reflectă cerințele către sistem din punct de vedere al utilizatorului . În acest sens variantele de utilizare sînt funcțiile efectuate de sistem iar persoanele sînt persoane cointeresate de sistemul elaborat. Diagrama arată că persoana inițiază varianta diagramei de utilizare. La fel din ea se vede că persoanele cointeresate primesc date de la varianta de utilizare. Din diagrama variantelor de utilizare se poate afla multă informație aflată la sistem. Acest tip de diagrame descrie funcționarea sistemului la general. Utilizatorii, managerii proiectării analitice, specialiști și toți cei cointeresați în sistemul dat pot să înțeleagă sistemul dat.

Fig. 2.5. Diagrama de interacțiunie a utilizatorului cu aplicația

În diagrama din figura 2.5 sunt indicate funcțiile de bază pe care trebuie să le îndeplinească utilizatorul pentru a lucra cu sistemul de recunoaștere și ghidare a obiectelor în timp real. După cum se poate de observat este indicat utilizatorul care accesează cazul de utilizare accesează. La această comandă sistemul va rula fereastra de lucru, în care ulterior se seta dispozitive, se va introduce datele de intrare, iar în final va fi afișată informația solicitată.

Fig. 2.6. Funcționalitatea sistemului

În diagrama din figura 2.6, sunt prezentate funcțiile de bază pe care le execută sistemul SRGOTR(sistem de recunoaștere și ghidare a obiectelor în timp real):

aplică algoritm conturare;

aplică algoritm segmentare;

aplică algoritm subțiere;

aplică algoritm extragere contur;

aplică filtru urmărire contur;

conectare;

ghidează;

prelucrare;

marchează;

salvare, etc.

În diagrama din figura 2.7 am indicat întreg procesul de lucru a utilizatorului cu sistemul de recunoaștere și ghidare a obiectelor în timp real(SRGOTR). Prin această diagramă oricine poate să înțeleagă logica de funcționare a sistemului și care sunt etapele prin care trebuie de trecut pentru a obține rezultatul final. Dacă întîmplător se omite o careva etapă indicată în diagramă nu se va obține nici-un rezultat.

Fig. 2.7. Interacțiunia dintre utilizator, sistem și cameră

2.6. Concluzii la capitolul 2

Concret, tehnologiile informatice moderne discutate în lucrare se pot discuta din două puncte de vedere, care privesc caracteristicile sistemelor informatice, respectiv modalitățile de realizare a acestora. Din punctul de vedere al caracteristicilor sistemelor informatice, este astăzi unanimă ideea existenței unui sistem informatic integrat la nivelul instituțiilor de învățămînt, într-o arhitectură modulară și folosind o bază de date unică.  

În ceea ce privește metodologiile moderne de realizare a sistemelor informatice, există astăzi o cvasi-unanimitate în privința folosirii tehnologiilor orientate pe obiecte. În favoarea acestei afirmații menționăm apariția și dezvoltarea limbajului UML (Unified Modelling Language), a metodologiilor de analiză și proiectare orientate pe obiecte, a instrumentelor CASE integrate care sprijină acest proces, a limbajelor de programare moderne. De altfel, fără existența acestor instrumente și metodologii ar fi aproape de neconceput abordarea integrată a sistemului informatic al întreprinderii. Impactul sistemelor informatice asupra managementului întreprinderilor nu mai trebuie demonstrat, el fiind evident.

Se poate continua idea spunând ca UML surprinde si descrie în limbaj grafic sistemul. Realizarea unui model este la fel de importanta ca realizarea proiectului unei clădiri pe care arhitectul dorește să o construiască. La fel și un programator fără această schiță nu se poate construi sistemul web. Un model bun trebuie să identifice cerințele și să comunice informații, să se concentreze asupra modului cum interacționează elementele modelului și să nu se împotmolească în detalii, să permită vizualizarea relațiilor dintre componente și să îmbunătățească comunicarea între cei care pragmatici la realizarea proiectului, pe baza limbajului grafic.

La efectuarea analizei și proiectării acestui sistem informatic am plecat de la un studiu de caz concret. Bineînțeles că în urma analizei, studiul de caz poate fi generalizat, iar sistemul informatic poate fi utilizat pentru orice tip de proiect și în cadrul oricărei organizații care aplică gestiunea prin proiecte.

Consider că soluțiile găsite și identificate pentru implementare sunt abordări realiste, identificate în urma studierii documentațiilor existente și a experienței personale atît în proiectarea sistemelor informatice cît și a aplicațiilor existente pe piață. Consider că prin activitățile desfășurate și efortul depus în realizarea acestei teze s-au asigurat condițiile pentru implementarea cu succes a sistemului informatic descris.

DESCRIEREA APLICAȚIEI ELABORATE

3.1. Ghidul utilizatorului

Ghidul utilizatorului este îndrumarul fiecăruia care inițiază să lucreze cu acest program și care tinde spre a dezvolta mediul în care lucrează și cu ajutorul căruia ar dispune de mai mult timp pentru a face alte lucruri, care sunt în folosul său[23].

Pentru a fi executat produsul program ce are ca scop recunoașterea și ghidarea obiectelor în tim real este nevoie de tastat dublu clic pe pictograma aplicației executabile(fig.3.1).

Fig. 3.1. Pictograma apicației elaborate

La comanda inițializată de executor prin accesarea pictogramei aplicației sistemul va afișa fereastra principală de lucru, cu ajutorul căreia se va putea realiza toate sarcinile ce au fost puse(executate) la etapa de analiză și proiectare. După cum se poate de observat în figura 3.2 este indicată zona de lucru a utilizatorului ce este împărțită în trei zone:

zona video online;

zona video prelucrat;

zona setărilor și rezultatelor.

Fig. 3.2. Fereastra principală a aplicației

O dată ce fereastra de lucru este activă, operatorul sau persoana ce va opera cu sisteml va avea posibilitatea să opereze cu unele funcții ale sistemului, prezentate în figur 3.3 prin accesarea meniului „Program”, „Setări” sau ca opțiunie „Ajutor”.

Fig. 3.3. Meniul principal al aplicației

După cum deja conoaștem din informația indicată în capitolul 2, pentru a putea opera cu sistemul nou elaborat este nevoie de o sursă de captare video(video cameră, web cameră, aparat foto, ș.a). Acest sistem este practic universal din punct de vedere a conexiuniei cu dispozitiele optice,deci nu necesită programe speciale de interconectare între acestea și sistem. După ce sa conectat sursa de captare video aceasta trebuie activată, pentru ca programul să poată reda informația captată. Pentru aceasta utilizatorul va accesa meniul indicat în figura 3.3 și va alege opțiunia “Program”. La comanda dată sistemul va afișa submeniul indicat în figura 3.4.

Fig. 3.4. Submeniul „Program”

În figura indicată mai sus(fig. 3.4.) operatorul are posibilitate să înceapă procesul de lucru(de conectare a dispozitivului optic de produsul program realizat) prin accesarea opțiuniei “Start Video”, sau să întrerupă acestă activitate prin tastarea opțiuniei “Stop Video”. Sistemul elaborat are posibilitatea de-a lucra atît cu informația grafică în formă video, cît și cu informația grafică în formă foto, deoarece cu toții cunoaștem că materialul video reprezintă un șir de cadre care se execută într-un interval de timp(cadre pe secundă) pe care le putem numi și imagini. Din aceste considerente la etapa de proiectare sa introdus și opțiunia de prelucrare după o imagine oarecare, care ar corespunde cu tematica lucrării date. Pentru aceasta va fi necesar de tastat opțiunia “Incarcă Imagine”. La comanda dată sistemul va chema o fereastră specială (figura 3.5) cu ajutorul căreia va fi posibilă de selectat un fișier grafic din lista de fișiere prezente în computerul de pe care se rulează aplicația.

Fig. 3.5. Fereastra de încărcare a materialului foto

Trebuie de remarcat faptul că orice dispozitiv de captare video conectat la calculator posedă o așanumită aplicație(driver) ce permite setarea parametrilor optici. Nu toți utilizatorii cunosc de unde și cum se poate de apelat acești driveri, de aceia am hotărît de introdus această funcție în programul elaborate. Pentru a fi chemată funcția dată, utilizatorul va accesa meniul principal al aplicției și va tasta opțiunia “Setare”. În dependență de tipul dispozitivului va fi chemat driverul respectiv(fig. 3.6.).

Fig. 3.6. Setarea dispozitivului optic

O dată ce a fost conectată sursa de captare video, rulată și setată se poate de recurs la funcția principală a sistemului și anume la procedul de recunoaștere și ghidare a obiectelor în timp real. Dacă toate procedurile efectuate mai sus vor fi făcute cu succes, operatorul va fi înștiințat printr-o derulare a materialului video(fig. 3.7, fig 3.8) captată de sursa conectată.

Fig. 3.7. Video captat în cazul unui dreptunghi

Fig. 3.8. Video captat în cazul unui triunghi

În timpul execuției programului și anume la derularea materialului video preluat de la sursa optică, acesta o dată la cinci milisecunde efectuiază stop cadru și prelucrează imaginea obținută prin seria de algoritmi indicați în capitolul 2, în urma cărora ne va fi recunoscut și indicat conturul formei respective. Tot interiorul zonei obținute va fi pistruiat cu niște puncte de o culoare specială, pe care utilizatorul o va seta în figura 3.9. Pentru ca acele puncte să fie de culoare specială și plăcută ochiului, utilizatorul va indica în casetele special amenajate nuanțe de roșu(Red) vede(Green) și albastru(Blue) cu parametri de la 0 la 255. În dependență de ce valori se vor seta pentru RGB, așa culoare se va forma, pe care utilizatorul o va putea vizualiza în zona specială indicată printr-o cercuferință.

Fig. 3.9. Meniul de setare a culorii zonei recunoscute

O dată ce sa depistat obiectul pe formă, acesta trebuie dirijat, pentru a îndeplini a doua parte a temei propuse. În cazul dat am indicat niște puncte speciale numiți marker ce vor avea funcția de control a conturului(formei). Toate acele puncte(pixeli) vor putea fi ușor observați pe fereastra de lucru din figura 3.10.

Fig. 3.10. Setarea punctelor de control(markerilor)

În continuare voi arăta rezultatul execuției programului, adică cum a avut loc localizarea imaginii și respectiv ghidarea acestuia. La deplasarea obiectului pe formă, are loc controlul periodic a poziției acestuia.

Fig. 3.11. Localizarea și ghidarea dreptunghiului

Fig. 3.12. Localizarea și ghidarea triunghiului

Nu în ultimul rînd doresc să menționez că orice sistem elaborat are nevoie de o carte de vizită, deoarece acel care va lucra cu el să cunoască funcționalitățile, tehnologiile utilizate, precum și persoana sau compania care la realizat. Pentru aceasta am introdus în meniul principal al programului așa opțiunie ca “ajutor”. La această comandă sistemul afișează informația respectivă prezentată în figura 3.13.

Fig. 3.12. Fereastra „Informație program”

Concluzie la capitolul 3

Folosirea unei multitudini de documente are un rol destul de important pentru oricare pachet software, și un capitol ușor de realizat în ingineria acestui pachet. Toată această documentație facilitînd procesul de lucru și de folosire a datelor într-un anume domeniu. Ca și în oricare alt proces de lucru, în modul cel mai clar al operativității se implimentează ceva anume, în cazul dat „documentația” este acel ceva care odată elaborat tinde să atingă anumite scopuri, pentru a demonstra avantajele pe care le deține și pentru a aduce cu sine noi idei ce pot fi realizate pentru a dezvolta sistemul de lucru din cadru întreprinderilor.

Avînd două scopuri de bază cu ajutorul căreia scoate în vizorul fiecărui utilizator avantajul său, documentația capătă un loc aparte în baza de date a fiecărei instituții. În primul rând documentația trebuie și încearcă să descrie pachetul software și modul lui de utilizare. Acest proces al documentației fiind cunoscut ca o metodă de utilizare, care este destinată utilizatorului final al sistemului și care implică un caracter mai puțin tehnic[24].

În era tehnologiei, odată cu punerea în aplicație a tuturor formelor care sporește modul de lucru, documentația de utilizare este un instrument de marketing foarte important. O documentație ce implică forme de utilizare ușor realizabile, împreună cu o interfață bine proiectată, reușesc de a mări accesibilitatea produsului și totodată reușesc să sporescă vânzările acestuia. În linii generale, documentația de utilizare ia forma unui ghid care conține o relatare a celor mai folosite caracteristici și forme de utilizare, oferite de produsul respectiv.

Un alt scop urmărit de documentație este de a descrie sistemul software astfel încât acesta să poată fi întreținut și nu în ultimul rînd înteles pe durata celorlalte perioade de viață.

Documentația de acest tip este cunoscută sub numele de „documentație de sistem” și are în mod inevitabil un caracter mult mai tehnic decât documentația de utilizare. Aici putem menționa faptul că capacitatea de prelucrare a acestei documentații este mai mare și cuprinde o sferă largă de operare a datelor din cadrul instituțiilor. Inițial această documentație era format din programele sursă, în forma finală(un fel de concluzii), la care mai erau adăugate unele explicații schițate după încheierea procesului de dezvoltare. Astăzi documentația sistemului începe cu dezvoltarea specificațiilor inițiale și continuă pe întreaga durată de viață a produsului software. La finele produsului documentația cuprinde date concrete din toate documentele elaborate în faza de dezvoltare a sistemului și va prezenta metodele de funcționare și procedeele care au recurs la acest rezultat.

CONCLUZII

În rezultatul efectuării acestui proiect de licență, a fost proiectată și realizată o aplicație ce are ca scop recunoașterea și ghidarea obiectelor în timp real.

Realizarea acestui sistem permite de a ne putea manifesta mai ușor în procesul de muncă și de a ști cum să folosim ceea ce ne dăruiește secolul în care trăim. Din moment ce trăim în era noilor tehnologii informaționale, nu ne miră deloc faptul că multitudinea de programe care sunt realizate zi de zi facilitează procesul de lucru din cadrul fiecărei organizații. Pentru implimentarea unui nou produs program, e nevoie să se țină cont de politica acestuia și de stilul lui de activitate.

Acest proiect este foarte simplu și foarte ușor la expluatarea lui. El are un rol vast în evaluarea imaginii ținînd cont de specificul oricărui domeniu, fie public, fie științific sau chiar și informativ. În caz că la exploatarea pe viitor vor apărea necesități de modificare a formelor de intrare sau algoritmilor, acestea trebuie efectuate în programa respectivă. Modificările programelor pot fi ușor efectuate, deoarece toate formele de lucru cu bibliotecile speciale sunt implementate utilizând aceiași tehnologie de interacțiune: se schimbă componentele necesare pe formă, iar apoi se introduc modificări în programa.

Pentru realizare a fost utilizat limbajul Ebarcadero RAD Studio XE6 și trei biblioteci de prelucrare a imaginilor (OpenGL Image, HGE version 1.81, Open CL). Tandemul acestor două instrumente este pe larg folosit în elaborarea aplicațiilor de prelucrare a imaginilor. Având sintaxa asemănătoare lui C++ și pascal este foarte accesibil chiar și începătorilor.

Concluzie cea mai importantă, legată de realizarea proiectului este că fără utilizarea mediilor de modelare realizarea putea tinde cu mult mai mult, deoarece UML(limbajul unificat de modelare) a permis să înțelegem mai bine necesitățile impuse, ordinea de executare a operațiilor și de determinare a componentelor programului. Adică a adus la micșorarea sinecostului proiectului și minimizării ale timpului necesar pentru realizare și susținere.

Au fost atinse toate scopurile declarate:

au fost studiate diferite aplicații asemănătoare;

au fost studiate principiile de lucru a aplicațiilor RAD;

a fost studiat limbajele Ebarcadero RAD Studio XE6 și Rational Rosse;

a fost studiate trei biblioteci de prelucrare a imaginilor (OpenGL Image, HGE version 1.81, Open CL);

în final a fost elaborată aplicția;

Deci, scopurile au fost atinse, programul este rentabil, iar proiectul dus la bun sfârșit.

BIBLIOGRAFIE

Perju V. Îndrumări metodice privind elaborarea și perfectarea tezelor de licență și master. Chișinău, ULIM, 2010. Mediateca ULIM. http://inginerie.ulim.md/assets/files/regulamente /Recomandari%20TLM%20Ro%202010.pdf .

Buzuloiu V. Prelucrarea imaginilor: note de curs, Universitatea “Politehnică” București 2000. 176 p. ISBN 9972-9969-8-4.

Castleman K. R. Digital Image Processing, Prentice Hall, Englewood Cliffis, NJ, 220 p. ISBN 5645-2152-6-9.

Condorachi D. – MNT – instrument de analiză morfometrică a reliefului, Lucr. Simpoz. „Sisteme Informaționale Geografice”, Ediția a VII-a/Chișinău 1999, Analele Șt. Univ. „Al. I. Cuza” Iași, tom XLVI, s II c, Geografie – supliment, 2000. 330 p. ISBN 3678-5412-3-3.

Gordan M. Sisteme de analiză a imaginilor digitale folosind clasificatoare mașini cu vectori suport, Casa de Știință, Cluj-Napoca 2006. 196 p. ISBN 689-265-1-7.

Haralick R. M.,Sternberg S. R., Zhuang X. Image Analisys using Mathematical Morphology, in IEEE Trans. On Pattern Analisys and Machine Intelligence. Vol.9. 532-549 p. ISBN 8978-5465-2-6.

Ioan Ispas, Algoritmi de recunoașterea formelor și clasificarea automată a imaginilor, Referat, Univ. Babeș-Bolyai, Facultatea de Matematică-Informatică, Cluj-Napoca, 2003. 1.110 p. ISBN 3123-6589-5-7.

Ioan Ispas. Modelare și modele matematice în recunoașterea obiectelor și clasificarea automată a imaginilor, Univ. Petru Maior, Facultatea de Matematică-Informatică, Tîrgu Mureș, 2003. 1.20 p. ISBN 6579-8974-3-9.

Ioan Ispas. Algoritmi de prelucrare digitală a imaginilor, Referat, Univ. Babeș-Bolyai, Facultatea de Matematică-Informatică, Cluj-Napoca, 2003.

Informație electronică. Concepte fundamentale ale teoriei recunoașterii formelor. Note de curs. Autor necunoscut. Sursa electronică: http://www.google.md/url?sa=t&rct=j &q=&esrc=s&source=web&cd=28&ved=0CGIQFjAHOBQ&url=http%3A%2F%2Fxa.yimg.com%2Fkq%2Fgroups%2F16228215%2F1927657521%2Fname%2Fcurs&ei=0aiWU4CYCurB7AaLpIHADQ&usg=AFQjCNHPKR_O83Q_tWrUqQs8bhb2Jly9Og&sig2=tgwbq3QRnJ_uGyAwpZvjtw&bvm=bv.68445247,d.ZGU;

Informație electronică. Procesarea imaginilor-Laborator N6: Algoritmul de urmărire a conturului. Sursa web: http://users.utcluj.ro/~rdanescu/PI-L6r.pdf;

Florica Moldoveanu. Curs SPG. Sursa web: http://andrei.clubcisco.ro/cursuri/4spg/ Segmentarea%20imaginilor.pdf ;

Florica Moldoveanu. Curs SPG-Subțiere și scheletizare. Sursa web:http://andrei.clubcisco.ro /cursuri/4spg/Subtiere%20si%20scheletizare.pdf;

Informație electronică. Lucrarea nr.7 – Filtrarea Imaginilor. Sursa web http://www.miv.ro /ro/documentatie/pi/PIlab07.pdf

Florica Moldoveanu. Curs SPG – Extragerea conturului unei regiuni. Sursa web: http://ru.scribd.com/doc/228772537/Extragerea-Contururilor-Unei-Regiuni;

Gui V., D. Lacrămă, D. Pescaru “Prelucrarea imaginilor” Ed. “Politehnica”. 1.120 p.

Mihai Bulea, Structuri și algoritmi paraleli pentru prelucrarea imaginilor și recunoașterea formelor. 1.50 p. ISBN 5687-3216-5-9.

Moldoveanu, Fl., Racovita, Z., Petrescu, S., Hera, G., Zaharia, M.: Grafica pe calculator, Editura Teora, Bucuresti,. 280 p. ISBN 5428-5642-1-5.

Novicicov A.N. Rational Rose pentru programatori. http://citforum.ru/programming /application/rrose.shtml (vizitat 24.04.2014).

Orza B.,Vlaicu M., Gordan M., Popa C. Viziunea computerizată în exemple și aplicații practice, U.T. Press, Cluj-Napoca, 2007. 254 p. ISBN 625-382-216-9.

Popescu, D. Achiziția și prelucrarea imaginii, e. ICPE, Bucuresti, 2001. 1.130 p. ISBN 9753-8067-42-1.

Prula Georgeta. Algoritm pentru recunoașterea mișcării într-o segvență video. Revista informatica economică, București.

Pavlidis T., “Algorithms for Graphics and Image Processing”, Computer Science Press. 1.160 p. ISBN 3213-6542-3-5.

The OpenGL graphics system: a specification (version 1.1).

The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.

Tutorial PhotoShop. http://www.photoshoplady.com/photoshop-tutorial/category/photoshop-tutorial/ (vizitat 08.05.2011).

Tutorial PhotoShop. http://www.photoshopstar.com/ (vizitat 09.05.2011).

Vertan, Constantin, Prelucrarea și analiza imaginilor, București, Editura Printech. 1.96 p. ISBN 3321-6985-1-6.

Vlaicu A. Prelucrarea imaginilor digitale, Editura Microinformatica, Cluj-N 1997. 232 p. ISBN 973-601-999-3.

Vlaicu, Aurel, Prelucrarea digitală a imaginilor, Cluj-Napoca, Editura Albastră, 1997. 1.150 p. ISBN 5648-6598-6-5.

Zamperoni P. Image Enhancement, Advances in Imaging and Electron Physies. Vol. 6 Academic Press 1995. 1-77 p. ISBN 7976-9878-6-4.

Visual Introduction in OpenGL, Siggraph’98.

Apxангeльcкий A., Borland C++ Builder 5, Mocква, 2000.

Эдваpд Эйнджeл, Интepактивная кoмпютepная гpафика. Bвoдный кypc на базe Open GL, изд. Bильямc, Mocква, 2001, p.25-50, 55-95, 287-317.

B. Шамиc, Borland C++ Builder 6, Питep, 2003.

Пpoгpаммиpoваниe: oкна и анимация, Miguel Angel Sepulveda, LinuxFocus.

ANEXA A: Listingul programului

#include <vcl.h>

#include "CImg.h"

#include "masks.h"

#include <math.h>

#include "ShellAPI.h"

using namespace cimg_library;

//–––––––––––––––––––––––––

#pragma package(smart_init)

#pragma link "RzButton"

#pragma resource "*.dfm"

TForm1 *Form1;

TPoint gpt_1(0,0);

double gd_width=0, gd_height=0;

void __fastcall TForm1::Exit1Click(TObject *Sender)

{

Form1->Close();

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Open1Click(TObject *Sender)

{

if(Form1->OpenPictureDialog1->Execute())

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

gd_height = Image1->Picture->Height;

gd_width = Image1->Picture->Width;

Image1->Height = Image1->Picture->Height;

Image1->Width = Image1->Picture->Width;

tempp[0].load_bmp(OpenPictureDialog1->FileName.c_str());

tempp[1].load_bmp(OpenPictureDialog1->FileName.c_str());

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Save1Click(TObject *Sender)

{

if(Form1->SavePictureDialog1->Execute())

Image1->Picture->SaveToFile(SavePictureDialog1->FileName);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::SkeletizareClick(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<unsigned char> pic(dx, dy,1,1,0), interf(dx, dy,1,1,0), tmp(dx, dy,1,1,0), chk(dx, dy,1,1,0), img(dx, dy,1,1,0);

int i, j, l,z;

unsigned char p[6], pq;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

if ( pic(i,j)>=150 )

pic(i,j) = 255;

else pic(i,j) = 0;

}

}

while (chk != pic)

{

chk = pic;

tmp.fill(0);

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

for(l=0;l<40;l++)

{

if (((pic(i-1,j-1) == 255*k[l][0][0])&&(pic(i,j-1)== 255*k[l][0][1])&&(pic(i+1,j-1)== 255*k[l][0][2])

&&(pic(i-1,j)== 255*k[l][1][0])&&(pic(i,j)== 255*k[l][1][1])&&(pic(i+1,j)== 255*k[l][1][2])

&&(pic(i-1,j+1)== 255*k[l][2][0])&&(pic(i,j+1)== 255*k[l][2][1])&&(pic(i+1,j+1)== 255*k[l][2][2])) )

tmp(i,j) = 255;

}

}

}

interf.fill(0);

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

for(l=0;l<60;l++)

{

if (((tmp(i-1,j-1) == 255*m[l][0][0])&&(tmp(i,j-1)== 255*m[l][0][1])&&(tmp(i+1,j-1)== 255*m[l][0][2])

&&(tmp(i-1,j)== 255*m[l][1][0])&&(tmp(i,j)== 255*m[l][1][1])&&(tmp(i+1,j)== 255*m[l][1][2])

&&(tmp(i-1,j+1)== 255*m[l][2][0])&&(tmp(i,j+1)== 255*m[l][2][1])&&(tmp(i+1,j+1)== 255*m[l][2][2])) )

interf(i,j) = 255;

}

}

}

img.fill(0);

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

if ( pic(i,j)==255 && ( tmp(i,j)==0 || interf(i,j)==255 ) )

img(i,j) = 255;

}

}

pic = img;

}

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

if(img(i,j)==0 && img(i,j+1)==0 && img(i-1,j)==0 && img(i,j-1)==0 && img(i,j+1)==0 && img(i+1,j)==0&&

(((img(i-1,j+1)==255 && img(i+1,j-1)==0)||(img(i-1,j+1)==0 && img(i+1,j-1)==255))&&

((img(i-1,j-1)==0 && img(i+1,j+1)==255)||(img(i-1,j-1)==255 && img(i+1,j+1)==0))) )

pq=255;

else pq=0;

if((pq==0 && img(i-1,j)==0 && img(i+1,j)==0 && (img(i-1,j-1)==255 || img(i,j-1)==255 || img(i+1,j-1)==255) && (img(i-1,j+1)==255 || img(i,j+1)==255 || img(i+1,j+1)==255))||

(pq==0 && img(i,j+1)==0 && img(i,j-1)==0 && (img(i-1,j-1)==255 || img(i-1,j)==255 || img(i-1,j+1)==255) && (img(i+1,j-1)==255 || img(i+1,j)==255 || img(i+1,j+1)==255))||

(img(i+1,j+1)==255 && img(i,j+1)==0 && img(i+1,j)==0 && (img(i-1,j-1)==255 || img(i-1,j)==255 || img(i,j-1)==255))||

(img(i-1,j+1)==255 && img(i,j+1)==0 && img(i-1,j)==0 && (img(i,j-1)==255 || img(i,j)==255 || img(i+1,j)==255))||

(img(i-1,j-1)==255 && img(i-1,j)==0 && img(i,j-1)==0 && (img(i,j+1)==255 || img(i+1,j+1)==255 || img(i+1,j)==255))||

(img(i+1,j-1)==255 && img(i,j-1)==0 && img(i+1,j)==0 && (img(i,j+1)==255 || img(i-1,j+1)==255 || img(i-1,j)==255)) )

img(i,j)=255;

}

}

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = img(i,j)*65793;

}

}

ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;}

//–––––––––––––––––––––––––

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

gd_height *= 1.1;

gd_width *= 1.1;

Image1->Height = int(gd_height);

Image1->Width = int(gd_width);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)

{

if((Image1->Height >= 20) && (Image1->Width >= 20))

{

gd_height /= 1.1;

gd_width /= 1.1;

Image1->Height = int(gd_height);

Image1->Width = int(gd_width);

}

}

//–––––––––––––––––––––––––

void __fastcall TForm1::MedianClick(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<double> pic(dx, dy,1,1,0), res(dx,dy,1,1,0);

CImg<double> mask(3,3,1,1,0);

int i, j;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

res = pic.blur_median();

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = res(i,j)*65793;

}

}

ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1:: subtiere(TObject *Sender)

{

{// în fiecare ciclu imaginea este parcursă o singură dată;

int I, j, k, l, inreg, tranz, STOP, m, b [9];

do

{

STOP = 1;

for ( k = A1 + 1; k<A2 – 1; k ++ )

for (I = B1 + 1;I< B2 – 1;I++ )

if ( a[k] [I] = = 1 )// pixel in regiune

{ // numara pixelii = 1 din vecinatatea de 3 x 3 (pixeli interiori) inreg = 0;

for ( i = -1; i <=1; i++ )

for ( j = -1; j <=1; j++ )

if ( a[k+i] [l+j] = = 1) inreg++;

if((inreg>2) &&( inreg<8))

{ m = 0;

for (i = -1; i <=1; i++ )

b[m++] = a[k-1][l+i]; b[3] = a[k][l+1];

b[4] = a[k+1][l+1]; b[5] = a[k+1][l];

for ( i = 1, m = 6; i >= -1; i–)

b[m++] = a[k+i][l-1]; tranz = 0;

for ( m=0; m<=7; m++ )

if ( b[m] = = 0 && b[m+1] ==1 ) tranz++;

if ( tranz = =1 ) { a[k][l] = 0; STOP = 0; }

}

}

}

while (!STOP);

}

}

//–––––––––––––––––––––––––

void __fastcall TForm1::ContrastClick(TObject *Sender)

{

Form2->Enabled = true;

Form2->Edit1->Text = Form2->TrackBar1->Position;

Form2->Visible = true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

gpt_1.x = X;

gpt_1.y = Y;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

TPoint pt2;

double dist;

pt2.x = X;

pt2.y = Y;

dist = sqrt( double( (gpt_1.x – pt2.x)*(gpt_1.x – pt2.x) + (gpt_1.y – pt2.y)*(gpt_1.y – pt2.y)));

Edit1->Text =FormatFloat("#.##",dist); //dist;

StatusBar1->SimpleText="Distanta: "+ Edit1->Text;//FloatToStr(dist);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::EdgeDetect1Click(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<double> pic(dx, dy,1,1,0), res(dx,dy,1,1,0);

CImg<double> mask(3,3,1,1,0);

int i, j;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

res = pic.convolve(mask);

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = res(i,j)*65793;

}

} ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Help1Click(TObject *Sender)

{

Application->HelpSystem->ShowContextHelp(1,Application->HelpFile);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::RzToolButton3Click(TObject *Sender)

{

if(tempp[++ii].is_empty()) return;

else {

Edit1->Text=ii;

tempp[++ii].save_bmp("temp_save.bmp");

//tempp[ii].display("Aici!!");

Image1->Picture->LoadFromFile("temp_save.bmp");

}}

//–––––––––––––––––––––––––

void __fastcall TForm1::RzToolButton2Click(TObject *Sender)

{

if(ii==0){RzToolButton2->Enabled=false; return; };

ii–;

Edit1->Text=ii;

tempp[ii].save_bmp("temp_save.bmp");

Image1->Picture->LoadFromFile("temp_save.bmp");

}

//–––––––––––––––––––––––––

void __fastcall TForm2:: mReg (TObject *Sender)

{

if(!omogen(a,A1, B1, A2, B2,T) && (A2-A1) > 1 && (B2-B1) >1)

{ imReg(x, y, A1, B1, (A1+A2)/2, (B1+B2)/2, T, N);

imReg(x, y, (A1+A2)/2, B1, A2, (B1+B2)/2, T, N);

imReg(x, y, A1, (B1+B2)/2, (A1+A2)/2, B2 , T,N);

imReg(x, y, (A1+A2)/2, (B1+B2)/2, A2, B2, T, N);

}

else

{ (*N)++; s=0;

for(int i=B1; i<B2; i++)

for(int j =A1; j<A2; j++)

s+ = x[i][j]; s/ =(A2-A1)*(B2-B1);

for(i=B1; i<B2; i++)

for(j=A1; j<A2; j++)

y[i][j] = (unsigned char) s;

}

return (1);

}

int omogen( imagine a, int A1, int B1, int A2, int B2, int T)

{ //dacă e omogen

int max =0, min = Lmax; // nivelul maxim de intensitate

for(int i=B1; i<B2; i++)

for(int j=A1; j< A2; j++)

{

if(x[i][j] < min) min = x[i][j];

if(x[i][j] > max) max = x[i][j];

}

if(max – min < T) return (1);

else return (0);

}

BIBLIOGRAFIE

Perju V. Îndrumări metodice privind elaborarea și perfectarea tezelor de licență și master. Chișinău, ULIM, 2010. Mediateca ULIM. http://inginerie.ulim.md/assets/files/regulamente /Recomandari%20TLM%20Ro%202010.pdf .

Buzuloiu V. Prelucrarea imaginilor: note de curs, Universitatea “Politehnică” București 2000. 176 p. ISBN 9972-9969-8-4.

Castleman K. R. Digital Image Processing, Prentice Hall, Englewood Cliffis, NJ, 220 p. ISBN 5645-2152-6-9.

Condorachi D. – MNT – instrument de analiză morfometrică a reliefului, Lucr. Simpoz. „Sisteme Informaționale Geografice”, Ediția a VII-a/Chișinău 1999, Analele Șt. Univ. „Al. I. Cuza” Iași, tom XLVI, s II c, Geografie – supliment, 2000. 330 p. ISBN 3678-5412-3-3.

Gordan M. Sisteme de analiză a imaginilor digitale folosind clasificatoare mașini cu vectori suport, Casa de Știință, Cluj-Napoca 2006. 196 p. ISBN 689-265-1-7.

Haralick R. M.,Sternberg S. R., Zhuang X. Image Analisys using Mathematical Morphology, in IEEE Trans. On Pattern Analisys and Machine Intelligence. Vol.9. 532-549 p. ISBN 8978-5465-2-6.

Ioan Ispas, Algoritmi de recunoașterea formelor și clasificarea automată a imaginilor, Referat, Univ. Babeș-Bolyai, Facultatea de Matematică-Informatică, Cluj-Napoca, 2003. 1.110 p. ISBN 3123-6589-5-7.

Ioan Ispas. Modelare și modele matematice în recunoașterea obiectelor și clasificarea automată a imaginilor, Univ. Petru Maior, Facultatea de Matematică-Informatică, Tîrgu Mureș, 2003. 1.20 p. ISBN 6579-8974-3-9.

Ioan Ispas. Algoritmi de prelucrare digitală a imaginilor, Referat, Univ. Babeș-Bolyai, Facultatea de Matematică-Informatică, Cluj-Napoca, 2003.

Informație electronică. Concepte fundamentale ale teoriei recunoașterii formelor. Note de curs. Autor necunoscut. Sursa electronică: http://www.google.md/url?sa=t&rct=j &q=&esrc=s&source=web&cd=28&ved=0CGIQFjAHOBQ&url=http%3A%2F%2Fxa.yimg.com%2Fkq%2Fgroups%2F16228215%2F1927657521%2Fname%2Fcurs&ei=0aiWU4CYCurB7AaLpIHADQ&usg=AFQjCNHPKR_O83Q_tWrUqQs8bhb2Jly9Og&sig2=tgwbq3QRnJ_uGyAwpZvjtw&bvm=bv.68445247,d.ZGU;

Informație electronică. Procesarea imaginilor-Laborator N6: Algoritmul de urmărire a conturului. Sursa web: http://users.utcluj.ro/~rdanescu/PI-L6r.pdf;

Florica Moldoveanu. Curs SPG. Sursa web: http://andrei.clubcisco.ro/cursuri/4spg/ Segmentarea%20imaginilor.pdf ;

Florica Moldoveanu. Curs SPG-Subțiere și scheletizare. Sursa web:http://andrei.clubcisco.ro /cursuri/4spg/Subtiere%20si%20scheletizare.pdf;

Informație electronică. Lucrarea nr.7 – Filtrarea Imaginilor. Sursa web http://www.miv.ro /ro/documentatie/pi/PIlab07.pdf

Florica Moldoveanu. Curs SPG – Extragerea conturului unei regiuni. Sursa web: http://ru.scribd.com/doc/228772537/Extragerea-Contururilor-Unei-Regiuni;

Gui V., D. Lacrămă, D. Pescaru “Prelucrarea imaginilor” Ed. “Politehnica”. 1.120 p.

Mihai Bulea, Structuri și algoritmi paraleli pentru prelucrarea imaginilor și recunoașterea formelor. 1.50 p. ISBN 5687-3216-5-9.

Moldoveanu, Fl., Racovita, Z., Petrescu, S., Hera, G., Zaharia, M.: Grafica pe calculator, Editura Teora, Bucuresti,. 280 p. ISBN 5428-5642-1-5.

Novicicov A.N. Rational Rose pentru programatori. http://citforum.ru/programming /application/rrose.shtml (vizitat 24.04.2014).

Orza B.,Vlaicu M., Gordan M., Popa C. Viziunea computerizată în exemple și aplicații practice, U.T. Press, Cluj-Napoca, 2007. 254 p. ISBN 625-382-216-9.

Popescu, D. Achiziția și prelucrarea imaginii, e. ICPE, Bucuresti, 2001. 1.130 p. ISBN 9753-8067-42-1.

Prula Georgeta. Algoritm pentru recunoașterea mișcării într-o segvență video. Revista informatica economică, București.

Pavlidis T., “Algorithms for Graphics and Image Processing”, Computer Science Press. 1.160 p. ISBN 3213-6542-3-5.

The OpenGL graphics system: a specification (version 1.1).

The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.

Tutorial PhotoShop. http://www.photoshoplady.com/photoshop-tutorial/category/photoshop-tutorial/ (vizitat 08.05.2011).

Tutorial PhotoShop. http://www.photoshopstar.com/ (vizitat 09.05.2011).

Vertan, Constantin, Prelucrarea și analiza imaginilor, București, Editura Printech. 1.96 p. ISBN 3321-6985-1-6.

Vlaicu A. Prelucrarea imaginilor digitale, Editura Microinformatica, Cluj-N 1997. 232 p. ISBN 973-601-999-3.

Vlaicu, Aurel, Prelucrarea digitală a imaginilor, Cluj-Napoca, Editura Albastră, 1997. 1.150 p. ISBN 5648-6598-6-5.

Zamperoni P. Image Enhancement, Advances in Imaging and Electron Physies. Vol. 6 Academic Press 1995. 1-77 p. ISBN 7976-9878-6-4.

Visual Introduction in OpenGL, Siggraph’98.

Apxангeльcкий A., Borland C++ Builder 5, Mocква, 2000.

Эдваpд Эйнджeл, Интepактивная кoмпютepная гpафика. Bвoдный кypc на базe Open GL, изд. Bильямc, Mocква, 2001, p.25-50, 55-95, 287-317.

B. Шамиc, Borland C++ Builder 6, Питep, 2003.

Пpoгpаммиpoваниe: oкна и анимация, Miguel Angel Sepulveda, LinuxFocus.

ANEXA A: Listingul programului

#include <vcl.h>

#include "CImg.h"

#include "masks.h"

#include <math.h>

#include "ShellAPI.h"

using namespace cimg_library;

//–––––––––––––––––––––––––

#pragma package(smart_init)

#pragma link "RzButton"

#pragma resource "*.dfm"

TForm1 *Form1;

TPoint gpt_1(0,0);

double gd_width=0, gd_height=0;

void __fastcall TForm1::Exit1Click(TObject *Sender)

{

Form1->Close();

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Open1Click(TObject *Sender)

{

if(Form1->OpenPictureDialog1->Execute())

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

gd_height = Image1->Picture->Height;

gd_width = Image1->Picture->Width;

Image1->Height = Image1->Picture->Height;

Image1->Width = Image1->Picture->Width;

tempp[0].load_bmp(OpenPictureDialog1->FileName.c_str());

tempp[1].load_bmp(OpenPictureDialog1->FileName.c_str());

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Save1Click(TObject *Sender)

{

if(Form1->SavePictureDialog1->Execute())

Image1->Picture->SaveToFile(SavePictureDialog1->FileName);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::SkeletizareClick(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<unsigned char> pic(dx, dy,1,1,0), interf(dx, dy,1,1,0), tmp(dx, dy,1,1,0), chk(dx, dy,1,1,0), img(dx, dy,1,1,0);

int i, j, l,z;

unsigned char p[6], pq;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

if ( pic(i,j)>=150 )

pic(i,j) = 255;

else pic(i,j) = 0;

}

}

while (chk != pic)

{

chk = pic;

tmp.fill(0);

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

for(l=0;l<40;l++)

{

if (((pic(i-1,j-1) == 255*k[l][0][0])&&(pic(i,j-1)== 255*k[l][0][1])&&(pic(i+1,j-1)== 255*k[l][0][2])

&&(pic(i-1,j)== 255*k[l][1][0])&&(pic(i,j)== 255*k[l][1][1])&&(pic(i+1,j)== 255*k[l][1][2])

&&(pic(i-1,j+1)== 255*k[l][2][0])&&(pic(i,j+1)== 255*k[l][2][1])&&(pic(i+1,j+1)== 255*k[l][2][2])) )

tmp(i,j) = 255;

}

}

}

interf.fill(0);

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

for(l=0;l<60;l++)

{

if (((tmp(i-1,j-1) == 255*m[l][0][0])&&(tmp(i,j-1)== 255*m[l][0][1])&&(tmp(i+1,j-1)== 255*m[l][0][2])

&&(tmp(i-1,j)== 255*m[l][1][0])&&(tmp(i,j)== 255*m[l][1][1])&&(tmp(i+1,j)== 255*m[l][1][2])

&&(tmp(i-1,j+1)== 255*m[l][2][0])&&(tmp(i,j+1)== 255*m[l][2][1])&&(tmp(i+1,j+1)== 255*m[l][2][2])) )

interf(i,j) = 255;

}

}

}

img.fill(0);

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

if ( pic(i,j)==255 && ( tmp(i,j)==0 || interf(i,j)==255 ) )

img(i,j) = 255;

}

}

pic = img;

}

for(i=1;i<dx-1;i++)

{

for(j=1;j<dy-1;j++)

{

if(img(i,j)==0 && img(i,j+1)==0 && img(i-1,j)==0 && img(i,j-1)==0 && img(i,j+1)==0 && img(i+1,j)==0&&

(((img(i-1,j+1)==255 && img(i+1,j-1)==0)||(img(i-1,j+1)==0 && img(i+1,j-1)==255))&&

((img(i-1,j-1)==0 && img(i+1,j+1)==255)||(img(i-1,j-1)==255 && img(i+1,j+1)==0))) )

pq=255;

else pq=0;

if((pq==0 && img(i-1,j)==0 && img(i+1,j)==0 && (img(i-1,j-1)==255 || img(i,j-1)==255 || img(i+1,j-1)==255) && (img(i-1,j+1)==255 || img(i,j+1)==255 || img(i+1,j+1)==255))||

(pq==0 && img(i,j+1)==0 && img(i,j-1)==0 && (img(i-1,j-1)==255 || img(i-1,j)==255 || img(i-1,j+1)==255) && (img(i+1,j-1)==255 || img(i+1,j)==255 || img(i+1,j+1)==255))||

(img(i+1,j+1)==255 && img(i,j+1)==0 && img(i+1,j)==0 && (img(i-1,j-1)==255 || img(i-1,j)==255 || img(i,j-1)==255))||

(img(i-1,j+1)==255 && img(i,j+1)==0 && img(i-1,j)==0 && (img(i,j-1)==255 || img(i,j)==255 || img(i+1,j)==255))||

(img(i-1,j-1)==255 && img(i-1,j)==0 && img(i,j-1)==0 && (img(i,j+1)==255 || img(i+1,j+1)==255 || img(i+1,j)==255))||

(img(i+1,j-1)==255 && img(i,j-1)==0 && img(i+1,j)==0 && (img(i,j+1)==255 || img(i-1,j+1)==255 || img(i-1,j)==255)) )

img(i,j)=255;

}

}

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = img(i,j)*65793;

}

}

ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;}

//–––––––––––––––––––––––––

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

gd_height *= 1.1;

gd_width *= 1.1;

Image1->Height = int(gd_height);

Image1->Width = int(gd_width);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)

{

if((Image1->Height >= 20) && (Image1->Width >= 20))

{

gd_height /= 1.1;

gd_width /= 1.1;

Image1->Height = int(gd_height);

Image1->Width = int(gd_width);

}

}

//–––––––––––––––––––––––––

void __fastcall TForm1::MedianClick(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<double> pic(dx, dy,1,1,0), res(dx,dy,1,1,0);

CImg<double> mask(3,3,1,1,0);

int i, j;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

res = pic.blur_median();

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = res(i,j)*65793;

}

}

ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1:: subtiere(TObject *Sender)

{

{// în fiecare ciclu imaginea este parcursă o singură dată;

int I, j, k, l, inreg, tranz, STOP, m, b [9];

do

{

STOP = 1;

for ( k = A1 + 1; k<A2 – 1; k ++ )

for (I = B1 + 1;I< B2 – 1;I++ )

if ( a[k] [I] = = 1 )// pixel in regiune

{ // numara pixelii = 1 din vecinatatea de 3 x 3 (pixeli interiori) inreg = 0;

for ( i = -1; i <=1; i++ )

for ( j = -1; j <=1; j++ )

if ( a[k+i] [l+j] = = 1) inreg++;

if((inreg>2) &&( inreg<8))

{ m = 0;

for (i = -1; i <=1; i++ )

b[m++] = a[k-1][l+i]; b[3] = a[k][l+1];

b[4] = a[k+1][l+1]; b[5] = a[k+1][l];

for ( i = 1, m = 6; i >= -1; i–)

b[m++] = a[k+i][l-1]; tranz = 0;

for ( m=0; m<=7; m++ )

if ( b[m] = = 0 && b[m+1] ==1 ) tranz++;

if ( tranz = =1 ) { a[k][l] = 0; STOP = 0; }

}

}

}

while (!STOP);

}

}

//–––––––––––––––––––––––––

void __fastcall TForm1::ContrastClick(TObject *Sender)

{

Form2->Enabled = true;

Form2->Edit1->Text = Form2->TrackBar1->Position;

Form2->Visible = true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

gpt_1.x = X;

gpt_1.y = Y;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

TPoint pt2;

double dist;

pt2.x = X;

pt2.y = Y;

dist = sqrt( double( (gpt_1.x – pt2.x)*(gpt_1.x – pt2.x) + (gpt_1.y – pt2.y)*(gpt_1.y – pt2.y)));

Edit1->Text =FormatFloat("#.##",dist); //dist;

StatusBar1->SimpleText="Distanta: "+ Edit1->Text;//FloatToStr(dist);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::EdgeDetect1Click(TObject *Sender)

{

int dx = Image1->Picture->Width;

int dy = Image1->Picture->Height;

CImg<double> pic(dx, dy,1,1,0), res(dx,dy,1,1,0);

CImg<double> mask(3,3,1,1,0);

int i, j;

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

pic(i,j) = Image1->Canvas->Pixels[i][j]/65793;

}

}

res = pic.convolve(mask);

for(i=0;i<dx;i++)

{

for(j=0;j<dy;j++)

{

Image1->Canvas->Pixels[i][j] = res(i,j)*65793;

}

} ii++;

Image1->Picture->SaveToFile("tmp.bmp");

tempp[ii].load_bmp("tmp.bmp");

if( RzToolButton2->Enabled==false) RzToolButton2->Enabled=true;

}

//–––––––––––––––––––––––––

void __fastcall TForm1::Help1Click(TObject *Sender)

{

Application->HelpSystem->ShowContextHelp(1,Application->HelpFile);

}

//–––––––––––––––––––––––––

void __fastcall TForm1::RzToolButton3Click(TObject *Sender)

{

if(tempp[++ii].is_empty()) return;

else {

Edit1->Text=ii;

tempp[++ii].save_bmp("temp_save.bmp");

//tempp[ii].display("Aici!!");

Image1->Picture->LoadFromFile("temp_save.bmp");

}}

//–––––––––––––––––––––––––

void __fastcall TForm1::RzToolButton2Click(TObject *Sender)

{

if(ii==0){RzToolButton2->Enabled=false; return; };

ii–;

Edit1->Text=ii;

tempp[ii].save_bmp("temp_save.bmp");

Image1->Picture->LoadFromFile("temp_save.bmp");

}

//–––––––––––––––––––––––––

void __fastcall TForm2:: mReg (TObject *Sender)

{

if(!omogen(a,A1, B1, A2, B2,T) && (A2-A1) > 1 && (B2-B1) >1)

{ imReg(x, y, A1, B1, (A1+A2)/2, (B1+B2)/2, T, N);

imReg(x, y, (A1+A2)/2, B1, A2, (B1+B2)/2, T, N);

imReg(x, y, A1, (B1+B2)/2, (A1+A2)/2, B2 , T,N);

imReg(x, y, (A1+A2)/2, (B1+B2)/2, A2, B2, T, N);

}

else

{ (*N)++; s=0;

for(int i=B1; i<B2; i++)

for(int j =A1; j<A2; j++)

s+ = x[i][j]; s/ =(A2-A1)*(B2-B1);

for(i=B1; i<B2; i++)

for(j=A1; j<A2; j++)

y[i][j] = (unsigned char) s;

}

return (1);

}

int omogen( imagine a, int A1, int B1, int A2, int B2, int T)

{ //dacă e omogen

int max =0, min = Lmax; // nivelul maxim de intensitate

for(int i=B1; i<B2; i++)

for(int j=A1; j< A2; j++)

{

if(x[i][j] < min) min = x[i][j];

if(x[i][j] > max) max = x[i][j];

}

if(max – min < T) return (1);

else return (0);

}

Similar Posts