Tehnici de Prelucrare a Imaginilor In Java
LUCRARE DE LICENȚĂ
Tehnici de prelucrare a imaginilor in Java
Cuprins
Introducere
Proiectul de față are ca scop implementarea unui program de Prelucrarea imaginilor care să poată satisface necesitățile unor aplicații de procesare de nivel mediu a cadrelor statice de imagine.
Programul este o aplicație ce rulează în fereastră sub Windows. El este scris în limbajul Java și are o structură modulară care permite separarea funcțiilor sale esențiale pe grupuri de clase. Aceste secțiuni ale aplicației sunt modulul principal, modulul de procesare și interfața grafică de utilizator.
Modulul principal este modulul de comandă al întregului sistem. El este responsabil de manipularea datelor din fișierele imagine atât la deschidere-citire cât și la salvare. Prin intermediul modulului principal este controlat întreg fluxul de date inclusiv comenzile ce provin de la utilizator prin intermediul interfeței grafice. De asemenea acest modul efectuează la comanda operatorului validarea prelucrării anterior executate astfel încât procesarea următoare să pornească de la rezultatele celei anteriore.
Interfața Grafică de Utilizator (GUI) reprezintă „fața” aplicației și este responsabilă de transmiterea informației vizuale spre operatorul uman și preluarea comenzilor de la acesta prin intermediul meniurilor din fereastra principală și al ferestrelor de dialog. Importanța interfeței grafice este cu atât mai mare în cadrul unui program de prelucrare a imaginilor deoarece obiectul prelucrării și rezultatul ei sunt vizibile direct sub forma imaginilor afișate.
Modulul de prelucrare cuprinde implementarea algoritmilor de prelucrare propriu-ziși sub forma unor clase filtru. Fiecare procesare este un sub-modul separat astfel încât aplicația poate fi ușor îmbogățită cu noi metode de prelucrare de către utilizator. Un caz special îl reprezintă filtrul Custom care este conceput să permită experimentarea de către operatorul uman a unor filtre 33 nestandard.
Capitolele ce urmează sunt gândite sub forma unei documentații care să aibă rolul de a instrui un potențial utilizator al programului atât din punct de vedere al teoriei procesărilor de imagine cât și în ce privește utilizarea efectivă a programului P_im.
Capitolul 1 conține câteva informații despre imagini și despre felul în care se pot realiza principalele transformări geometrice (translația, rotația și scalarea).
Capitolul 2 și 3 cuprind o scurtă prezentare teoretică a principalelor metode de prelucrare a imaginilor punând accentul pe metodele care sunt implementate în aplicația ce face obiectul lucrării de față. Prezentarea este realizată combinând expresiile matematice cu descrierea efectelor procesărilor. Divizarea prezentării în două capitole separate s-a făcut deoarece în program există atât procesări punctuale cât și procesări regionale și globale, astfel încât considerațiile teoretice referitoare la ele corespund unor subdomenii diferite în cadrul prelucrării imaginilor.
Capitolul 4 este destinat prezentării felului în care s-a implementat aplicația în limbajul java. Analiza se face pornind de la aspectele generale ale relației dintre cele trei module componente ale programului. Ulterior sunt descrise pe rând clasele Java implemntate cu datele și metodele lor membre evidențiindu-se rolul fiecăreia în parte. Anumite porțiuni de cod cu mare importanță în program sunt prezentate și comentate pentru a înlesni mai buna înțelegere a funcționării aplicației
Capitolul 5 cuprinde un set de rezultate experimentale demonstrative atât pentru modul recomandat de lucru cu programul P_im cât și pentru felul în care pot fi utilizate procesările individuale sau cum pot fi ele combinate în lanțuri de prelucrare.
În final Capitolul 6 este desinat schițării unor concluzii și prezentării pe scurt a unor posibilități de dezvoltare ulterioară a aplicației P_im astfel încât să îi mărească versatilitatea și eficiența.
Capitolul I Teoria imaginilor
Elaborarea și utilizarea corectă a metodelor de prelucrare numerică a imaginilor presupune înțelegerea procesului de formare și a procesului de digitizare a imaginii. Dacă prelucrarea se adresează observatorului uman, este nevoie, de asemenea, de înțelegerea unor aspecte fundamentale referitoare la percepția vizuală.
I.1. Introducere
Imaginea este rezultatul interacțiunii dintre materie și o anumită formă de radiație. Majoritatea scenelor captate în vederea prelucrării conțin obiecte opace. Imaginea unui asemenea obiect este rezultatul reflexiei radiațiilor luminoase emise de una sau mai multe surse. O parte din fluxul luminos incident este absorbită de obiect, cealaltă parte a fluxului este reflectată. În funcție de modul de reflexie, distingem două tipuri de suprafețe: suprafețe difuze și oglinzi. Suprafețele difuze ideale, numite și suprafețe lambertiene, reflectă lumina uniform în toate direcțiile. Imaginile obținute în asemenea cazuri permit estimarea formei suprafețelor. Prin contrast, oglinzile reflectă lumina într-o singură direcție și pun probleme dificile prelucrării. Multe suprafețe netede, apreciate ca “lucioase”, prezintă un amestec din ambele tipuri de reflectivitate. Petele de lumină formate pe suprafețe lucioase și umbrele ce pot apare pe orice tip de suprafețe trebuiesc evitate pe cât posibil prin tehnici de iluminare atent selectate
Figura 1.1. Iluminare difuză
I.2. Tehnici de iluminare
Ori de câte ori acest lucru nu este imposibil, în aplicații de analiză a imaginilor trebuie utilizată exclusiv lumina artificială, incomparabil mai ușor controlabilă decât sursele de lumină naturală
Iluminarea difuză din Figura 1.1, este adecvată când obiectul analizat prezintă suprafețe regulate și netede ale căror caracteristici sunt importante din punctul de vedere al analizei sau pentru recunoaștere.
Observații: interiorul găurilor este vizibil, contrastul este redus Aplicații: analiza suprafețelor metalice sau lucioase
Iluminarea din fundal ilustrată în Figura 1.2 este utilă în inspecția vizuală automată, în situațiile în care interesează silueta sau conturul obiectului.
Figura 1.2. Iluminare din fundal
Iluminarea laterală exemplificată în Figura 1.3, se pretează la aplicațiile de control automat al calității suprafețelor. Prelucrarea metalelor, industria textilă, industria hârtiei se numără printre potențialii beneficiari. O tehnică de acest gen a fost utilizată la detecția scurgerilor de lichid în centrale nucleare. În prezența lichidului, suprafața rugoasă devine lucioasă și reflectivitatea crește peste pragul de alarmă.
Figura 1.3. Iluminare laterală
Lumina structurată permite estimarea formei suprafețelor în imagini captate în domeniul vizibil, ca o alternativă la soluția camerei ultrasonice sau vederii binoculare. În funcție de specificul problemei, se pot imagina diferite aranjamente. Figura 1.4 ilustrează utilizarea luminii structurate la măsurarea grosimii unui obiect antrenat pe bandă rulantă. Procedeul poate folosi la recunoaștere, când grosimile obiectelor din clase diferite sunt specifice claselor respective. Cele două surse, dispuse simetric față de banda rulantă, generează două fascicule de lumină plane ce se intersectează pe suprafața benzii rulante. Inserția obiectului în zona iluminată determină despicarea liniei luminoase. Cunoscând unghiul diedru 2 dintre cele două plane de lumină, putem determina grosimea h a obiectului în funcție de distanța d și unghiul :
h = d/2tg. (1.2.1)
Figura 1.4. Detecția prezenței obiectului și măsurarea grosimii prin iluminare structurată
Procedura cere calibrarea camerei pentru măsurarea distanței d pe baza imaginii observate de cameră.
Figura 1.5. Estimarea formei suprafețelor prin iluminare cu plane de lumină
Un alt exemplu de iluminare cu plane de lumină este cel din Figura 1.5. Sursa este situată la distanța cunoscută, B, de centrul optic al camerei, orientată în planul orizontal pe o direcție ce face unghiul cunoscut, , cu perpendiculara pe planul de lumină ce trece prin centrul optic, dreapta OL. Distanța D față de dreapta OL, la care se găsește un punct P, situat planul orizontal ce conține centrul optic al camerei, se calculează simplu din relațiile:
= arctg(/d), (1.2.2)
D = B tg(+), (1.2.3)
unde este distanța de la centrul optic la suprafața fotosensibilă a senzorului de imagine și d este deviația orizontală a proiecției punctului P pe planul imagine. Relația se generalizează direct pentru puncte ce nu aparțin planului orizontal menționat. Prin deplasarea sursei pe dreapta OL, se poate explora întreaga imagine pentru reconstituirea tridimensională a scenei.
Explorarea mecanică a imaginii prezintă dezavantajul vitezei de achiziție reduse. O soluție rapidă o constituie proiecția unor structuri luminoase regulate ce acoperă întregul câmp de observație (Figura 1.6). Dezavatajul acestei metode este pierderea de rezoluție. O soluție alternativă pentru obținerea informației de distanță pentru estimarea formei suprafețelor este stereoviziunea. Menționăm, de asemenea, posibilitatea estimării formei suprafețelor direct din imaginea bidimensională, monocromă (“shape from X”) pe baza variației locale a intensității, texturii, sau formei conturului. Deși observatorul uman reușește acest lucru aparent fără nici o dificultate când examinează o poză sau o imagine de televiziune, problema se dovedește redutabilă pentru un sistem de analiză a imaginii.
Figura 1.6. Lumină structurată
Figura 1.7. Proiecția unui punct din lumea reală pe planul imagine
I.3. Proiecția unui punct din lumea reală pe planul imaginii
Ne interesează să stabilim în continuare relația între poziția (nu intensitatea) unui punct din lumea reală, specificată prin vectorul de poziție pr și proiecția lui în planul imagine, pi (Figura 1.7). Din asemănarea triunghiurilor formate în figură se deduce ușor că:
, (1.3.1)
de unde rezultă imediat că:
. (1.3.2)
Similar, se găsește și pentru axa y că:
. (1.3.3)
Ecuațiile (1.3.2) și (1.3.3) ne permit calculul coordonatelor punctului din planul imagine în funcție de coordonatele punctului din lumea reală care l-a generat. Pe de altă parte, zi = 0, independent de coordonatele punctului din lumea reală. Din acest motiv, operația inversă, de reconstituire a coordonatelor punctului din lumea reală în funcție de coordonatele punctului din imagine devine imposibilă. Constatarea nu este deloc surprinzătoare. Este clar că toate punctele situate pe dreapta de proiecție ce unește punctul proiectat cu imaginea sa și trece prin centrul optic se proiectează la aceleași coordonate din planul imagine. Ecuațiile (1.3.2) și (1.3.3), definesc două plane. Considerate ca un sistem, ele definesc intersecția celor două plane care este chiar dreapta menționată mai sus.
I.4. Transformări de bază
Fie un punct P, definit prin vectorul de poziție p = [x y z]T.
Translația lui la o locație oarecare, definită prin vectorul de poziție p*=[x*y*z*]T se poate exprima prin ecuațiile:
x*=x+x0
y*=y+y0 (1.4.1.)
z*=z+z0
Translația este o schimbare de coordonate particulară, numită și transformare de coordonate. Pentru calcule cu transformări de coordonate, este util să exprimăm sistemele de ecuații ce le definesc în formă matricială. În cazul translației, putem scrie:
. (1.4.2)
Această formă prezintă două inconveniente: vectorii de intrare și ieșire nu au aceeași dimensiune și matricea transformării nu este pătrată, ceea ce înseamnă că nu poate fi inversată. Ambele se rezolvă simplu, prin extinderea vectorului de ieșire:
. (1.4.3)
Mai concis,
p* = Tp (1.4.5)
unde T este matricea de translație:
T =. (1.4.6)
Se poate arăta ușor ușor că
T 1 = . (1.4.7)
Scalarea cu factorii de scală sx, sy și sz se exprimă tot printr-o ecuație matricială simplă, de forma (2.9’), în care matricea T este înlocuită cu matricea S:
S = . (1.4.8)
Rotația unui punct în spațiul tridimensional este o operație puțin mai complicată, pentru că ea poate avea loc în jurul oricărui punct,ui punct, respectiv al oricărei drepte ce trece prin acel punct. Operația se poate descompune în trei pași:
translație ce aduce punctul în jurul căruia se face rotația în originea sistemului de coordonate;
rotație în jurul unei drepte oarecare ce trece prin origine;
translație inversă, ce readuce punctul în jurul căruia s-a făcut rotația în poziția lui inițială.
Mai este util să observăm că rotația unui punct în jurul unei drepte oarecare ce trece prin originea sistemului de coordonate se poate realiza prin cel mult două rotații în jurul unora din axele sistemului de coordonate (de exemplu, o rotație în planul orizontal și una în planul vertical). Vom deduce în continuare ecuațiile transformării pentru rotația în planul x-y, în jurul axei z. Fie punctul P, definit de coordonatele (x, y), pe care îl rotim în sens orar. Exprimăm x și y în funcție de coordonatele polare (r,):
x = rcos, (1.4.9)
y = rsin. (1.4.10)
După rotația în sens orar cu unghiul , coordonatele devin:
x* = rcos() = rcoscos + rsinsin, (1.4.11)
y* = rsin() = rsinsin rcoscos. (1.4.12)
Utilizând (1.4.9) și (1.4.10), ultimele două ecuații devin:
x* = xcos + ysin, (1.4.13)
y* = ysin xcos. (1.4.14)
În formă matricială, rotația în jurul axei z, în sens orar, se descrie cu ajutorul matricii:
R = . (1.4.15)
Asemănător se descriu și rotațiile în jurul axelor x și respectiv y:
R = , (1.4.16)
R = . (1.4.17)
Compunerea transformărilor O succesiune de transformări, oricât de complicată, se poate reprezenta cu ajutorul unei singure matrici de transformare 44. De exemplu, succesiunea: translația1, rotația în jurul axei z, rotația în jurul axei y, translația2, urmată de rescalare, se scrie în forma:
p* = S(T2(R(R(T1p)))) = Ap. (1.4.18)
Parantezele pot fi omise datorită proprietății de asociativitate a operației de înmulțire a matricilor. Toate matricile ce intervin în aceste reprezentări au inverse ce pot fi găsite imediat, scriind operațiile de translație sau rotație cu semn schimbat, respectiv rescalarea cu inversul factorilor ce intervin în matricea S din ecuația (1.12). Un ansamblu de n puncte ce aparțin unui singur corp și suferă aceleași transformări, poate fi grupat într-o matrice 4n, P = [p1 p2…pn]T. Transformarea ansamblului punctelor se scrie:
P* = AP. (1.4.19)
Capitolul II. Procesări punctuale în prelucrarea imaginilor
II.1. Generalități despre procesările punctuale
În multe aplicații prelucrarea propriu-zisă a imaginilor necesită o etapă preliminară de preprocesare desinată executării unor corecții. Operațiile din această categorie sunt considerate “simple” (low level) deoarece practic se face o transformare univocă de tipul:
(2.1.1.)
unde r și s sunt nivelele de gri ale pixelilor în imaginile inițială respectiv finală, iar T() este o funcție ce poate fi liniară sau nu, așa cum se arată în Figura 2.1.
b=T(a) A. Negativarea imaginii
B. Accentuarea contrastului
L-1 C. Binarizarea imaginii
A
B
O C
T L-1 a
Figura 2.1. Transformări ale scării de gri
Caracteristica definitorie a acestor prelucrări simple este faptul că atât la intrarea cât și la ieșirea procesului este o imagine. Se poate de asemenea constată că valoarea pixelului din imaginea de ieșire este dependentă exclusiv de caracteristicile pixelului corespondent din imaginea de intrare. Din acest motiv operatorii de acest tip sunt adesea numiți Transformări ale scării de gri.
Un alt tip de transformări punctuale uzitat sunt operațiile matematice cu imagini. Se consideră două imagini de dimensiune NN:
a={a(m,n);0m,nN-1} și b={b(m,n);0m,nN-1}.
Se definesc:
Imaginea sumă: c={c(m,n)=a(m,n)+b(m,n);0m,nN-1};
Imaginea diferență: d={d(m,n)=a(m,n)-b(m,n);0m,nN-1};
Imaginea scalată: f={f(m,n)=Ka(m,n); 0m,nN-1}.
II.1.1. Procesări punctuale dependente de poziție
Exemplele prezentate în Figura 2.1. corespund situației în care procesarea unui pixel ține cont doar de nivelul său de gri. O situație mai generală este însă aceea în care valoarea finală este influențată și de poziția pixelului. Un asemenea caz se întâlnește la corecțiile aplicate în vederea eliminării erorilor sistematice cum sunt cele datorate neliniarității lentilelor și a dispozitivelor videocaptoare. În teledetecție imaginile provenite de la sateliți și avioanele de mare înălțime sunt afectate de asemenea erori, ceea ce are un efect dezastruos asupra unei calității esențiale în acest domeniu, precizia detaliilor.
Eliminarea acestor erori presupune modelarea matematică a procesului de degradare. Pentru simplitate în această discuție se neglijează zgomotul aditiv. Rezultă deci ecuația:
(2.1.1.)
unde a’(m,n) este imaginea distorsionată, a(m,n) este imaginea ideală iar (m,n) descrie funcția de transfer a sistemului ce introduce degradarea. Funcția (m,n) este în esență un tabel ce are dimensiunile imaginii și cuprinde coeficienții multiplicativi de eroare.
Determinarea funcției (m,n) se face prin calibrarea pe o imagine cunoscută, de obicei o miră sau pur și simplu un cadru cu toți pixelii s(m,n) având nuanța de gri constantă c. Prin urmare, din imaginea rezultată la calibrare ac(m,n) introdusă in ecuația (2.1.1.) se obține:
(2.1.2.)
și atâta vreme cât condițiile în care s-a executat operația de calibrare rămân neschimbate se poate obține imaginea corectată cu ajutorul unei procesări simple descrisă de formula:
(2.1.3.)
Prin urmare procedura de corecție bazată pe transformarea scării de gri dependentă de poziție se poate structura sub forma unei succesiuni de etape după cum urmează:
stabilirea unei mire de calibrare;
determinarea funcției de eroare în baza relației (2.1.2.);
crearea unui “tabel de căutare”(Look-up Table) cu coeficienții multiplicativi de eroare (m,n);
captarea imaginii obiectului de studiu;
aplicarea corecției conform ecuației (2.1.3.).
În situațiile reale invarianța condițiilor este greu de realizat, dar efectuarea calibrării în momentul imediat premergător captării imaginilor de interes este o soluție care asigură o precizie bună.
II.1.2. Procesări punctuale independente de poziție
Tehnologiile actuale produc imagini cu caracteristici extrem de variate. De pildă între imagistica medicală pe de o parte și cea provenită de la sondele spațiale există deosebiri fundamentale începând de la structura informației cuprinse și terminând cu gama dinamică a valorii pixelilor.
În consecință se recomandă “rețete” specifice de procesare pentru fiecare tip de imagine și fiecare tip de schimbare dorită. Adică, există o mare varietate de transformări ale scării de gri și în plus este o practica frecvență folosirea unor combinații care încearcă să cumuleze avantajele diverselor metode sau să compenseze anumite deficiențe. În lucrarea de față sunt prezentate câteva procesări cu aplicații în teledetecție:
accentuarea contrastului;
compresia gamei dinamice;
fereastra de gri;
pseudocolorarea;
b=T(a)
T(L-1)
T(LM) T3
T2
T(Lm) T1
O Lm LM L-1 a
Figura 2.2. Accentuarea contrastului
II.1.2.1. Accentuarea contrastului
Accentuarea contrastului este bazată pe mărirea gamei dinamice a porțiunii de interes a scării de gri și comprimarea restului astfel încât să se păstreze același număr L de nivele de gri din imaginea inițială.
Operația se poate face utilizând o funcție de transfer de tipul celei prezentate în Figura 3.1.b. sau o variantă simplificată obținută prin aproximarea pe porțiuni cu segmente de dreaptă așa cum se arată în Figura 3.2.
Funcția de transfer T se poate scrie sub forma:
(3.1.4.)
b=T(a)
L-1
O T L-1 a
Figura 2.3. Binarizarea unei imagini cu L-1 nuanțe de gri
unde T2 este funcția de transfer a zonei unde diferențele dintre nuanțe sunt accentuate cu factorul iar T1 și T3 sunt funcții de compresie cu coeficienții și respectiv .
Binarizarea imaginilor, adică transformarea intr-o imagine cu numai doua nuanțe, este un caz particular obținut prin modificarea pantelor transformărilor Ti în expresia (2.1.4.).
Rezultă:
(2.1.5.)
unde T(Lm) și T(LM) sunt 0 și L-1 adică negru și alb, iar P este pragul de binarizare. Reprezentarea grafică este cea din Figura 3.3.
II.1.2.2. Compresia gamei dinamice
s=T(r)
L-1
O R-1 r
Figura 2.4. Compresia imaginilor
Uneori gama dinamică a unei imagini depășește capacitatea dispozitivului de afișaj de a o reproduce corect. În acest caz rămâne vizibilă doar partea cea mai strălucitoare a imaginii. Pentru a corecta această deficiență se utilizează în prealabil o compresie a imaginii afișate după o funcție logaritmică de forma:
(2.1.6.)
unde c este o constantă de scară. În urma transformării detaliile devin mult mai vizibile. Funcția de transfer a fost reprezentată în Figura 2.4.
Imaginea inițială are R nuanțe, cea finală trebuie să aibă L-1 și prin urmare înlocuind in (2.3.3.) se obține expresia constantei de scală c:
(2.1.7.)
astfel încât să se poată exploata la maximum capacitatea display-ului de a afișa cele L-1 nivele de gri.
II.1.2.3. Fereastra de gri
Fereastra de gri face evidențierea unei anumite porțiuni din gama de nuanțe de gri a imaginii. Acest procedeu este utilizat pentru a creste vizibilitatea unor anumite detalii fine, ce se diferențiază slab de fundalul local.
s=T(r)
L-1
kLM
kLm
F
O Lm LM L-1 r
Figura 2.5. Fereastra de gri
În esență, se poate spune că procedeul de față este mai radical decât accentuarea contrastului deoarece el păstrează sau accentuează contrastul în interiorul ferestrei eliminând restul.
În Figura 2.5. este prezentată o caracteristică de transfer tipică pentru procedura în discuție. Se poate observa că porțiunea de interes (Lm , LM) este accentuată, restul gamei (0 , Lm)(LM , L-1) fiind transformată intr-un fondal uniform. Expresia matematică a unei astfel de transformări este:
(2.1.8.)
unde k este coeficientul de accentuare a contrastului în interiorul ferestrei, iar F este o nuanță oarecare ce se atribuie pentru toate gri-urile din afara ferestrei.
Tehnici de tipul fereastră de gri sunt aplicate în analiza imaginilor multispectrale provenite de la sateliții geostaționari sau sondele spațiale interplanetare.
II.1.2.4. Pseudocolorarea
Pseudocolorarea este procedeul de punere în evidență a unor detalii fine greu de distins în imaginile alb-negru prin atribuirea unor culori puternic contrastante nuanțelor de gri apropiate.
Explicația creșterii gradului de vizibilitate este dată de fiziologia ochiului uman care are capacitatea de a distinge pe un monitor TV aproximativ 50…60 de nuanțe de culoare și doar 15…20 de nuanțe de gri.
Există mai multe modalități de realizare a corespondentei biunivoce dintre culori și nuanțele de gri. Între acestea cea mai uzitată este tăierea după densitate (eng. density slicing) în care atribuirea culorilor este funcție de luminozitatea fiecărei nuanțe de gri.
În fapt se introduce un număr n de praguri Pi de separație și se alocă fiecărei ferestre dintre doua praguri o anumită culoare respectându-se cerința ca fiecare doua culori vecine să fie puternic contrastante. Caracteristica de transfer este prin urmare o funcție “scară” de tipul:
(2.1.9.)
Pentru a acoperi întreaga gama de nuanțe de gri se consideră P0=0 (negru) și PN-1=L-1 (albul cel mai strălucitor).
O altă metodă simplă și eficientă este împătrirea biților componenți ai codului binar al nuanței de gri b0 b1 …bK-1 în trei grupe corespunzând componentelor R,G și B după cum urmează:
(2.1.10.)
Rezultă câte o culoare separată pentru fiecare gri și prin urmare creste gradul de observabilitate al detaliilor pentru ansamblul imaginilor.
Pentru oricare din tehnicile prezentate în această secțiune programul de prelucrare trebuie deci să parcurgă următoarele etape:
alegerea funcției de transfer optime;
calculul valorilor ordonatei corespunzătoare fiecărei abscise;
crearea tabelului de căutare T cu valorile găsite la punctul anterior;
crearea imaginii de ieșire Io
fiecărui pixel din Io i se atribuie valoarea corespunzătoare din T.
II.2. Procesarea histogramelor
Histograma unei imagini digitale A={a(m,n);0m,nN-1} este o funcție discretă h(i)=ni, unde, așa cum se arată în Figura 2.6, prin Li se notează nivelele de gri în ordine crescătoare de la 0 (negru) la LM-1 (albul cel mai strălucitor), iar ni este numărul de pixeli din imagine având nivelul i. În consecință se poate considera histograma unei imagini ca fiind statistica frecvenței de apariție a nuanțelor de gri.
n
ni
0 Li LM-1 L
Figura 2.6. Histograma unei imagini
Histogramele pun în evidență o serie de caracteristici ale imaginilor:
Histogramele având majoritatea pixelilor în porțiunea apropiată de negru corespund unor imagini întunecate, iar cele cu majoritatea spre alb unor imagini luminoase;
Histogramele cu valori nenule concentrate pe o porțiune relativ restrânsă a gamei de gri-uri corespund unor imagini cu contrast slab, iar cele cu valorile nenule distribuite în toată gama corespund unor imagini cu contrast puternic;
Histogramele unor imagini simple (unul sau mai multe obiecte de culoare uniformă pe un fond de asemenea uniform de culoare net diferită) au doua maxime (unul pentru fondal și unul pentru obiect) și un minim pronunțat intre ele;
Histogramele unor imagini complexe (multe obiecte de nuanțe diferite, figuri umane, etc.) au forme mai neregulate.
Prin urmare, manipularea formei histogramelor cu efectuarea modificărilor corespunzătoare în imaginile aferente poate produce o schimbare notabilă în structura informației cuprinse în acestea. Prin mărirea gamei dinamice este posibilă o creștere uneori substanțială a contrastului și a vizibilității unor detalii anterior greu observabile în imagine. În literatură sunt prezentate doua procedee de procesare:
Egalizarea histogramelor;
Aducerea histogramelor la o formă prespecificată.
În practică, prima metodă, mai simplă, este des folosită și are la rândul ei câteva variante alternative de aplicare.
II.2.1.Egalizarea histogramelor
Se consideră o imagine inițială A={a(m,n);0m,nN-1} având L nivele de gri ai cu probabilitățile p(ai) determinate cu relația:
i=0,1,…L-1 (2.2.1.)
unde h(i) este numărul de pixeli din imagine cu nivelul de gri ai din histograma inițială.
În [HLA 93] se demonstrează că prin egalizare se obține o imagine A’={a’(m,n);0m,nN-1} care are L’<L nivele de gri cu frecvențele de apariție h'(i).
Procedura începe prin calculul valorii de egalizare a histogramei:
h’(i)=mn/L’ = constant (2.2.2.)
Se caută apoi k1Z astfel încât :
(2.2.3.)
apoi se determină k2Z care satisface condiția:
(2.2.4.)
și procesul continuă până la kL’-1. Tuturor pixelilor cu nivele de gri ai, cu ik1 li se atribuie la ieșire nivelul a’1, pentru pixelii cu nivele ai, k1ik2, a’2 și procedura continuă similar până la epuizarea celor M nivele de intrare. Rezultă o transformare univocă.
Pe baza corespondentelor stabilite se realizează un tabel de căutare T, care în mod similar cu procedura descrisă în paragraful anterior, servește la o execuție rapidă a transformării imaginii A în imaginea A’ așa cum se arată în Figura 2.7.
A A’=T(A)
P0
a0 a0’
a1
P1 a2 a1’
P2 a3
a4 a2’
P3 a5
: :
: :
Figura 2.7. Transformarea univocă A’=T(A)
Histograma h’(i) obținută nu este de valoare riguros constantă deoarece histograma inițială h(i) este o funcție discontinua, dar acest fapt nu afectează creșterea contrastului imaginii și implicit a vizibilității unor detalii fine în ea.
Există posibilitatea utilizării histogramelor locale determinate pe blocuri de imagine de dimensiune KK; K<N, de obicei parțial suprapuse. Pentru reducerea calculelor în cazul suprapunerilor se refolosesc rezultatele obținute la procesarea blocului anterior .
Procedura prezintă avantajul îmbunătățirii contrastului în fiecare parte a imaginii, ceea ce permite scoaterea în evidență a unor regiuni de arie redusă care nu pot influența histograma de ansamblu, dar devin importante ca pondere în histogramele locale.
O tehnică relativ înrudită este modificarea contrastului prin filtrarea statistică. Imaginea filtrată A’ se obține din A cu transformarea:
a’(m,n)=C(m,n)| a(m,n)-M(m,n)|+M(m,n) (2.2.5.)
în care M(m,n) este media într-o vecinătate V a pixelului de coordonate (m,n) și C(m,n) un factor de amplificare dat de relația :
(2.2.6.)
cu M media globală a imaginii, v(m,n) dispersia pixelilor a(m,n) din vecinătatea V și K(0,1) o constantă de scalare ce permite controlul asupra gradului de accentuare a contrastului locală
Analizând (2.2.6.) se observă că în zonele relativ omogene (regiunile imaginii având dispersia v(m,n) mic) amplificarea creste foarte mult. Pentru evitarea distorsiunilor se impune limitarea ale gamei de variație a coeficientului de amplificare:
(2.2.7.)
În consecință algoritmul de lucru în procesul de egalizare a histogramelor unei imagini este:
calculul amplitudinii histogramei egalizate cu relația;
definirea transformării univoce;
alcătuirea tabelului de corespondență;
efectuarea transformării propriu-zise.
Dacă s-a optat pentru egalizarea pe blocuri parțial suprapuse de imagine, atunci primele doua dintre etapele prezentate mai sus trebuie parcurse pentru fiecare bloc de imagine în parte și ulterior pornind de la transformatele locale se definește și se execută transformarea pe ansamblul imaginii.
II.2.2. Aducerea unei histograme la o formă prespecificată
Modificarea unei histograme inițiale h1(i) într-o formă “tipar” h2(i) prespecificată este în fapt generalizarea procedeului de egalizare prezentat anterior. Modalitatea cea mai simplă de implementare se bazează pe algoritmul de egalizare anterior discutat. Se uniformizează histograma originală h1(i) prin intermediul transformatei T1:
(2.2.8.)
Se aplică aceiași procedură histogramei h2(i):
(2.2.9.)
Apoi pornind de la ipoteza că cele doua histograme egalizate h1’(i) și h2’(i) sunt identice se poate scrie că:
(2.2.10.)
în care T2-1 este inversă funcției de uniformizare a histogramei h2’(i). Deci în doua etape succesive de transformare histograma este adusă la o formă ce aproximează tiparul inițial stabilit. Această aproximare este cu atât mai bună cu cât egalizările sunt mai aproape de ideal.
În consecință algoritmul de lucru în procesul de egalizare a histogramelor unei imagini este:
egalizarea histogramei inițiale;
egalizarea histogramei tipar;
definirea transformării univoce între cele doua forme;
alcătuirea tabelului de corespondență;
efectuarea transformării propriu-zise
Deși procedurile descrise în acest paragraf au efecte uneori salutare în ce privește creșterea contrastului și implicit a vizibilității detaliilor în imagini, trebuie precizat că nu este recomandabilă utilizarea lor ca preprocesări în cazul unor imagini în care se dorește efectuarea ulterioară a unor măsurători de distanțe, arii, granulații etc. Modificarea histogramelor aduce cu sine modificarea necontrolabilă a valorii pixelilor și prin urmare posibile erori suplimentare.
Prin urmare, în programele destinate preprocesării imaginilor de teledetecție, aplicabilitatea procesării histogramelor este limitată la acele cazuri în care scopul final este o decizie calitativă (recunoașterea unor obiecte), fiind în schimb evitată în situațiile ce presupun determinări cantitative.
Capitolul III. Procesări regionale în prelucrarea imaginilor
III.1. Reducerea zgomotului în imagini
În cele ce urmează sunt considerate zgomote toate perturbații exterioare care se suprapun în mod nedorit peste imaginea procesată. Zgomotele apar în principal în procesul de preluare și transmisie a imaginilor având proveniențe și moduri de manifestare variate. Prin urmare alegerea tehnicilor de reducere sau eliminare a lor trebuie făcută ținând cont atât de caracteristicile imaginilor, cât și de felul perturbației. Selecția se face în principal între tehnicile de filtrare a zgomotelor în domeniul timp, spațiu și frecvență.
Netezirea temporală presupune existența unui set de N imagini succesive ale aceluiași cadru perturbate de un semnal cu caracter aleator. Dacă nu se dispune decât de o singura imagine, atunci se aplică tehnicile spațiale bazate pe înlocuirea valorii alterate cu o valoare estimată pe baza valorii vecinilor. În sfarsit, dacă zgomotul este cuprins într-o bandă de frecvență cunoscută se poate aplica unei transformate a imaginii o filtrare de tipul trece jos sau oprește banda.
În acest paragraf vor fi tratate primele doua grupuri de metode urmând ca procedurile de filtrare în domeniul transformat să fie expuse ulterior.
III.1.1. Medierea în timp
Se presupune o situație în care zgomotul i(m,n) suprapus peste pixelii ai(m,n) ai imaginilor succesive Ai cu i{1,2,3,…N} este o variabilă aleatoare independentă cu media nulă și deviația standard . Medierea temporală se realizează utilizând relația:
(3.1.1.)
Rezultatul medierii temporale în locația (m,n) este:
(3.1.2.)
unde cel de-al doilea termen este în fapt tot un zgomot cu valoare aleatoare independentă de conținutul imaginilor ai cu media zero, dar cu dispersia redusă la valoarea:
(3.1.3.)
Deci medierea temporală permite obținerea unei imagini netezite, adică având zgomotul atenuat, fără reducerea clarității inițiale prin parcurgerea următoarelor etape:
se selectează setul de imagini pentru netezire;
se calculează nivelele de gri ale pixelilor imaginii netezite;
se afișează rezultatul filtrării.
În cazul teledetecției imaginile sunt de obicei preluate de pe platforme mobile (avioane, sateliți, etc.) și deci pentru imaginile utilizate la netezirea temporală trebuie avută în vedere compensarea mișcării. Modalitatea cea mai simplă de aplicare a metodei este utilizarea porțiunii comune a unor cadre consecutive.
III.1.2. Tehnici spațiale de reducere a zgomotului
În cazul în care nu se dispune de mai multe imagini ale aceluiași cadru, cea mai simplă soluție este netezire spațială. Nivelul de gri final al fiecărui pixel depinde printr-o relație liniară de nivelul său inițial de gri și de cel al vecinilor săi. Aceste tehnici se implementează practic prin convoluționarea imaginii cu o matrice numită ,,mască spațială".
III.1.2.1. Netezirea spațială
Cea mai simplă metodă de reducere a zgomotului în cazul de față este medierea în interiorul vecinătății pixelului procesat. Fiecare pixel este înlocuit cu media valorilor pixelilor vecini. Există doua variante de lucru: medierea octo-vecinilor sau doar a cadro-vecinilor, celor două corespunzându-le următoarele măști de convoluție:
(3.1.4.)
(3.1.5.)
Matricile pătrate de dimensiune 33 sunt cele mai des utilizate în practică.
Expresia matematică principială a procedurii este prin urmare:
(3.1.6.)
unde a(k,l) și b(m,n) reprezintă nivelul de gri la intrare și respectiv la ieșire al pixelului procesat, iar V este vecinătatea de N pixeli centrată pe aceasta. În mod evident, abaterea de la media locală a unor pixeli afectați de zgomot va fi micșorată cu condiția ca numărul pixelilor perturbații din vecinătatea V considerată să fie mic în comparație cu N.
Netezirea efectuată cu ajutorul măștilor spațiale este utilă în eliminarea zgomotului sub formă de impulsuri. Creșterea densității pixelilor perturbați ar implica, în cazul netezirii, creșterea lui N. Acest fapt are însă, ca rezultat nedorit, reducerea clarității imaginii filtrate, ceea ce produce dificultăți suplimentare în etapele ulterioare de procesare (detecție contur, segmentare, măsurători, recunoaștere de forme etc.).
O primă modalitate de reducere a acestui efect numit de mânjire (eng. blurring) este ponderarea pixelilor mediați funcție de distanța față de centrul vecinătății.
(3.1.7.)
unde c(m,n) sunt coeficienții cu care se face ponderarea pixelilor a(m,n) din V. Valorile acestor coeficienți respectă în general o anumită distribuție spațială, cel mai adesea fiind utilizată distribuția gaussiană. Filtrul astfel structurat este cunoscut sub denumirea de Filtru gaussian.
Filtrul de netezire cu prag este o variantă îmbunătățită utilizată în practica curentă. Specificitatea sa constă în faptul că înlocuirea pixelului procesat cu media ponderată a vecinilor săi se face doar dacă este satisfăcută condiția:
(3.1.8.)
unde T este un prag de decizie stabilit astfel încât să fie protejate tranzițiile din imaginea originală de efectul de ,,mânjire". Rezultatele aplicării acestei metode sunt foarte bune, dar apare problema delicată a automatizării selecției pragului T.
O procedură mai complexa, dar care păstrează mult mai bine contururile este medierea în vecinătatea cu dispersie minimă dintre cele N vecinătăți direcționale V(i) definite similar cu cele exemplificate în Figura 3.1. și cu N{2,4,8}unde cu gri s-a marcat pixelul supus prelucrării.
Figura 3.1. Vecinătăți direcționale V(i)
Calculul dispersiei celor k pixeli din V(i), (i) se face cu relația:
(3.3.9.)
iar setul de valori posibile ale pixelului sunt:
i=1,2,…N (3.1.10.)
unde vecinătatea V(i) este formată din pixelii din V aflați pe direcția i față de pixelul central sau apropiată de aceasta.
După efectuarea calculelor pentru toate cele N direcții i considerate, valoarea pixelului b(m,n) se adoptă conform relației:
(3.1.11)
III.1.2.2. Filtrul median
Rezultate foarte bune se obțin în cazul zgomotului binar (de exemplu zgomotul de tip "sare și piper") prin utilizarea filtrului median care înlocuiește pixelul prelucrat cu mediana valorilor vecinilor săi din V:
b(m,n)=Median{a(m,n); (m,n)V} (3.1.12.)
Măștile utilizate pot fi pătrate (în general 33, 55 sau 77), ori dreptunghiulare (31 sau 51), caz în care filtrarea denumită pseudo-mediana se execută în doi pași, întâi pe orizontală și apoi pe verticală imaginii rezultate după prima procesare. Numărul de operații este considerabil redus în comparație cu prelucrarea inițială.
Analizând cele expuse anterior se poate concluziona că operatorul median este neliniar. El are avantajul de a nu afecta muchiile, dar trebuie utilizat cu discernământ deoarece poate elimina punctele izolate și liniile subțiri.
Deși filtrul median are în general performante net superioare netezirii, rezultatele sale sunt destul de modeste în cazul zgomotelor cu distribuție gaussiana. În acest caz filtrul de netezire gaussian este de preferat.
Algoritmul general de lucru în cazul filtrelor tip mască spațială utilizate la reducerea zgomotelor în imagini este:
se afișează imaginea originală;
se selectează vecinătatea în care se face netezirea;
se calculează varianta netezită;
se efectuează teste asupra noii valori dacă este cazul;
se afișează rezultatul filtrării.
Modalitatea cea mai sofisticată de eliminare a zgomotelor este utilizarea tehnicilor adaptive. Acestea permit ajustarea operatorilor în cursul procesării funcție de variațiile locale ale parametrilor statistici ai imaginilor. Alegerea metodei optime este dictată de caracteristicile extrase din analiza estimărilor statistice ale zgomotului, respectiv imaginii.
Un caz aparte îl formează imaginile perturbate de zgomote cu caracter mixt:
b(m,n)=a(m,n)z1(m,n)+z2(m,n) (3.1.13.)
unde z1(m,n) și z2(m,n) reprezintă componentele multiplicativă și respectiv aditivă ale perturbației ce afectează imaginea a(m,n).
Asemenea situații presupun utilizarea unor algoritmi foarte laborioși din categoria celor ce se folosesc pentru refacerea imaginilor. Bibliografia etc. recomandă filtrările de tip Wiener, Optomask, Cosar și altele.
Rezultatele acestor procesări sunt extrem de performante, dar presupun fie o serie de cunoștințe apriorice despre imaginea prelucrată și despre natura perturbației, fie estimarea unor modele statistice ale imaginii și zgomotului.
III.2. Detecția contururilor
O etapă esențială în majoritatea proceselor de segmentare bazate pe detecția discontinuităților este determinarea muchiilor reprezentând grupuri de pixeli aflați în zona de tranziție (variație bruscă a nivelului de gri) dintre doua regiuni relativ uniforme ale imaginii inițiale. Muchiile sunt granița de separație fie între obiecte și fundal, fie între doua zone omogene ale aceluiași obiect. O asemenea muchie este formată din puncte și segmente de dreaptă.
Din punct de vedere practic un punct în imagine reprezintă un pixel sau un grup mic și omogen de pixeli conecși având o valoare net diferită de vecinătatea înconjurătoare. Detecția lor se face prin comparație între nivelul de gri propriu și media sau mediana nivelelor de gri din vecinătatea care ii cuprinde.
Segmentul de linie într-o imagine se poate defini ca fiind o grupare omogenă de pixeli învecinați ce alcătuiesc împreună un obiect cvasi-unidimensional. Un asemenea segment este determinat fie prin coordonatele pixelilor din capete în planul imaginii, fie prin coordonatele unei extremități considerată origine, lungimea segmentului și panta sa (unghiul față de o direcție de referința).
Deoarece pixelii aparținători muchiilor se caracterizează prin aceea că se află pe hotarul între doua regiuni omogene ce diferă între ele printr-o anumită proprietate (exemplu: nivelul de gri), detecția lor se face cu operatori de tipul gradienților (operatori de derivare locală).
pe direcția EV (3.2.1.)
pe direcția NS (3.2.2.)
Rezultă vectorul gradient g(m,n) cu modulul și direcția date de relațiile:
(3.2.3.)
(3.2.4.)
Uneori, pentru simplificarea algoritmului pe calculator, se optează pentru:
(3.2.5.)
Implementarea filtrelor de derivare se face prin convoluția imaginilor cu matrici numite măști spațiale. Spre exemplu gradienții din (3.1.4.) și (3.1.5.) se aplică prin convoluția cu:
(3.2.6.)
E-V N-S
Un pixel este declarat ca "punct de frontieră” dacă g(m,n) depășește un prag P. Celor care depășesc acest prag li se alocă în imaginea finală valoarea C, iar celorlalte valoarea F<C. Metoda prezentată mai sus este aplicabilă în cazul tuturor operatorilor locali de tip mască spațială.Dacă se iau în considerare și pantele la 45, detecția se face cu operatori de derivare locală direcționali de forma:
E-V N-S (3.2.7.)
NE-SV NV-SE
Evident, aceste matrici se aplică separat imaginii inițiale, iar în final se însumează rezultatele pentru a obține o imagine care să cuprindă toate segmentele de dreaptă detectate, indiferent de înclinația lor față de direcția de referința.
O tehnică foarte des utilizată este filtrarea Laplace corespunzătoare operatorului Laplacian:
(3.2.8.)
implementat în tehnica digitală prin convoluționarea imaginii de prelucrat cu una din măștile spațiale:
(3.2.9.)
f”(x) f’(x) f”(x)
0 x
0 x 0 x
Figura 3.2.Tranziția și derivatele sale
Fiind o derivată de ordinul al II-lea, Laplacianul este foarte sensibil la zgomote, iar rezultatul lui duce la muchii duble, ceea ce produce o serie de dificultăți ulterioare suplimentare. Acest ultim dezavantaj se elimină dacă se considera ca punct de contur, nu cel unde au rezultat maxime sau minime ale Laplacian-ului, ci trecerile prin 0 așa cum se arată în Figura 4.2.
Alți operatori frecvent folosiți sunt:
Roberts (3.2.10)
Prewitt (3.2.11.)
Sobel (3.2.12.)
Kirsch (3.2.13.)
Izotropic (3.2.14.)
Măsurarea gradientului într-un număr de direcții posibile se face cu operatori compas gk(m,n) :
N NV V SV (3.2.15.)
S SE E NE
Gradientul în locația (m,n) este prin definiție:
(3.2.16.)
Pentru rezoluții unghiulare mai mari se pot utiliza operatori de tip compas de dimensiuni mai mari de 33. Filtrele prezentate se pretează la obținerea prin rotație a unui set de patru, opt sau mai multe măști sensibile la orientarea muchiei.
Toate aceste tehnici se dovedesc a fi sensibile la zgomot și, prin urmare, pentru imagini afectate de zgomot sunt necesare soluții diferite. O asemenea prelucrare este diferența de gaussieni care reprezintă scăderea între ele a doua imagini inițial procesate cu filtre Gauss de dimensiuni diferite.
Se pot de asemenea aplica algoritmi complecși care fac o estimare a valorilor de o parte și alta a muchiei și, prin urmare, un pixel este declarat ca "punct de graniță” doar dacă vecinii săi satisfac aceste estimări. În consecință algoritmul de lucru în procesul de egalizare a histogramelor unei imagini este:
se alege nivelul C pentru punctele aparținând conturului și F pentru restul punctelor;
se afișează imaginea originală;
se calculează amplitudinea derivatei locale cu o relație dintre cele anterior prezentate;
se testează valoarea derivatei față de un prag P;
se afișează rezultatul filtrării.
III.3. Tehnici de segmentare a imaginilor bazate pe detecția contururilor
Segmentarea reprezintă o categorie de tehnici de prelucrare a imaginilor care permite extragerea din contextul imaginii a unor elemente de interes în scopul analizei lor ulterioare și, eventual, al recunoașterii (clasificării) lor. Există doua strategii majore aplicate în cadrul procesului de segmentare :
Detecția discontinuităților: Se depistează zonele de variații bruște (muchii) și prin unirea lor se construiește conturul obiectului ce trebuie delimitat.
Detecția regiunilor omogene: Se depistează zonele uniforme și, prin analiza lor, se obține porțiunea din imagine corespunzătoare ocupată de obiectul cercetat.
În primă categorie se includ tehnicile care se bazează pe detecția tranzițiilor în imaginile originale sau în replicile prelucrate ale acestora. Aceste metode sunt însă sensibile la zgomot, iar în cazul în care obiectele din imagine se ating sau se suprapun parțial, rezultatele nu pot în general să servească pentru o analiză sau o interpretare corectă a scenei.
Grupul tehnicilor bazate pe detecția regiunilor omogene cuprinde o diversitate mai mare de metode cu grade de complexitate diferite de la segmentarea cu prag la segmentarea pe baza texturilor. Exactitatea rezultatelor procesării este în general mai puțin afectată de zgomot, dar problema suprapunerilor este și în cazul acestor tehnici o sursă de dificultăți suplimentare.
În aplicațiile de teledetecție ambele tehnici sunt folosite, alegerea făcându-se funcție de nivelul de zgomot din imagine și de rezultatele ce se doresc a fi obținute la finalul procesării.
III.3.1. Segmentarea imaginilor prin detecția contururilor
O etapă esențială în majoritatea proceselor de segmentare bazate pe detecția discontinuităților este reprezentată de determinarea muchiilor reprezentând grupuri de pixeli aflați în zona de tranziție (variație bruscă a nivelului de gri) dintre doua regiuni relativ uniforme ale imaginii inițiale. Muchiile sunt granița de separație fie între obiecte și fundal, fie între doua zone omogene ale aceluiași obiect. În ambele cazuri, structura lor este importantă pentru o analiză ulterioară sau pentru recunoașterea formelor.
Deoarece pixelii aparținători muchiilor se caracterizează prin aceea că se află pe hotarul între doua regiuni net diferite, detecția lor se face cu operatori de tipul gradienților (operatori de derivare locală) de tipul celor prezentați anterior.
Conturul este reuniunea muchiilor ce separă un obiect de spațiul înconjurător și reprezintă forma obiectului (sau a proiecției obiectului în planul imaginii). Determinarea conturului depinde prin urmare nu numai de corectitudinea detecției muchiilor, ci, în mod esențial, de conectarea lor intr-o frontieră continuă.
Metoda clasică de conectare a muchiilor într-un contur este transformarea Hough care face corespondența între spațiul coordonatelor carteziene (x,y) și cel al coordonatelor polare (s,). O linie se poate reprezenta printr-o ecuație de forma:
(3.3.1.)
unde (x,y) sunt abscisă și ordonată într-un sistem de axe cartezian, iar (s, ) sunt distanța de la origine la linie, și respectiv orientarea. Prin urmare, în planul (s,) linia devine un simplu punct. Se contorizează numărul de pixeli care corespund fiecăreia din direcțiile prestabilite ck(s,). Detecția liniilor drepte dintr-un set de pixeli de frontieră se reduce deci la determinarea maximelor locale (acestea sunt corespunzătoare segmentelor de linie ale conturului). Din aceste segmente se construiește apoi “granița” obiect-fundal.
Există un mare număr de tehnici alternative de lucru, unele dintre ele extrem de populare datorită simplității și eficientei lor. Urmărirea conturului este un algoritm care trasează conturul prin ordonarea succesivă a punctelor muchiilor anterior determinate. Se pornește de la un punct cunoscut și se analizează vecinii pentru detecția punctului următor și așa mai departe. Algoritmul este cunoscut în literatură sub denumirea sugestivă “ Mersul cu mana pe perete”.
Se obține însă uneori un contur "zdrențuit" în care unii pixeli apar de mai multe ori. Din acest motiv este indicată aplicarea unui algoritm de netezire al rezultatului "brut" al acestei tehnici. Această tehnică de simplificare a contururilor se numește relaxare și are un algoritm ce cuprinde următoarele etape de lucru:
Se consideră un punct de start pe contur;
Se explorează conturul pixel cu pixel;
Se analizează unghiul față de axele de referință ale segmentelor ce formează conturul;
Se elimină diferențele ce se situează sub un prag prestabilit;
Se trasează noul contur, un poligon cu un număr de laturi redus față de varianta “zdrențuită” rezultată inițial din segmentare.
III.3.2. Tehnici regionale de segmentare a imaginilor
Prin detecția regiunilor omogene se înțelege gruparea pixelilor din imagine în categorii distincte funcție de proprietățile lor (ex. nivelul de gri). Această selecție duce la apariția unor porțiuni caracterizate printr-o relativă uniformitate. Zonele astfel determinate permit în ultimă instanță o separare a obiectului ce trebuie analizat de fondul imaginii și de eventuale alte obiecte aflate în cadru.
Metodele ce se bazează pe această procedură sunt mult mai variate decât cele din subcapitolul anterior și această flexibilitate permite rezolvarea unei mai largi aplicabilități într-o serie mai diversificată de probleme. O posibilă clasificare a tehnicilor de segmentare utilizând detecția regiunilor omogene:
Segmentarea histogramei imaginii;
Etichetarea grupurilor conexe de pixeli cu caracteristici similare;
Tehnici regionale;
Identificarea unor forme cunoscute aprioric (obiecte, texturi).
În cele ce urmează se vor prezenta grupate conform clasificării de mai sus câteva dintre cele mai utilizate tehnici de segmentare bazate pe detecția regiunilor cu caracteristici omogene. Principial, toate aceste metode sunt practic clasificări făcute pixelilor individuali sau unor grupuri conexe de pixeli funcție de una sau mai multe proprietăți considerate criterii de decizie.
III.3.2.1. Segmentarea histogramelor
Tehnicile din această categorie se dovedesc foarte utile ori de câte ori există o separare relativ clară a nivelelor de gri între obiectul analizat și fundal (histograme bimodale). În multe situații, pentru a ajunge la acest caz favorabil, sunt necesare preprocesări de tipul celor descrise în anterior în paragraful 3.2 “Procesarea histogramelor” Aceste prelucrări permit aducerea histogramelor la o formă avantajoasă în vederea segmentării.
Segmentarea cu prag unic reprezintă metodă de bază fiind în același timp o tehnică simplă, rapidă și de multe ori foarte eficientă. Etapele de execuție sunt:
Se examinează minimele și maximele locale;
Se selectează pragul P în "valea" dintre cele doua maxime locale dominante (vârfuri);
Se alocă pixelilor cu nivel de gri n < P valoarea 0 (negru absolut) și celor cu n > P valoarea 1 (alb). Rezultă imaginea binarizată.
În cazul în care histograma imaginii originale sau preprocesate nu are structură ideală (bimodală) cu doua maxime locale dominante și un minim pronunțat între ele este necesară aplicarea unei strategii diferențiate funcție de situația practică existentă. De obicei imaginile de teledetecție sunt datorită complexității lor în această a doua categorie.
n n
h(i) h(i)
a. b.
Figura 3.3. Histograma unei imagini
a. Forma bimodală, b. Forma multimodală
În cazul existentei unui model statistic predefinit sau predeterminat al imaginii se recomandă alegerea pragului (pragurilor) astfel încât să se respecte probabilitățile cunoscute pentru obținerea minimizării erorilor.
În speță se poate face inițial segmentarea cu prag multiplu stabilind funcție de ponderile cunoscute aprioric doua praguri t1t2. Prin urmare, după etapa inițială de examinare a histogramei:
Pixelilor cu nivel de gri mai mic decât P1 li se dă valoarea 0;
Pixelilor cu nivel de gri mai mare decât P2 li se dă valoarea 1;
Pentru pixelii intermediari se adoptă valoarea 0 sau 1 funcție de valoarea majoritară în vecinătate (se face prin scanarea pixel cu pixel a imaginii în mai multe treceri succesive);
Vecinătatea în care se face evaluarea se mărește până la eliminarea tuturor pixelilor de valoare intermediară.
O variantă foarte utilă în cazul procesării unor imagini cu procent mare de pixeli de fond și procent mic de pixeli aparținând obiectului analizat (histograme dezechilibrate) este segmentarea histogramei Laplacian-ului imaginii originale. În această imagine valori nenule au doar pixelii aflați de o parte și de alta a muchiilor.
III.3.2.2. Etichetarea pixelilor
Metoda se bazează pe alocarea unui pixel obiectului sau fundalului imaginii funcție de apartenența vecinilor săi. Implementarea se poate face fie pe imagini în care printr-o prelucrare anterioară s-au determinat grupuri conexe cu caracteristici similare, fie prin determinarea "nucleelor de coagulare" în cursul procesării efective. Apartenența se decide funcție de conectivitatea pixelului curent cu unul din aceste grupuri.
În prima categorie se înscriu operațiile de erodare și dilatare în care pixelul este clasificat în categoriile obiect sau fundal funcție de vecinii săi.
Combinația erodare-dilatare (închidere) permite eliminarea unor discontinuități (găuri, golfuri, etc.) în interiorul obiectelor;
Combinația dilatare-erodare (deschidere) elimină peninsulele și istmurile.
Figura 3.4. Neregularitățile contururilor
Ambele tehnici permit deci eliminarea unor neregularități ale contururilor și au aplicații importante în faza de analiză a diferitelor parți componente ale obiectului.
În plus, importantă eroziunii este subliniată de faptul că aplicarea ei repetată (făcută cu grija de a nu elimina conectivitatea și pixelii de capăt) duce la scheletonizarea obiectelor de studiu; proces foarte util în aplicații cum sunt evidențierea traseelor unor obiective de teledetecție filiforme (șosele, căi ferate, căi de navigație etc.).
Figura 3.11. Divizarea succesivă a imaginii în cuadranți
În cea de-a doua categorie de metode cele mai cunoscute sunt acelea care utilizează scanarea (profilograme) pe orizontală și (sau) pe verticală în imaginile binare, determinând tranzițiile 0-1 și 1-0. Rezultă o schiță a regiunii obiectului care apoi este "retușată" prin adăugarea de noi pixeli funcție de caracteristicile proprii și de conectivitatea cu vecinii deja etichetați.
O alternativă la această procedură este detecția prin profilograme a unui centroid al obiectului și scanarea radială in jurul acestuia. Completarea se poate face de asemenea prin alocarea pixelilor funcție de vecinătatea lor.
III.3.2.3. Tehnici regionale
Ideea de bază a acestui grup de tehnici este de a identifica diferite regiuni cu caracteristici relativ uniforme, pornind nu de la nivelul pixelilor, ci de la cel al grupurilor de pixeli.
Tehnica "Divide și contopește" presupune împărțirea imaginii în patru cuadranți și a acestora la rândul lor în patru s.a.m.d. până când se obțin zone uniforme. În continuare, regiunile adiacente cu caracteristici similare se contopesc.
"Creșterea regiunilor" presupune divizarea imaginii inițiale în regiuni "atomizate" și apoi lipirea lor în baza unor criterii similare cu cele din etapa a doua de la metoda menționată anterior.
VmedV’med
’
Figura.3.12. Unirea unor zone adiacente cu parametrii de valori similare
Un avantaj major al acestor procedee este că ele nu sunt neapărat limitate la analiza nivelului de gri al pixelului, ci se evaluează în general medii regionale, momente locale etc. Acest fapt presupune o mai mică sensibilitate la zgomot, dar rezultă în mod evident algoritmi mai complecși care presupun procesări mai laborioase și mai îndelungate.
Creșterea vitezei calculatoarelor actuale, precum și apariția la prețuri relativ accesibile a echipamentelor care permit procesări paralele, transformă aceste tehnici în variante rezonabile de soluționare a unor probleme de segmentare în acele aplicații unde investițiile hardware sunt justificate.
III.3.2.4. Identificarea unor forme cunoscute în prealabil
Cea mai directă metodă de segmentare este căutarea potrivirii formei din imagine cu o formă dintr-o listă anterior stabilită. Utilizarea cea mai frecventă este găsirea unei texturi (plantații agricole, infrastructură urbană, facilitați militare și industriale etc.).
În alte cazuri dimpotrivă se dorește eliminarea texturilor care încărcă imaginea estompând informațiile cu adevărat utile din această (contururi, regiuni uniforme etc.). De exemplu, în segmentarea unor imagini desinate studiului resurselor subterane, texturile datorate elementelor de suprafață trebuiesc estompate.
În general orice textură se caracterizează printr-un număr mai mare de tranziții decât alte porțiuni de imagine. Delimitarea segmentului de imagine ce conține o asemenea textură se poate deci baza pe această “omogenitate”. Recunoașterea tipului de textură presupune evaluarea unei serii de parametri statistici.
Căutarea unui anumit obiect sau porțiune dintr-un obiect se poate face cu ajutorul metodei “Lovit sau ratat” (eng. “Hit or Missed”) care așa cum rezultă și din nume face comparația între porțiuni ale imaginii de procesat și un tipar spre a constata potrivirea. De exemplu, în cazul utilizării unor metode de recunoaștere sintactică a formelor este necesară o etapa de detecție a prezenței sau absenței din structură a obiectului cercetat sau a unor componente ale acestuia.
Potrivirea pixel cu pixel este însă doar aparent simplă. Ea este foarte sensibilă la zgomot și distorsiuni de forma. Se preferă executarea corelației imagine-tipar și căutarea unor maxime. Sunt posibile și alte metode analitice, selecția lor fiind dependentă de modul de definire al modelului.
Capitolul IV. Implementarea aplicației
IV.1. Generalități
În cadrul acestui capitol este descrisă aplicația practică realizată pentru Prelucrarea imaginilor și sunt explicate cele mai importante elemente ale programului.
Aplicația „P_im” constă într-un program scris în limbajul Java care cuprinde clase și interfețe ce rezolvă următoarele funcții:
Manipularea fișierelor de imagine;
deschidere și citire fișier imagine,
salvare imagine procesată în fișier nou.
Afișarea imaginilor;
afișarea imaginii inițiale,
afișarea listei de metode disponibile pentru procesare,
afișarea imaginii finale.
Procesarea imaginilor;
procesare punctuală
procesare prin mască
Validarea procesări.
La ora actuală, limbajul Java permite scrierea unor programe care pot să fie „de sine stătătoare” (programele ce rulează independent în DOS, Linux, etc.), applet-uri (rulează în cadrul paginilor web și sunt afișate de un browser), middlet-uri (rulează pe echipamente mobile gen telefoane celulare, pagere, PDA-uri, etc.) și aplicații (rulează în ferestre sub Windows Linux, Solaris, etc.). Programul de față este de tip aplicație dar poate fi modificat relativ ușor astfel încât să ruleze ca applet într-o pagină HTML.
În concepția programului s-a adoptat o arhitectură modulară care distribuie responsabilitatea rezolvării sarcinilor anterior enumerate unor clase sau grupuri de clase. În consecință programul P_im cuprinde următoarele module funcționale:
Modulul principal: responsabil de manipularea datelor din fișierele imagine atât la deschidere-citire cât și la salvare. De asemenea acest modul efectuează la comanda operatorului validarea prelucrării anterior executate;
Interfața Grafică de Utilizator (GUI) responsabilă de transmiterea informației vizuale spre operatorul uman și preluarea comenzilor de la acesta;
Modulul de prelucrare cuprinzând implementarea algoritmilor de prelucrare propriu ziși.
Aceste module nu sunt neaparat disjuncte în sensul că există clase care execută acțiuni ce intră în gama de funcții a diferitelor module executate de una și aceiași clasă. Acest fapt se datorează intenției de a nu complica excesiv familia de clase prin diviziuni suplimentare care nu ar fi avut o utilitate efectivă în program chiar dacă din punct de vede ideatic s-ar justifica prin separarea clară a execuției diferitelor acțiuni. În figura 4.1 este prezentată fereastra principală a aplicației cuprinzând afișată imaginea de test trui.jpg.
Figura 4.1. Aplicația P_im în cursul rulării
Arhitectura internă a aplicației P_im este reprezentată în figura 5.2. În cadrul figurii sunt reprezentate blocurile funcționale și modul în care este manipulată informația între aceste în cursul rulării:
Figura 4.2. Arhitectura internă a programului P_im
Deoarece limbajul Java este un limbaj pur obiectual în care programele cuprind în mod exclusiv declarațiile unui set de clase, prezentarea ulterioară va fi orientată spre prezentarea acestor clase funcție de modulul în care acestea se încadrează.
IV.2. Modulul principal
Modulul principal este însărcinat cu execuția sarcinilor corespunzătoare acțiunilor ce se derulează la deschiderea unui fișier și citirea imaginii din acesta și la salvarea imaginilor rezultate dintr-un lanț de prelucrări într-un fișier nou creat sau un fișier preexistent care este suprascris.
De asemenea, Modulul principal cuprinde blocul de program care permite validarea rezultatelor unei procesări astfel încât următoarea prelucrare din lanț pornește de la rezultatul celei anterioare și nu de la cadrul inițial.
Totodată, în cadrul modului principal este preluată fiecare dintre comenzile trimise prin intermediul interfeței grafice și se transmite către modulul de procesare unde aceasta este executată. Singurele comenzi care sunt executate local sunt cele de start și respectiv de închidere a aplicației fie prin comanda „Close” sau prin acționarea butonului de închidere X din colțul dreapta sus a ferestrei.
Prima clasa care corespunde Modulului principal este așa cum era de așteptat clasa principală (executabilă) a programului denumită, în conformitate cu regulile limbajului Java, P_im la fel ca și fișierul ce cuprinde codul sursă al întregului program.
De asemenea, în acele situații în care este necesară conversia șirurilor la forma hexa standard în care limbajul Java definește culorile, o a doua clasă a modulului principal intră în acțiune. Aceasta este clasa Conv cea care așa cum se va vedea mai târziu execută transformarea valorilor preluate din ferestrle de dialog în formatul RGB.
Scheletul acestei clase este reprezentat în listingul 5.1 unde sunt păstrate doar părțile ei cele mai importante și relevante pentru funcțiile ei în cadrul modulului principal.
public class P_im extends Frame{ // declarație clasa principala P_im de tip Frame
static protected Image im, imf; // imaginile inițială și finală
private Toolkit t = Toolkit.getDefaultToolkit(); // obiect Toolkit ptr. afișarea imaginilor în Frame
private MenuBar b = new MenuBar(); // bara de meniu a ferestrei
private Menu f = new Menu ("File"); // meniul File
private Menu p = new Menu ("Process"); // meniul Process
private Menu h = new Menu ("Help"); // meniul Help
private boolean a = false; // comutator afișare
private F_bin f_b; // filtru Binarizare
private F_fg f_f; // filtru Fereastră de gri
private F_net f_n; // filtru Netezire
private F_med f_m; // filtru Median
private F_lap f_l; // filtru Laplace
public P_im(String titlu){ // constructor P_im
super(titlu); // titlu fereastră
setMenuBar(b); // setare bară meniu
b.add(f); // adăugare meniuri
b.add(p);
b.add(h);
f.add("Open"); // adăugare articole de meniu
f.add("Save");
f.addSeparator(); // adăugare separator
f.add("Exit");
p.add("Binarizare");
p.add("Fereastra");
p.add("Histograma");
p.add("Netezire");
p.add("Median");
p.add("Laplace");
p.addSeparator();
p.add("Validare");
h.add(“Help”);
}
public static void main(String args[]){ // metoda main()
P_im app = new P_im("Prelucrarea imaginilor"); // inițializare fereastră
app.resize(400,400); // setare dimensiuni
app.setLocation(200,100); // setare locație pe ecran
app.show(); // comanda afișare fereastră
}
public void paint(Graphics g){ // metoda paint()
try{ // bucla tratare erori
if(!a) g. drawImage(im,50,70,this); // tipărire imagine inițială
else if(a) g. drawImage(imf,50,70,this); // tipărire imagine finală
}catch(NullPointerException e){} // tratare eroare negăsire imagine
}
public boolean action(Event e, Object arg){ // metoda action()
if(e.target instanceof MenuItem){ // detecție sursa comandă
if(arg.equals("Open")){ // tratare Open
FileDialog f_op = new FileDialog(this, "File Open",FileDialog.LOAD);
// fereastra de dialog Open
f_op.setDirectory("Img"); // setare director
f_op.setLocation(250,150); // setare locație fereastră de dialog
f_op.show(); // afișare fereastră de dialog
im=t.getImage(f_op.getDirectory()+"\\"+f_op.getFile());
// preluare imagine în obiectul im
a=false; // comutare a
repaint(); // apel la metoda paint()
}
else if(arg.equals("Save")){ // tratare Save
FileDialog f_sv = new FileDialog(this, "Save as",FileDialog.SAVE);
// fereastră de dialog Save
f_sv.setDirectory("Img"); // setare director
f_sv.setLocation(250,150); // setare locație fereastră de dialog
f_sv.show(); // afișare fereastra de dialog
try{ // bucla tratare erori
FileOutputStream out=new FileOutputStream(f_sv.getDirectory()+"\\"+f_sv.getFile());
// flux iesire
SaveJpg s_im = new SaveJpg(imf, out, this); // salvare
}catch(IOException ex1){} // tratare eroare la salvare
}
else if(arg.equals("Exit")){ // ieșire din program prin acționare Close
this.dispose(); // eliberare resurse
System.exit(0); // închiderea aplicației
}
else if(arg.equals("Binarizare")){ // tratare comanda Binarizare
f_b=new F_bin(); // instanțiere obiect filtru binarizare
Dg_bin d =new Dg_bin(this,"Prag binarizare");
// instanțiere fereastra de dialog binarizare
d.setLocation(450,150); // setare locație fereastră de dialog
d.resize(300,380); // setare dimensiuni
d.show(); // afișare fereastră de dialog
Conv c=new Conv(d.get_param()); // instanțiere obiect Conv
imf=f_b.proc(im,c.rez); // comanda procesare
a=true; // comutare a
repaint(); // apel la metoda paint()
}
else if(arg.equals("Fereastra")){ // tratare comanda Fereastra de gri
f_f=new F_fg();
Dg_fg d =new Dg_fg(this,"Praguri fereastra");
d.setLocation(450,150);
d.resize(300,400);
d.show();
Conv c1=new Conv(d.get_s1());
Conv c2=new Conv(d.get_s2());
imf=f_f.proc(im,c1.rez,c2.rez);
a=true;
repaint();
}
else if(arg.equals("Histograma")){ // tratare comanda Histograma
Dg_his h =new Dg_his(this,"Histograma");
h.setLocation(450,150);
h.resize(300,330);
h.show();
}
else if(arg.equals("Netezire")){ // tratare comanda filtru Netezire
f_n=new F_net();
imf=f_n.proc(im);
a=true;
repaint();
}
else if(arg.equals("Median")){ // tratare comanda filtru Median
f_m=new F_med();
imf=f_m.proc(im);
a=true;
repaint();
}
else if(arg.equals("Laplace")){ // tratare comanda filtru Laplace
f_l=new F_lap();
imf=f_l.proc(im);
a=true;
repaint();
}
else if(arg.equals("Validare")){ // tratare comanda Validare
im=imf; // imaginea finala preluata in im
}
else if(arg.equals("Help")){ // tratare Help
f_hlp = help.txt;
f_hlp.show(); // afișare fereastră de dialog
repaint(); // apel la metoda paint()
}
return true;
}
return false;
}
public boolean handleEvent(Event ev){ // metoda handleEvent()
if(ev.id ==Event.WINDOW_DESTROY){ // detecție sursa eveniment
this.dispose(); // eliberare resurse
System.exit(1); // închiderea aplicației
}
return super.handleEvent(ev); // apel metoda super
}
}
Listingul 4.1. Clasa executabilă (principală) P_im
Clasa P-im cuprinde în interiorul sau un număr de date membre dintre care cele mai importante sunt:
Obiectele Image im, imf reprezintă imaginile inițială și finală ale fiecărei procesări. Ele sunt “static protected” deoarece trebuie să fie accesibile metodelor de procesare din cadrul claselor filtru
Obiectul Toolkit t necesar pentru afișarea imaginilor în aplicațiile ce rulează în ferestre
Bara de meniu (MenuBar) b a ferestrei aplicației
Meniurile (Menu) f, p și h adică File, Process și respectiv Help cuprinse în bara de meniuri a aplicației.
Variabila boolean a este comutatorul folosit la afișare pentru a înlocui imaginea inițială cu cea finală în spațiul de lucru al ferestrei
Obiectele filtru F_bin f_b (Binarizare), F_fg f_f (Fereastră de gri), F_net f_n (Netezire) F_med f_m (Median) și F_lap f_l (Laplace).
Cu excepția obiectelor Image toate celelalte date membre ale clasei sunt declarate private fiind accesibile doar în interiorul acesteia, adică pentru a fi folosite de metodele sale membre.
Funcțiile corespunzătoare Modulului principal în cadrul programului sunt executate de metodele membre ale clasei P_im. Aceste metode membre sunt:
metoda constructor public P_im(String titlu) are ca parametru titlul ferestrei și se folosește pentru inițializarea barei de meniu și celor trei meniuri ale sale: File, Process și Help. Evident metoda constructor va fi apelată pentru creerea obiectului P_im adică fereastra principală a aplicației. În conformitate cu regulile limbajului Java, metoda constructor este denumită identic cu clasa este publică și nu are valoare returnată (returnează în fapt obiecte ale clasei).
metoda principală public static void main(String args[]) a clasei executabile P_im care conține instanțierea ferestrei app, fereastra principală a aplicației (prin apel la constructorul de mai sus) precum și definirea parametrilor acesteia: dimensiuni, localizare și titlu. După creerea ferestrei P aceasta se afișează cu ajutorul comenzii show(). Metoda main() are o formă standard stabilită de regulile limbajului Java. Ea este publică, statică (poate fi apelată fără ca un obiect al clasei să fie inițial instanțiat), are parametrul args[] de tip String și nu are valoare returnată lucru semnalizat prin faptul ca este declarată void.
metoda public void paint(Graphics g) pentru desenarea conținutului ferestrei app. Ea conține o buclă try … catch pentru tratarea situațiilor de excepție (ex. eroare la afișarea fișierului). Valoarea true sau false a variabilei comutator a dictează “desenarea” cu metoda drawImage() a imaginii inițiale (anterioară prelucrării curente) respectiv a imaginii finale (rezultatul prelucrării). Metoda paint() are de asemenea o structură standard în programele Java. Ea are întotdeauna parametrul g de tip Graphics este publică și nu are valoare returnată.
metoda public boolean action(Event e, Object arg) cuprinde în principal o instrucțiune de control a fluxului if…else if multiplă care are rolul de a detecta sursa comenzii și a decide modul ei de tratare. Fiecare dintre “ramurile“ else if corespunde câte unui articol de meniu și cuprinde un bloc de instrucțiuni care execută sarcina dorită de operatorul uman. Există următoarele tipuri principale de sarcini:
Manipularea fișierelor imagine, adică citirea imaginilor dintr-un fișier de pe hard-disk sau salvarea imaginilor rezultate în urma procesării într-un fișier nou creat ori într-un fișier preexistent. Aceste operații se execută cu respectarea regulilor sistemului de operare, adică se cere numele fișierului nou respectiv se cere confirmarea în cazul suprascrierii unui fișier care există deja în directorul unde se face salvarea. Operațiunile de deschide și salvare se fac în directorul Img inpus ca director implicit prin metoda setDirectory(). Operațiunea de salvare se realizează cu ajutorul clasei SaveJpg specializată pentru transmiterea unui flux de date destinat scrierii într-un fișier pe hard-disk a imaginilor jpg.
Comanda executării filtrărilor implementate în program. Așa cum se va arăta în detaliu ulterior, fiecare filtru este definit ca o clasă de tip Filter și prin urmare blocul corespunzător în cadrul acestei metode cuprinde instanțierea unui obiect filtru (ex. Dg_bin d =new Dg_bin(this,"Prag binarizare"); … d.show(); ) f_b pentru binarizare), comanda creării și afișerii acolo unde este cazul a unei ferestre de dialog pentru stabilirea de către utilizator a parametrilor procesării imaginii (ex. și în final comanda executării efective a procesării (ex. imf=f_b.proc(im,c.rez);). În acele situații unde parametrii transferați trebuie convertiți din hexa în zecimal se instanțiază un obiect Conv care execută transformarea.
Comanda Help din meniul cu același nume afișează într-o fereastră de dialog conținutul fișierului help.txt ce conține un set de instrucțiuni necesare pentru a informa pe utilizatorul uman asupra modului de utilizare a aplicației și asupra rolului fiecăruia dintre filtrele existente în meniul Process. O atenție specială este acordată item-ului Custom care permite implementarea unor procesări la alegerea utilizatorului.
Comanda Close de închidere a aplicației este una dintre cele două căi disponibile pentru ieșirea din program. În prima etapă se comandă eliberarea resurselor alocate aplicației în cursul rulării și apoi linia de cod System.exit(cod_de_iesire) realizează terminarea efectivă a programului. Codul de ieșire este un întreg ce permite vizualizarea și identificarea la consola DOS a locului exact unde aplicația a fost întreruptă de utilizator. Acest lucru este uneori util în faza de depanare a programului și este păstrat ca atare în formula finală deoarece nu implică nici un cost suplimentar la rulare.
Figura 4.4. Acționarea unei comenzi din sistemul de meniuri al ferestrei principale a aplicației
Metoda de ieșire public boolean handleEvent(Event ev) forțează ieșirea din aplicație la apăsarea butonului de închidere X din colțul dreapta sus al ferestrei. Această metodă este obligatorie în cazul implementării aplicației cu ajutorul claselor din pachetul java.awt (Abstract Window Toolkit). În cazul în care s-ar fi optat pentru implementarea cu clasele Swing soluția de tratare a acționării butonului X era diferită. Ieșirea prin acțiunea metodei handleEvent() este a doua cale de ieșire din program și se realizează în mod identic cu ceea ce se întâmplă la acționarea lui Close, doar codul de ieșire este diferit pentru a asigura individualizarea.
Având în vedere cele prezentate anterior se poate observa că în cadrul clasei P_im se execută toate sarcinile corespunzătoare Modulului principal acestea incluzând atât tratarea acțiunilor corespunzătoare acțiunilor de executat în sistem cât și controlul fluxului de date între modulele componente ale aplicației.
Așa cum s-a arătat anterior anumite valori se vehiculează în cadrul aplicației în formatul hexa. Este în primul rând vorba despre valoarea culorilor care este compusă din următoarele elemente:
Componenta reprezintă gradul de transparență al nuanței de culoare și are domeniul de variație de la 0x00 (perfect transparentă) la 0xFF (perfect opacă);
Componenta R reprezintă roșul din nuanța cromatică;
Componenta G reprezintă verdele din nuanța cromatică;
Componenta B reprezintă albastrul din nuanța cromatică.
Toate cele trei componente cromatice fundamentale au valorile cuprinse între 0x00 (valoarea minimă) și 0xFF (valoarea maximă). Modul de dispunere al celor patru segmente ale codului Java pentru culori este reprezentat în tabelul 4.1.
Tabelul 4.1.
Clasa Conv care realizează conversiile este redată în listingul 4.2.
class Conv{ // clasa conversie hexa -> zecimal
private int B=16; // baza de numerație inițială
protected int rez; // rezultatul conversiei
public Conv(String s){ // constructor 1
int p=Integer.decode(s).intValue(); // conversie șir -> int
rez=0x00|(lit(p/B)<<4)|lit(p%B); // construcție număr hexa
rez=0xFF000000|(rez<<16)|(rez<<8)|rez; // formatare valoare culoare
}
public Conv(int p){ // constructor 2
rez=0x00|(lit(p/B)<<4)|lit(p%B); // construcție număr hexa
rez=0xFF000000|(rez<<16)|(rez<<8)|rez; // formatare valoare culoare
}
public int lit(int x){ // decodare cifre hexa A,B,C,D,E și F
switch(x){ // selecție valoare
case 10: x=0xA;
break;
case 11: x=0xB;
break;
case 12: x=0xC;
break;
case 13: x=0xD;
break;
case 14: x=0xE;
break;
case 15: x=0xF;
break;
}
return x; // returnare număr
}
}
Listingul 4.2. Clasa Conv
Clasa Conv cuprinde următoarele date membre:
Întregul B=16 reprezintă baza de numerație în care se convertesc valorile prelutae din ferestele de dialog.
Întregul rez reprezintă rezultatul conversiei adică nuanța de culoare rezultată prin convertirea valorii zecimale în forma standard Java pentru culori
Metodele clasei Conv sunt:
doi constructori (suprascriere) public Conv(int p) disponibili pentru conversia în diferite situații apărute în cadrul programului.
metodă int lit(int x) pentru decodarea cifre A,B,C,D,E și F din forma literară prezentă în șiruri la forma hexa 0xA … 0xF.
Toate metodele din clasa Conv sunt publice și prin urmare permit utilizarea lor din afara clasei adică în cazul de față din clasa principală P_im.
IV.2. Interfața grafică de utilizator
Interfața grafică de utilizator (eng. Graphical User Interface GUI) este destinată ușurării accesului utilizatorului uman al programului astfel încât acesta să poată comanda în mod rapid, simplu și eficient execuția procesărilor imaginilor și să stabilească interactiv parametrii filtrelor aplicate.
Există două componente principale ale interfeței grafice:
Sistemul de meniuri din fereastra principală este inițializat și i se alocă acțiuni tot în cadrul clasei executabile P_im. Deși această clasă aparține unui alt modul funcțional (modulul principal) am considerat că este o complicație nejustificată separarea meniurilor de fereastra din care fac parte. Fereastra principală a aplicației este reprezentată în figura 4.3.
Ferestrele de dialog reprezintă în cadrul aplicației curente o familie de clase care își moștenesc caracteristicile din clasa Dialog pusă la dispoziție de pachetul java.awt importat în program. Structura familiei de clase este prezentată în figura 5.4.
Figura 4.2. Familia de clase „Ferestre de dialog” ale aplicației
Clasa Dialog este importată din pachetul java.awt (Abstract Window Toolkit) și reprezintă clasa mamă a întregii familii. Ea cuprinde elementele de bază ce se regăsesc în toate ferestrele de dialog din cadrul aplicației precum și mecanismele de preluare a prim planului aplicației în perioada de activare.
Clasa Dg este moștenitoare directă a clasei dialog si reprezintă prototipul după care ulterior se construiesc toate clasele din care se instanțiază ferestrele de dialog ale diferitelor filtre existente în programul P_im. Liniile de cod ale acestei clase sunt reprezentate în listingul 4.3.
class Dg extends Dialog{ // declaratie clasa Dg
protected Button Try,Exit; // declarare butoane
protected Panel p1,p2; // declaratie paneluri
protected Label l,l1,l2; // etichete
protected TextField t1,t2; // campuri de text
protected String s1,s2; // siruri
protected H his=new H(); // instantiere histograma imagine
private boolean a;
public Dg(Frame parinte, String titlu){ // constructori
super(parinte,titlu,true); // apel metoda super
this.setBackground(Color.white); // culoare fond
p1=new Panel(); // instantiere paneluri
p2=new Panel();
init(); // apel metoda init()
}
public void init(){ // metoda init va fi
} // suprascrisa de mostenitori
public boolean action(Event e, Object arg){ // tratare acțiuni
if(arg.equals("Try")){ // tratare comanda try
a=true; // comutare a
repaint(); // apel la paint()
Try.setLabel("OK"); // redenumire buton
return true; // returnare true
}
else if(arg.equals("OK")){ // tratare comanda OK
atrib(); // apel atrib()
this.dispose(); // eliberare resurse
return true; // returnare true
}
else if(arg.equals("Exit")){ // tratare comanda Exit
this.dispose(); // eliberare resurse
return true; // returnare true
}
return false; // returnare false
}
public void atrib(){ // metoda init va fi
} // suprascrisa de mostenitori
public boolean handleEvent(Event ev){ // metoda handleEvent()
if(ev.id ==Event.WINDOW_DESTROY){ // detectie sursa eveniment
this.dispose(); // eliberare resurse
}
return super.handleEvent(ev); // apel metoda super
}
public void paint(Graphics g){ // metoda paint()
g.drawLine(30,280,290,280); // desenare axe coordonate
g.drawLine(30,70,30,280);
g.drawString("H(n)",5,70); // coordonate grafic
g.drawString("0",20,290);
g.drawString("n",280,290);
g.setColor(Color.green); // setare culoare histograma
for(int i=0;i<256;i++)
g.drawLine(31+i,279,31+i,279-his.hs[i]/18); // prag selectat
if(a){
g.setColor(Color.red); // setare culoare praguri
if(t1!=null){ // exista prag1?
int pg1=Integer.decode(t1.getText()).intValue(); // convesie sir->int
g.drawLine(31+pg1,279,31+pg1,279-his.hs[pg1]/18);// prag1
}
if(t2!=null){ // exista prag2?
int pg2=Integer.decode(t2.getText()).intValue(); // convesie sir->int
g.drawLine(31+pg2,279,31+pg2,279-his.hs[pg2]/18);// prag2
}
}
}
}
Listing 4.3. Superclasa Dg
Clasa Dg cuprinde următoarele date membre:
Butoanele (obiecte Button) Try și Exit sunt folosite pentru a prelua comenzile utilizatorului în toate ferestrele de dialog din program. Prin urmare era normal ca declararea lor să se facă în superclasa Dg.
Panelurile (obiecte Panel) p1 și p2 corespund zonelor funcționale dedicate butoanelor respectiv afișajului histogramelor în ferestrele de dialog moștenitoare ale clasei mama Dg.
Etichetele (obiecte Label) l,l1 și l2 sunt utilizate pentru afișarea unor mesaje explicative în ferestrele de dialog ale aplicației. Acestea sunt în general legate de histogramă și de câmpurile de text de mai jos.
Câmpurile de text (obiecte TextField) t1 și t2 reprezintă calea de preluare a parametrilor de procesare de la utilizator. Valorile scrise de acesta sunt convertite din șiruri în întregi și efectul lor asupra histogramei este afișat după acționarea butonului Try.
Șirurile s1 și s2 sunt utilizate ca buffere pentru preluarea valorilor din câmpurile de text
Obiectul histograma H este un element central al ferestrelor de dialog ale aplicației deoarece în majoritatea procesărilor implementate în P_im deciziile utilizatorului sunt luate funcție de aceasta.
Comutatorul boolean a are un rol similar cu omonimul său din clasa principală. În speță funcție de valoarea sa se afișează sau nu pragurile cu roșu peste histograma de culoare verde astfel încât utilizatorul să poată evalua efectul procesării asupra imaginii încă înainte de a comanda pornirea aceteia.
Toate datele membre cu excepția comutatorului a ( de uz strict intern) sunt declarate protected astfel încât pot fi accesate de metodele moștenitorilor superclasei Dg. Această reducere a barierei standard de încapsulare era necesară pentru a evita complicarea inutilă a codului atât în clasa de bază cât și în derivatele acestei Dg_bin, Dg_fn, etc.
În componența clasei Dg intră următoarele metode:
Metoda constructor a clasei este Dg(Frame parinte, String titlu) și corespunde reglementărilor standard ale limbajului Java. Ea este publică, are numele identic cu clasa și nu are valoare returnată. Parametrii metodei sunt fereastra părinte a ferestrei de dialog și titlul ei. În interiorul metodei se apelează cu super constructorul clasei java.awt.Dialog pentru construcția efectivă a frame-ului și metoda init() pentru definirea componentelor conținute de acesta.
Metoda init() este declarată în Dg fără nici o linie de cod. Această prezență simbolică se explică prin faptul că ea va fi suprascrisa de moștenitori în conformitate cu necesitățile specifice fiecăruia dintre ei. metoda init() nu are parametrii și nici valoare returnată.
metoda action(Event e, Object arg) este metoda standard pentru tratarea comenzi dictate de utilizator prin apăsarea butoanelor din cadrul ferestrelor de dialog. Metoda cuprinde câte un bloc de cod separat pentru fiecare situație concretă din program. Valoarea returnată a acestei metode este booleană.
Metoda atrib() este ca și init() declarată în Dg doar simbolic fără nici o linie de cod. Și în acest caz metoda va fi suprascrisa de moștenitori funcție de necesitățile curente ale fiecărei ferestre de dialog din cadrul aplicației.
Metoda de ieșire handleEvent(Event ev) forțează ieșirea din aplicație la apăsarea butonului de închidere X din colțul dreapta sus al ferestrei. Această metodă este obligatorie în cazul implementării aplicației cu ajutorul claselor din pachetul java.awt (Abstract Window Toolkit). În cazul în care s-ar fi optat pentru implementarea cu clasele Swing soluția de tratare a acționării butonului X era diferită. Ieșirea prin acțiunea metodei handleEvent() este a doua cale de ieșire din program și se realizează în mod identic cu ceea ce se întâmplă la acționarea butoanelor OK sau Cancel, doar codul de ieșire este diferit pentru a asigura individualizarea.
Metoda paint(Graphics g) este metoda standard de așezare a elementelor componente în ferestrele de dialog. În clasa Dg, care este de fapt superclasă a claselor ce implementează ferestrele de dialog ale aplicației, metoda paint() cuprinde un schelet general aplicabil care va fi ulterior concretizat funcție de specificul fiecărui moștenitor în parte.
Evident în cadrul programului fiecare fereastră de dialog este instanță a unei clase specifice prelucrării pe care o deservește. Toate aceste clase sunt asemănătoare, dar au fiecare cel puțin câte o diferență specifică care le asigură individualizarea în cadrul aplicației. Prin urmare am considerat că este suficientă prezentarea în extenso a unui exemplu tipic de clasă Fereastră de dialog celelalte fiind cuprinse în listingul general prezentat în Anexa lucrării de față.
class Dg_fg extends Dg{ // clasa dialog fereastra de gri
public Dg_fg(Frame parinte, String titlu){ // constructor
super(parinte,titlu); // apel metoda super
}
public void init(){ // rescriere metoda init()
p1.add(l=new Label("Histograma imaginii",Label.LEFT));
// instantiere si adugare eticheta
add("North",p1); // adaugare panel Nord
p2.setLayout(new GridLayout(3,2,10,5)); // setare Layout de tip grila
p2.add(l1=new Label ("Prag1: ",Label.CENTER)); // instantiere si adugare eticheta
p2.add(t1=new TextField("",35)); // instantiere si adugare TextField
p2.add(l2=new Label ("Prag2: ",Label.CENTER)); // instantiere si adugare eticheta
p2.add(t2=new TextField("",35)); // instantiere si adugare TextField
p2.add(Try=new Button("Try")); // instantiere si adugare buton
p2.add(Exit=new Button("Exit")); // instantiere si adugare buton
add("South",p2); // adaugare panel Sud
}
public void atrib(){ // rescriere metoda atrib()
s1=t1.getText(); // preluare valori t1 si t2
s2=t2.getText();
}
public String get_s1(){ // transmitere valoare s1
return s1;
}
public String get_s2(){ // transmitere valoare s2
return s2;
}
}
Listingul 4.4. Clasa Dg_fg – fereastra de dialog a procesării Fereastră de gri
Clasa Dg_fg este destinată implementării ferestrei de dialog în care utilizatorul stabilește pragurile p1 și p2 ale procesării Fereastră de gri. Ea nu conține alte date membre decât cel moștenite de la superclasa Dg.
Metodele membre ale clasei Dg_fg sunt:
Constructorul Dg_fg(Frame parinte, String titlu) este utilizat pentru instanțierea ferestrei de dialog Fereastra de gri în momentul în care utilizatorul comandă execuția acestei procesări. La fel ca orice constructor în Java Dg_fg are același nume cu clasa, este public și nu are valoare returnată. parametrii metodei sunt fereastra rădăcină (părinte) și titlul ferestrei de dialog. Singura linie de cod este apelul la constructorul superclasei Dg care rezolvă toate sarcinile.
Metoda init() este rescrierea metodei init() din Dg (polimorfism) și rezolvă plasarea în cadrul ferestrei de dialog a elementelor care sunt specifice prelucrării deservite. Aceste componente sunt:
în panelul de Nord:
histograma imaginii provenind din superclasa Dg,
eticheta cu titlul histogramei.
în panelul de Sud unde dispunerea este setată de tip grilă (GridLayout):
câmpurile de text pentru preluarea celor două praguri,
etichetele însoțitoare ale acestor câmpuri.
butoanele Try și Exit
Metoda atrib() este deasemenea o rescriere a metodei atrib() din clasa mamă Dg. Funcția acestei metode este plasarea valorilor scrise de utilizator în câmpurile de text din fereastra de dialog în șirurile s1 și s2 având rolul de buffere.
Metodele String get_s1() și String get_s2() asigură transmiterea valorilor s1 și respectiv s2 din interiorul clasei Dg_fg către modulul principal de unde ulterior sunt preluate și folosite de modulul de procesare. Evident cele două metode returnează obiecte String adică cele două șiruri mai sus pomenite către exterior.
Figura 4.4. Fereastra de dialog „Praguri fereastră”
Figura 4.5. Ferestrele de dialog ale aplicației P_im
a. Fereastra „Prag binarizare”
b. Fereastra „Histograma”
c. Fereastra „Transformata Hough”
d. Fereastra „Filtru Custom”
Celelalte clase prin care se implementează ferestrele de dialog corespunzătoare procesărilor din aplicația P_im sunt:
Dg_bin fereastra de dialog prin care se comandă parametrii pentru procedura de binarizare, figura 4.5.a.
Dg_his fereastra de dialog pentru afișarea histogramei, figura 4.5.b.
Dg_h pentru afișarea rezultatelor transformatei Hough, figura 4.5.c.
Dg_fc pentru preluarea parametrilor filtrului Custom, filtru cu mască făcută de utilizatorul aplicației, figura 4.5.d.
Figura 4.5. Ferestrele de dialog ale aplicației P_im
IV.3. Modulul de procesare a imaginilor
Modulul de procesare al imaginilor este compus dintr-o clasă Filtru moștenitoare a clasei java.awt.image.ImageFilter. Structura familiei de filtre din aplicația P-im este asemănătoare cu cea a ferestrelor de dialog și este reprezentată în figura 4.5
Se poate observa că familia de clase pornește de la dezvoltare unui prototip valabil pentru toate filtrele dezvoltat din clasa java.awt.image.ImageFilter care este ulterior concretizat pentru fiecare dintre filtrele implementate. Superclasa tuturor filtrelor din programul P_im este clasa Filtru.
Arhitectura clasei Filtru cu principalele ei componente este redată în Listingul 4.5 împreună cu comentariile destinate clarificării modului de implementare selecta pentru rezolvarea sarcinilor din timpul rulării.
class Filtru extends ImageFilter{ //declarație clasa Filtru
protected int h, w; // dimensiuni imagine
protected int hs[]=new int[256]; // tabel histograma
protected ColorModel mcr=ColorModel.getRGBdefault();// model RGB imagine
public Filtru(){ // constructor
h=w=300; // setare dimensiuni
}
public Image proc(Image im){ // metoda procesare
int pix_o[] = new int[w * h]; // tabel imaginea inițială
int pix_f[] = new int[w * h]; // tabel imaginea finală
try { // bucla tratare erori
PixelGrabber pg= new PixelGrabber(im.getSource(),0,0,w,h,pix_o,0,w);
pg.grabPixels(); // preluare pixeli imagine
} catch (Exception e) { }
for(int y=1; y<h-1;y++){ // definire vecinătate
for(int x=1; x<w-1; x++){
int v[]={pix_o[w*(y-1)+x-1], pix_o[w*(y-1)+x], pix_o[w*(y-1)+x+1],
pix_o[w*y+x-1], pix_o[w*y+x], pix_o[w*y+x+1],
pix_o[w*(y+1)+x-1], pix_o[w*(y+1)+x], pix_o[w*(y+1)+x+1]
}
pix_f[y*w+x]=calc(v); // apel metodă de calcul
}
}
Toolkit t = Toolkit.getDefaultToolkit(); // instanțiere obiect Toolkit
return P_im.imf = t.createImage(new MemoryImageSource(w,h,pix_f,0,w));
}
public int calc(int v[]){ // metoda calcul rezultat procesare
return v[4];
}
}
Listingul 4.6. Clasa Filtru superclasă a tuturor filtrelor
de procesare din aplicația P_im
Clasa Filtru, moștenitoare a clasei java.awt.image.ImageFilter și clasă de bază pentru filtrele particulare din program, are următoarele date membre:
Dimensiunile imaginilor prelucrate h și w sunt valori întregi reprezentând numărul de pixeli pe rând și respectiv coloană în imagine.
Tabelul de întregi hs[] cuprinzând valorile fiecăruia din cele 256 de puncte ale histogramei corespunzătoare celor 256 de nivele de gri din imaginea procesată.
Modelul de culoare (obiect ColorModel) mcr este setat pe modelul implicit prin instanțierea sa ca fiind ColorModel.getRGBdefault(). Modelul de culoare este prin urmare cel standard acceptat de limbajul Java și anume modelul RGB descris în paragraful anterior.
Toate aceste date membre au fost declarate cu specificatorul de acces protected așa încât să poată fi ulterior accesate de către clasele moștenitoare ale superclasei Filter.
Metodele existente în cadrul clasei Filter sunt:
Constructorul Filtru() care are doar rolul de a stabili dimensiunile imaginilor prelucrate. Dimensiunea a fost aleasă 300300 deoarece setul de imagini test sunt imagini pătrate cu dimensiunea de 300 pixeli. Evident printr-o modificare simplă a valorilor de setare se poate seta programul P_im să prelucreze imagini de ală dimensiune. De asemenea forma pătrată, deși este larg folosită în domeniul prelucrării imaginilor, nu este neaparat obligatorie
Metoda de procesare Image proc(Image im) este metoda cea mai importantă în cadrul clasei și al întregii aplicații. Din acest motiv ea se va descrie în detaliu în cele ce urmează. Procesarea cuprinde următoarele etape:
Definirea tablourilor pix_o[] și pix_f[] corespunzătoare imaginilor originală și finală,
preluarea prin obiectul PixelGrabber a valorii fiecărui pixel din imaginea originală în tabelul pix_o[],
scanare cu o bucla dublu for pe orizontala și verticala imaginii
Figura 4.7. Organigrama metodei proc() ce realizează transformările de imagini
definirea vecinătății din jurul pixelului în care se execută prelucrarea regională,
apelarea metodei de calcul efectiv a valorii pixelului pix_f[i,j] după procesare funcție de valorile inițiale ale acelui pixel și a vecinilor săi,
crearea cu instrucțiunea:
createImage(new MemoryImageSource(w,h,pix_f,0,w))
a imaginii finale din valorile calculate anterior și depozitate în tabelul pix_f[]
metoda calc() este declarata doar în clasa filtru ea urmând a fi rescrisă și dezvoltată funcție de necesitățile particulare ale fiecăruia din filtrele existente în cadrul aplicației P_im.
Figura 4.7. prezintă organigrama metodei proc() așa cum a fost descrisă anterior.
Clasa F_med este prezentă în program pentru a permite implementarea în cadrul aplicației a filtrului median unul dintre cele mai eficiente pentru eliminarea zgomotului. Structura internă a acestei clase, care este un exemplu tipic pentru toate celelalte clase din program este dată în listingul 4.7. prezentat în cele ce urmează.
Așa cum s-a arătat în partea de prezentare teoretică a filtrelor mască (regionale) filtrul median înlocuiește valoarea inițială a pixelului cu valoarea mediană a seriei ordonate a valorilor pixelilor din veinătate. Acest fapt permite eliminarea foarte eficientă a zgomotelor de tip „sare și piper” fără a afecta claritate a imaginii.
class F_med extends Filtru{ // filtru median
public int calc(int v[]){ // metoda de calcul
int i=9; // dimensiune vecinătate
while(–i>=0) // algoritm ordonare
for(int j=0; j<i; j++)
if(v[j]>v[j+1]){
int temp=v[j];
v[j]=v[j+1];
v[j+1]=temp;
}
return v[4]; // returnare rezultat
}
}
Listingul 4.7. Clasa F-med corespunătoare filtrului median
Rezultatul de mai sus se obține prin aplicarea metodei calc din listingul 4.7 unde printr-un algoritm simplu se execută ordonarea crescătoare a pixelilor din vecinătate și se obține valoarea mediană (centrală) a seriei în poziția V[4]. Această valoare este returnată ca atare metodei de procesare descrisă anterior care o plasează în locația corepunzătoare pixelului procesat în tabelul pix_f[].
Celelalte procesări disponibile în cadrul aplicației P_im sunt:
Binarizarea – imaginea inițială este transformată punctual într-o imagine alb-negru;
Fereastra de gri – imaginea originală este transformată punctual într-o imagine cu trei zone: una neagră, una cu contrast mărit (factorul de marire depinde de utilizator) și una albă;
Histogramă – trasarea histogramei imaginii;
Netezire – eliminarea zgomotului prin medierea valorii pixelilor în interiorul vecinătății lor;
Median – a fost descris anterior;
Laplace – detecția contururilor prin aplicarea transformatei Laplace (derivata dublă pe x și y) în vecinătatea fiecărui pixel;
Hough – detecția histogramei unghiurilor segmentelor de contur în imagini;
Custom – filtru definit de utilizator în cadrul unei ferestre de dialog specializate.
Prin urmare se poate aprecia că setul de procesări ales este suficient pentru a asigura o gamă relativ largă de metode combinate capabile să soluționeze diferitele necesități practice de procesare care se pot ivi în cadrul diferitelor teme.
Așa cum s-a arătat în partea teoretică, domeniul prelucrării imaginilor este în general greu de prins în șabloane deoarece în cadrul fiecărei aplicații concrete trebuie analizate comparativ un set de metode alternative și ulterior aleasă cea mai eficientă cale de obținere a rezultatelor dorite.
Capitolul V. Rezultate experimentale
V.1. Mod de lucru
În cele ce urmează se vor prezenta câteva rezultate experimentale menite să demonstreze funcționalitatea și flexibilitatea sistemului. Imaginile utilizate sunt din setul test existent în cadrul laboratorului de Prelucrarea imaginilor susținut de coordonatorul acestei lucrări.
Prezentarea este de asemenea concepută ca un ghid de utilizator care prin demonstrarea efectivă a modului în care se modifică imaginile din setul de test în urma aplicării filtrelor din cadrul aplicației să permită unui utilizator să aleagă acele căi de prelucrare care ii sunt utile în rezolvarea problemei proprii.
Fiecare dintre prelucrările existente în programul P-im este prezentată pe scurt din punct de vedere teoretic pentru ca apoi să fie arătat modul în care se execută comanda și comparativ imaginile originală și finală.
V.2. Binarizarea
B=T(A)
255
0 P 255 a
Figura 5.1. Binarizarea
Binarizarea este o procesare punctuală din categoria preprocesări sau procesări low level. În multe aplicații prelucrarea propriu-zisă a imaginilor necesită o etapă preliminară de prelucrare desinată executării unor corecții. Operațiile din această categorie sunt considerate “simple” deoarece practic se face o transformare univocă de tipul:
(5.2.1.)
unde A={a(m,n);0m,nN-1} și B={a(m,n);0m,nN-1} sunt nivelele de gri ale pixelilor în imaginile inițială respectiv finală, iar T() este o funcție liniară care pentru binarizare are forma din Figura 5.1.
Caracteristica definitorie a acestei prelucrări simple este faptul că atât la intrarea cât și la ieșirea procesului este o imagine. Se poate de asemenea constata că valoarea pixelului din imaginea de ieșire este dependentă exclusiv de caracteristicile pixelului corespondent din imaginea de intrare.
Binarizarea imaginilor, adică transformarea intr-o imagine cu numai doua nuanțe, Funcția T de transfer este în acest caz:
(5.2.2)
unde P este pragul de binarizare.
Figura 5.2. Efectul binarizării cu prag P=128 asupra imaginii house.jpg
Pragul de binarizare are un rol foarte important în cadrul procesării deoarece funcție de valoarea sa se poate scoate în evidență anumite porțiuni ale imaginii.
V.3. Fereastră de gri
Fereastra de gri face evidențierea unei anumite porțiuni din gama de nuanțe de gri a imaginii. Acest procedeu este utilizat pentru a creste vizibilitatea unor anumite detalii fine, ce se diferențiază slab de fundalul local.
În esență, se poate spune că procedeul de față este mai radical decât accentuarea contrastului deoarece el păstrează sau accentuează contrastul în interiorul ferestrei eliminând restul.
În figura 5.3. este prezentată o caracteristică de transfer tipică pentru procedura în discuție. Se poate observa că porțiunea de interes (Lm , LM) este accentuată, restul gamei (0 , Lm)(LM , L-1) fiind transformată intr-un fondal uniform. Expresia matematică a unei astfel de transformări este:
(5.3.1.)
unde k este coeficientul de accentuare a contrastului în interiorul ferestrei, iar F este o nuanță oarecare ce se atribuie pentru toate gri-urile din afara ferestrei.
B=T(A)
L-1
LM
Lm
O Lm LM L-1 a
Figura 5.3. Fereastra de gri
Figura 5.2. Efectul ferestrei de gri cu prag P1=60 și P2=180 asupra imaginii cermet.jpg
Tehnici de tipul fereastră de gri sunt aplicate în analiza imaginilor multispectrale provenite de la sateliții geostaționari sau sondele spațiale interplanetare.
V.4. Histograma
Histograma unei imagini digitale A={a(m,n);0m,nN-1} este o funcție discretă h(i)=ni, unde, așa cum se arată în Figura 3.6, prin Li se notează nivelele de gri în ordine crescătoare de la 0 (negru) la LM-1 (albul cel mai strălucitor), iar ni este numărul de pixeli din imagine având nivelul i. În consecință se poate considera histograma unei imagini ca fiind statistica frecvenței de apariție a nuanțelor de gri.
Histogramele pun în evidență o serie de caracteristici ale imaginilor: Histogramele având majoritatea pixelilor în porțiunea apropiată de negru corespund unor imagini întunecate, iar cele cu majoritatea spre alb unor imagini luminoase; Histogramele cu valori nenule concentrate pe o porțiune relativ restrânsă a gamei de gri-uri corespund unor imagini cu contrast slab, iar cele cu valorile nenule distribuite în toată gama corespund unor imagini cu contrast puternic; Histogramele unor imagini simple (unul sau mai multe obiecte de culoare uniformă pe un fond de asemenea uniform de culoare net diferită) au doua maxime (unul pentru fondal și unul pentru obiect) și un minim pronunțat intre ele; Histogramele unor imagini complexe (multe obiecte de nuanțe diferite, figuri umane, etc.) au forme mai neregulate.
Figura 5.3. Imaginea Lena.jpg și histograma ei
V.5. Filtru de netezire
Cea mai simplă metodă de reducere a zgomotului în cazul de față este medierea în interiorul vecinătății pixelului procesat. Fiecare pixel este înlocuit cu media valorilor pixelilor vecini. Există doua variante de lucru: medierea octo-vecinilor sau doar a cadro-vecinilor, celor două corespunzându-le următoarele măști de convoluție:
(5.5.1.)
(5.5.2.)
Matricile pătrate de dimensiune 33 sunt cele mai des utilizate în practică.
Expresia matematică principială a procedurii este prin urmare:
(5.5.3.)
unde a(k,l) și b(m,n) reprezintă nivelul de gri la intrare și respectiv la ieșire al pixelului procesat, iar V este vecinătatea de N pixeli centrată pe aceasta. În mod evident, abaterea de la media locală a unor pixeli afectați de zgomot va fi micșorată cu condiția ca numărul pixelilor perturbații din vecinătatea V considerată să fie mic în comparație cu N.
Figura 5.4. Reducerea zgomotului în cele
patru cazuri reprezentate în imaginea water.jpg
V.6. Filtru median
Filtrul de netezire reduce zgomotul în imagine, dar se reduce uneori drastic claritatea imaginilor. Rezultate foarte bune se obțin în cazul zgomotului binar (de exemplu zgomotul de tip "sare și piper") prin utilizarea filtrului median care înlocuiește pixelul prelucrat cu mediana valorilor vecinilor săi din V:
b(m,n)=Median{a(m,n); (m,n)V} (5.6.1.)
Figura 5.5. Reducerea zgomotului în imaginea bnoise.jpg cu filtrul median
Măștile utilizate pot fi pătrate (în general 33, 55 sau 77), ori dreptunghiulare (31 sau 51), caz în care filtrarea denumită pseudo-mediana se execută în doi pași, întâi pe orizontală și apoi pe verticală imaginii rezultate după prima procesare. Numărul de operații este considerabil redus în comparație cu prelucrarea inițială.
Analizând cele expuse anterior se poate concluziona că operatorul median este neliniar. El are avantajul de a nu afecta muchiile, dar trebuie utilizat cu discernământ deoarece poate elimina punctele izolate și liniile subțiri.
V.7. Detecția conturului
O tehnică foarte des utilizată este filtrarea Laplace corespunzătoare operatorului Laplacian:
(5.7.1.)
implementat în tehnica digitală prin convoluționarea imaginii de prelucrat cu una din măștile spațiale:
(5.7.2.)
Fiind o derivată de ordinul al II-lea, Laplacianul este foarte sensibil la zgomote, iar rezultatul lui duce la muchii duble, ceea ce produce o serie de dificultăți ulterioare suplimentare. Acest ultim dezavantaj se elimină dacă se considera ca punct de contur, nu cel unde au rezultat maxime sau minime ale Laplacian-ului, ci trecerile prin 0.
Figura 5.6. Detecția conturului cu filtrul Laplace
în imagine R&R.jpg binarizată
Dacă dorim utilizarea unui filtru specializat pe o direcție anumită se pot alege prin intermediul filtrului Custom filtrări de forma:
Prewitt (5.7.3.)
Sobel (5.7.4.)
Kirsch (5.7.5.)
Izotropic (5.7.6.)
Figura 5.6. Detecția conturului cu filtrul Previt vertical
în imagine R&R.jpg binarizată
V.8. Transformata Hough
Figura 5.6. Transformata Hough
Este o transformată care transferă coordonatele din spațiul cartezian (x,y) în spațiul polar (r,). În acest fel se poate transforma o dreaptă din cartezian într-un punct din spațiul polar. Astfel se poate detecta, de exemplu, înclinarea scrisului de mână o caracteristică importantă în aplicațiile de recunoaștere a scrisului cursiv de mână ori a scrisului de mână cu caractere de tipar (foarte des utilizat la formularele tipizate).
Varianta de transformată Hough realizată în cadrul acestui proiect estimează și afișează sub formă de histogramă densitatea de unghiuri de contur în ecartul 90 într-o imagine în care s-a executat inițial binarizarea și detecția contururilor cu una din metodele anterior prezentate. Rezultatele unui asemenea lanț de procesări este arătat în figura 5.7.
Capitolul VI. Concluzii și perspective
Aplicația P_im este o aplicație construită pe trei module interdependente, dar relativ autonome. Aceste trei module corespund fiecare unui grup de familii de clase scrise astfel încât pe de o parte să reducă efortul de programare și pe de altă parte să asigure gradul de generalitate care să permită o eventuală reutilizare a claselor prototip în alte aplicații ulterioare având caracteristici mai mult sau mai puțin similare cu cea de face obiectul proiectului de față.
Această aplicație constă într-un program Java care cuprinde un set de procesări ce se pot clasifica în trei categorii:
procesări puctuale: binarizare, histograma, fereastră de gri
procesări regionale: netezire, median, Laplace, custom
procesari globale: transformata Hough
Aceste procesări reprezintă un set relativ suficient pentru aplicații de prelucrarea imaginilor de nivel mediu deoarece permite atât utilizarea fiecărei prelucrări în parte cât și combinarea lor în lanțuri de procesare complexe de felul celor oferite ca exemplu în secțiunile 5.6 și 5.7.
Imaginile rezultate în urma prelucrării pot fi salvate în fișiere pe hard-disk și reutilizate în cadrul aceluiași program de prelucrare sau în cadrul altor aplicații de genul Adobe Photoshop.
Avantajul esențial al aplicației este faptul că ea beneficiază de un cod robust având o formulă compactă, dar păstrând flexibilitatea programului care așa cum s-a văzut în capitolul anterior este capabil să rezolve o gamă largă de procesări simple și complexe astfel încât să poată rezolva diverse probleme concrete de îmbunătățire a imaginilor ori de extracție a unor detalii de interes din acestea.
Dezvoltarea ulterioară a programului ar trebui să aibă în vedere următoarele direcții principale:
Mărirea numărului de acțiuni disponibile
Flexibilizarea filtrului Custom
Crearea posibilității de a salva lanțul de acțiuni de prelucrare.
În cele ce urmează se vor detalia aceste idei cu oferirea unor soluții principiale pentru realizarea acestor dezvoltări.
Între acțiunile utile spre a fi implemntate se înscriu următoarele categorii:
egalizarea histogramei prin dezvoltarea comenzii Histograma și plasarea în fereastra de dialog a unui buton Egalizare;
modificarea globală sau pe porțiuni selectate a prin aplicarea unor transformate a scarii cromatice la comanda utilizatorului;
implementarea transformatelor geometrice principale
scalarea,
rotația,
centrarea obiectelor în imagine prin combinația translației cu scalarea și decuparea unor porțiuni
implementarea unor filtre des utilizate : Gausian, Roberts, etc. fără a mai fi necesară scrierea lor în Custom
implementarea unor filtre cu dimensiune de 55 nu doar cele 33 din aplicația actuală
Flexibilizarea filtrului Custom este orientată pe de o parte spre transformarea acestuia într-o variantă 55 capabilă să răspundă mai bine unor sarcini variate. De asemenea un asemenea filtru ar trebui dezvoltat în sensul posibilității de a reliza în mod eficient transformări multiple lucru posibil prin instanțierea mai multor obiecte F_cst care să poată fi folosite în paralel.
Salvarea lanțului de prelucrări se poate face prin stabilirea unor fișiere martor care să păstreze informații tip „history” care să cuprindă succesiunea de comenzi efectuate de utilizator și care să poată fi ulterior refolosite pentru a reproduce un experiment reușit fără efortul de memora sau a scrie notițe.
Nu consider necesară lărgirea gamei de tipuri de imagini ce pot fi procesate deoarece există la ora actuală programe foarte bune de conversie și deci orice format poate fi transformat în .jpg fără a se pierde calitatea imaginii.
O posibilă aplicație a programului P-im este includerea acestuia între utilitarele de service pentru o bază de date multimedia unde ar putea satisface atât cerința de afișare a imaginii prelutae prin intermediul unei interogări ci și un set de procesări asupra acesteia.
Bibliografie
Dan L. Lacrămă, „Prelucrarea imaginilor”, note de curs
Gui V., Lacrămă D.,Pescaru D., „Prelucrarea imaginilor”, Ed. Politehnica Timișoara, 2000
Sonca M., Hlavac V., Boyle R., „Image Processing”, Anlysis and Machine Vision” ed. Chapman & Hall, London U.K. 1993
Jain A.K. Jain R., ” Image Processing”, ed. Addison-Wesley New York USA, 1994
Douglas A. Lyon, „Image Processing in Java”, Prentice Hall Ptr, 1999
Donald Edwin Pearson „Image Processing” , McGraw-Hill, 1991
Tinku Acharya, Ajoy K. Ray, “Image Processing: Principles and Applications” , John Wiley & Sons, 3 oct. 2005
Rastislav Lukac, Konstantinos N. Plataniotis , “Color Image Processing: Methods and Applications” , CRC Press, 13 sept. 2006
Maria Petrou, Costas Petrou, “Image Processing: The Fundamentals” John Wiley & Sons, 24 mai 2010
Wilhelm Burger, Mark J. Burge, “Digital Image Processing: An Algorithmic Introduction Using Java“, Springer, 14 nov. 2009
Bibliografie
Dan L. Lacrămă, „Prelucrarea imaginilor”, note de curs
Gui V., Lacrămă D.,Pescaru D., „Prelucrarea imaginilor”, Ed. Politehnica Timișoara, 2000
Sonca M., Hlavac V., Boyle R., „Image Processing”, Anlysis and Machine Vision” ed. Chapman & Hall, London U.K. 1993
Jain A.K. Jain R., ” Image Processing”, ed. Addison-Wesley New York USA, 1994
Douglas A. Lyon, „Image Processing in Java”, Prentice Hall Ptr, 1999
Donald Edwin Pearson „Image Processing” , McGraw-Hill, 1991
Tinku Acharya, Ajoy K. Ray, “Image Processing: Principles and Applications” , John Wiley & Sons, 3 oct. 2005
Rastislav Lukac, Konstantinos N. Plataniotis , “Color Image Processing: Methods and Applications” , CRC Press, 13 sept. 2006
Maria Petrou, Costas Petrou, “Image Processing: The Fundamentals” John Wiley & Sons, 24 mai 2010
Wilhelm Burger, Mark J. Burge, “Digital Image Processing: An Algorithmic Introduction Using Java“, Springer, 14 nov. 2009
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Tehnici de Prelucrare a Imaginilor In Java (ID: 150679)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
