Prelucrari de Imagini

Introducere

Prelucrarea și analiza imaginilor (numită adeseori prescurtat doar prelucrarea imaginilor) s-a născut datorită ideii și necesității de a înlocui observatorul uman printr-o mașină. Este important de precizat că analiza imaginilor a mers mai departe decât simpla înlocuire a observatorului uman, deoarece au apărut soluții novatoare pentru probleme cu care acesta nu mai fusese confruntat – ca în cazul imaginilor non- vizibile (imagini acustice, ultrasonore, radar). După cum se știe, prelucrarea imaginilor înglobează posibilitatea de a dezvolta mașina totală de viziune, capabilă să realizeze funcțiile vizuale ale oricărei viețuitoare (desigur, după realizarea a importante dezvoltări teoretice și tehnologice).

Deci atâta vreme cât acceptăm ideea că unealta de lucru în prelucrarea imaginilor este calculatorul, și acesta la rândul său este digital, atunci și prelucrarea este la rândul ei digitală, ca un caz particular al oricărei prelucrări numerice. Desigur că există însă și prelucrări de imagini care sunt analogice – așa cum sunt toate prelucrările ce au loc în cadrul lanțului de transmisie și recepție a imaginii standard de televiziune.

Principiile esențiale legate de implementările practice ale sistemelor de prelucrarea și analiza imaginilor urmăresc două direcții, cu dezvoltare corelată: implementările software și dispozitivele hardware (de accelerare). După cum am arătat în capitolul introductiv, la descrierea structurii tipice a unui sistem de prelucrarea și analiza imaginilor, marea majoritate a implementărilor folosesc ca suport fizic pentru unitatea centrală de prelucrare un calculator obișnuit (compatibil PC); ceea ce îl particularizează este pachetul de programe rulate. Putem distinge două categorii fundamentale de astfel de programe: programe strict dependente de aplicație și programe de uz general.

Un program dependent de aplicație realizează doar algoritmii specifici operației pe care o execută sau supraveghează. Interacțiunea cu operatorul uman este minimă și calificarea acestuia nu este necesar să o depășească pe cea a unui tehnician. Adeseori programul trebuie să fie de timp real. Aceste variante de implementare sunt potrivite pentru procese caracterizate de parametri stabili și care se desfășoară în condiții ambiante (iluminare, poluare vizibilă — particule, fum) relativ constante și nu sunt portabile (fiind în general optimizate pentru o anumită structurai hardware).

Programele de uz general permit efectuarea unui mare număr de operații de prelucrarea și analiza imaginilor, cu numeroși parametri reglabili. Interacțiunea cu operatorul uman este mare și acesta trebuie să aibă o calificare superioară. Programele de acest tip nu sunt de timp real și în general sunt cuplate off- line cu instalațiile tehnologice propriu-zise, făcând parte mai ales din dotarea laboratoarelor de cercetare și de analiza calității și conformității. Interfața utilizator este cea care creează diferența între două categorii de programe, în ceea ce privește modalitatea în care operatorul specifică succesiunea de operații de executat. Din acest punct de vedere vom face distincția între menu-driven și flow-chart driven (deci programe controlate prin meniu sau prin graf de flux).

Deci atâta vreme cât acceptăm ideea că unealta de lucru în prelucrarea imaginilor este calculatorul, și acesta la rândul său este digital, atunci și prelucrarea este la rândul ei digitală, ca un caz particular al oricărei prelucrări numerice. Desigur că există însă și prelucrări de imagini care sunt analogice – așa cum sunt toate prelucrările ce au loc în cadrul lanțului de transmisie și recepție a imaginii standard de televiziune.

Principiile esențiale legate de implementările practice ale sistemelor de prelucrarea și analiza imaginilor urmăresc două direcții, cu dezvoltare corelată: implementările software și dispozitivele hardware (de accelerare). După cum am arătat în capitolul introductiv, la descrierea structurii tipice a unui sistem de prelucrarea și analiza imaginilor, marea majoritate a implementărilor folosesc ca suport fizic pentru unitatea centrală de prelucrare un calculator obișnuit (compatibil PC); ceea ce îl particularizează este pachetul de programe rulate. Putem distinge două categorii fundamentale de astfel de programe: programe strict dependente de aplicație și programe de uz general.

Un program dependent de aplicație realizează doar algoritmii specifici operației pe care o execută sau supraveghează. Interacțiunea cu operatorul uman este minimă și calificarea acestuia nu este necesar să o depășească pe cea a unui tehnician. Adeseori programul trebuie să fie de timp real. Aceste variante de implementare sunt potrivite pentru procese caracterizate de parametri stabili și care se desfășoară în condiții ambiante (iluminare, poluare vizibilă — particule, fum) relativ constante și nu sunt portabile (fiind în general optimizate pentru o anumită structurai hardware).

Programele de uz general permit efectuarea unui mare număr de operații de prelucrarea și analiza imaginilor, cu numeroși parametri reglabili. Interacțiunea cu operatorul uman este mare și acesta trebuie să aibă o calificare superioară. Programele de acest tip nu sunt de timp real și în general sunt cuplate off- line cu instalațiile tehnologice propriu-zise, făcând parte mai ales din dotarea laboratoarelor de cercetare și de analiza calității și conformității. Interfața utilizator este cea care creează diferența între două categorii de programe, în ceea ce privește modalitatea în care operatorul specifică succesiunea de operații de executat. Din acest punct de vedere vom face distincția între menu-driven și flow-chart driven (deci programe controlate prin meniu sau prin graf de flux).

Ceea ce trebuie subliniat (spre a evita anumite interpretări uzuale, dar eronate) este că aceste medii de programare avansate (gen Builder, Visual, etc..) nu preiau și atribuția de a scrie algoritmii specifici; ușurința construcției vizuale este legată strict de construcția interfeței aplicației, deci aspect grafic și eventual partea de preluare a datelor. Programatorul va dezvolta restul aplicației ca pentru un compilator clasic.

Concluzia ce rezultă din această scurtă discuție este aceea că, pentru orice aplicație, trebuie separata partea de interfața de partea de calcul specific. În cazul unui program de prelucrarea și analiza imaginilor acesta însemnă că trebuie făcută o proiectare la nivelul structurii de date (matricea ce conține valorile pixelilor din imagine și prelucrările specifice asupra acestora) și o proiectare la nivelul interfeței (care să

specifice cum se va face afișarea imaginilor pe ecran, cum vor fi scrise pe disc, cum se va face un eventual transfer dinamic al datelor de la sau către alte aplicații). Majoritatea covârșitoare a sarcinilor legate de interfață pot fi rezolvate fără a cunoaște nimic despre operațiile specifice prelucrării imaginilor și despre modul în care o imagine este reprezentată în memoria de lucru a calculatorului. Să considerăm de exemplu problema afișării unei imagini într-o fereastră. Fără îndoială că cel mai simplu mod de afișare este folosirea imaginii ca un canvas, înglobat în obiectul de tip fereastră, și de a cărui afișare se ocupă sistemul Windows. Această abordare exclude însă accesul la conținutul imaginii; aceasta trebuie deci separată de fereastra de afișare. Este poate deci preferabilă memorarea imaginii ca o matrice și transformarea acesteia într-o structură bitmap atașată ferestrei, la fiecare cerere de reafișare a acesteia.

În concluzie, putem afirma că prelucrarea și analiza imaginilor a reușit să câștige teren ca urmare a realizărilor spectaculoase ale tehnologiei electronice și informaticii. Creșterea continuă a puterii de calcul disponibile în unitățile de prelucrare ale calculatoarelor va transforma probabil în viitorul apropiat prelucrarea și analiza imaginilor dintr-o anexă nebuloasă și exotică a aplicaților speciale într-o soluție fiabilă de larg consum industrial.

Domeniul prelucrărilor de imagini

Între toate simțurile cu care suntem dotați, sistemul vizual ne furnizează cea mai mare cantitate de informații referitoare la mediul înconjurător. Cu toate că percepția vizuală este departe de a fi complet înțeleasă, ingineria modernă se preocupă intens de problema realizării unor sisteme de vedere artificială, capabile să emuleze, fie și parțial, capabilitățile sistemului vizual uman. În acest demers, s-au acumulat progrese importante în decursul ultimelor decenii, prin contribuțiile conjugate ale cercetărilor din matematică, fizică, electronică, tehnică de calcul, biologie, fiziologie, psihologie, inteligență artificială etc. Aflat într-un proces de dezvoltare rapidă, domeniul prelucrării imaginilor este unul interdisciplinar și pluridisciplinar.

Principiile esențiale legate de implementările practice ale sistemelor de prelucrarea și analiza imaginilor urmăresc două direcții, cu dezvoltare corelată: implementările software și dispozitivele hardware (de accelerare). După cum am arătat în capitolul introductiv, la descrierea structurii tipice a unui sistem de prelucrarea și analiza imaginilor, marea majoritate a implementărilor folosesc ca suport fizic pentru unitatea centrală de prelucrare un calculator obișnuit (compatibil PC); ceea ce îl particularizează este pachetul de programe rulate. Putem distinge două categorii fundamentale de astfel de programe: programe strict dependente de aplicație și programe de uz general.

În sens restrâns, obiectivul prelucrării numerice a imaginilor constă în transformarea imaginii în scopul facilitării interpretării vizuale sau al reducerii cerințelor de memorie pentru reprezentare sau stocare, respectiv al debitului de date sau benzii de frecvență necesare transmiterii la distanță. În sensul cel mai larg, prelucrarea poate urmări măsurarea unor parametri de poziție, viteză de mișcare sau formă al unor obiecte, recunoașterea obiectelor dintr-un cadru de imagine, interpretarea scenei sau recunoașterea tipului de activități ce sunt surprinse în videosecvențe. O reprezentare generală schematizată a etapelor de prelucrare a unei imagini este redată în Figura 1.1. Nu întotdeauna toate etapele reprezentate sunt necesare.

Imaginile supuse prelucrării sunt adesea afectate de ceea ce denumim generic “zgomot”. Agitația termică a electronilor în senzorii de imagine și în dispozitivele și circuitele electronice utilizate în amplificarea și conversia digitală a imaginii este doar una din numeroasele surse ce afectează calitatea acesteia. Imperfecțiuni ale sistemului optic, turbulența atmosferică, fenomenele meteo, iluminarea neuniformă, sau umbrele sunt alți factori ce fac necesară dezvoltarea tehnicilor de preprocesare. Tehnicile de preprocesare sunt clasificate în tehnici de ameliorare și de tehnici de restaurare a imaginilor. În restaurare, prelucrarea este ghidată de un model fizic riguros al procesului de degradare ce se dorește a fi inversat.

ACHIZIȚIE IMAGINE

PREPROCESARE

SEGMENTARE

MODEL

DESCRIERE

RECUNOAȘTERE FORME

ANALIZĂ/ INTERPRETARE

Figura 1.1 – Etape ale procesului de prelucrare și analiză a imaginii

Un exemplu de operație de preprocesare este eliminarea zgomotului, cu ajutorul unui filtru de netezire, așa cum se ilustrează pentru imaginea de angiocardiografie radionuclidică de echilibru din figura 1.2.

Figura 1.2 – Exemplu de filtrare de netezire a unei imagini

Prin segmentare, se urmărește fragmentarea imaginii într-o serie de regiuni, pe baza unor atribute ale imaginii ce sunt aproximativ constante în fiecare regiune dar diferă semnificativ de la regiune la regiune. Ideal, regiunile corespund obiectelor sau unor părți de sine stătătoare ale acestora. Un exemplu de segmentare a ventriculului stâng în imaginea din exemplul anterior se găsește în figura 1.3.

Fig. 1.3 – Exemplu de segmentare a ventriculului stâng (mărit la scara 2:1).

În aplicațiile de recunoaștere a formei, obiectul segmentat este supus unor operații de extragere de trăsături caracteristice, ce descriu forma sau textura segmentului și stau la baza procesului ulterior de clasificare, pe baza vectorului descriptor al caracteristicilor. În aplicație de analiză a imaginii scintigrafice, segmentarea are ca obiectiv măsurarea volumului de sânge din ventriculul stâng în imaginile corespunzătoare celor două faze extreme (sistolă și diastolă) ale ciclului cardiac. Pe baza lor, se poate determina fracția de ejecție a ventriculului stâng, FE = (Vmax-Vmin) / Vmax , reprezentând un indicator important al sinergiei mișcării de contracție și stării de sănătate a inimii.

Conversia analog numerică a imaginilor

Orice imagine cu dimensiuni finite din lumea reală conține o infinitate de puncte. Pentru a putea fi reprezentată în formă numerică și stocată în memoria unui calculator, este necesar un proces de conversie analog/digitală. În esență, conversia analog/digitală implică două operații distincte: eșantionarea imaginii și cuantizarea ei.

Eșantionarea imaginilor

Eșantionarea poate fi definită ca un proces prin care, dintr-o mulțime conținînd un număr (posibil infinit) de elemente se extrage o submulțime cu un număr finit de elemente.

În contextul imaginilor, eșantionarea asigură prelevarea informației referitoare la intensitatea sau culoarea imaginii în puncte situate într-o rețea cu pas constant, numită și grilă de eșantionare (Figura. 1.4).

Figura 1.4 – Grilă de eșantionare rectangulară, uniformă

Reconstrucția exactă a imaginii originale pe baza eșantioanelor prelevate este posibilă teoretic dacă imaginea este un semnal de bandă limitată și pasul de eșantionare este mai mic decît o limită stabilită de teorema eșantionării.

Pasul critic de eșantionare este invers proporțional cu dublul benzii de frecvență.

De notat că imaginile din lumea reală nu sunt semnale de bandă limitată. Pentru limitarea benzii este necesară utilizarea unui filtru de tip trece jos înainte de eșantionare sau concomitent cu acest proces. În literatură, acest filtru este denumit curent ”anti alias”, iar erorile pricinuite de neutilizarea unei asemenea filtrări ”erori alias”. Așa cum se ilustrează în exemplul unidimensional din figura 1.5, erorile alias pot produce în unele situații o alterare semnificativă a rezultatului eșantionării.

12

Rezultat

eșantionare

x

x

x

Fig. 1.5 – Exemplu de eroare alias la eșantionarea unui semnal sinusoidal, de perioadă spațială , cu nerespectarea condiției x < 1/2 .

Imaginile folosite curent în prelucrare conțin între 64 64 eșantioane (pixeli) și 2048 2048 eșantioane. În figura 1.6 a), este redată o imagine în formatul 256 256 pixeli, în timp ce versiunea subeșantionată la 64 64 de pixeli este redată în Figura 1.6 b). Înainte de reeșantionare, imaginea a fost filtrată cu un filtru anti alias (trece-jos).

Numărul de pixeli de pe linie stabilește rezoluția pe orizontală, în timp ce numărul de pixeli de pe

coloană stabilește rezoluția verticală a imaginii. În optică, rezoluția se măsoară in inversul unei unități de grad. Acuitatea vizuală corespunde unui unghi de aproximativ 2 minute. Detalii ce se proiectează pe pupilă sub un unghi mai mic decât acesta nu mai sunt percepute distinct.

b)

Figura 1.6 – Eșantionarea: a) imaginea originală, de 256 256 pixeli; b) imaginea subeșantionată la

64 64 pixeli.

Cuantizarea imaginilor

Imaginile reale (analogice) conțin o infinitate de nuanțe de gri sau culori. Având în vedere faptul că eșantioanele imaginii sunt reprezentate după conversie folosind un număr finit de biți, rezultă și un număr finit de niveluri posibile.

Mărimile care pot lua un număr finit de valori se numesc cuantizate, iar operația prin care o mărime continuă se transformă într-una cuantizată se numește cuantizare.

Imaginea din figura 1.6 este reprezentată pe 8 biți, ceea ce corespunde la un număr maxim de 28 = 256 niveluri de gri. În figura 1.7, aceeași imagine este reprezentată succesiv pe 32, 16, 8, 4 și 2 niveluri de gri, folosind cuantizare cu pas constant, numită cuantizare uniformă. Se poate remarca la aceste imagini apariția unor contururi false (fenomen de conturare) în zone de imagine netede, cu variații lente ale luminanței. Fenomenul de conturare este o consecință a erorilor introduse de procesul de cuantizare. Conturarea este nu este perceptibilă în imagini redate pe 128 sau 64 de niveloride gri, motiv pentru care acele imagini nu au fost incluse în figură. Practic, erorile sau zgomotul de cuantizare din acele imagini rămân imperceptibile ochiului. Cu toate acestea, zgomotul de cuantizare produce efecte nedorite asupra unor operatori de prelucrare sensibili la zgomot, cum sunt cei de derivare, folosiți la extragerea contururilor.

Cuantizarea uniformă nu asigură o reprezentare optimă, cu eroare medie patratică minimă, decât pentru cazul particular în care nivelurile de gri au o distribuție uniformă. Presupunând că se dorește cuantizarea unei variabile f pe un număr specificat, de Q niveluri de cuantizare, legea de cuantizare.

b) c)

d) e)

Figura – 1.7. Cuantizare uniformă. Imagine cu: a) 32 niveluri de gri; b) 16 niveluri de gri; c) 8 niveluri de gri; d) 4 niveluri de gri; e) 2 niveluri de gri.

O lege de cuantizare poate fi specificată prin precizarea subdomeniilor mărimii de intrare, f, care se transformă în fiecare nivel de ieșire, ri, numit nivel de reconstricție. Subdomeniile sunt delimitate de niveluri de decizie, dk, fig. 1.8.

Deoarece sistemele de achiziție a imaginilor sunt proiectate de cele mai multe ori pentru a servi aplicații diverse, distribuția nivelurilor de gri la conversia analog numerică este în general necunoscută. În medie se poate considera uniformă. În plus, sistemele de achiziție contemporane asigură o cuantizare suficient de fină pentru a reduce importanța problemei minimizării erorilor de cuantizare. Totuși, în numeroase situații, optimizarea procesului de cuantizere a imaginilor rămâne de actualitate. Este cazul compresiei imaginilor sau al tipăririi imaginilor color folosind o paletă redusă de culori.

ieșire

r2

d-3 d-2

r1

r

d1 d2 d3

r-2

Figura – 1.8. Exemplu de lege de cuantizare

Uzual distribuția nivelurilor de gri în imagine este neuniformă. Considerând numărul nivelurilor de cuantizare, Q, fix se pune problema determinării nivelurilor de decizie și a nivelurilor de cuantizare, astfel încât un anumit criteriu de optimizare să fie realizat. Se presupune cunoscută distribuția nivelurilor degri (histograma nivelurilor de gri). Cel mai frecvent se impune minimizarea erorii medii patratice, EMP. Se demonstrează [Max 1960] că soluția îndeplinește condițiile următoare:

Nivelurile de reconstrucție sunt valorile medii (centroizii) variabilei cuantizate în interiorul fiecărui interval determinat de nivelurile de decizie.

Nivelurile de decizie sunt situate la distanțe egale de nivelurile de reconstrucție ale intervalelor adiacente.

Prima condiție stabilește că fiecare interval este reprezentat (reconstruit) prin valoarea medie a nivelului de gri în interiorul său. De observat că valoarea medie coincide cu mijlocul intervalului numai dacă variabila este distribuită uniform în interiorul intervalului respectiv. Notând cu pi probabilitatea de apariție a nivelului fi și cu Ik intervalul reconstruit prin rk, avem expresia valorii medii:

pi fi

r fi Ik .

(1.1)

k

i

fi Ik

Condiția a doua plasează nivelurile de decizie la jumătatea distanței dintre două niveluri de reconstrucție, ceea ce asigură alocarea fiecărui nivel de intrare la nivelul de ieșire cel mai apropiat.

Soluția optimă poate fi obținută prin metode numerice. Pentru unele legi de distribuție mai frecvent întâlnite în prelucrarea semnalelor (Gauss, Laplace etc.), rezultatele cuantizării optimale sunt tabelate și pot fi consultate în literatura de specialitate. Pentru legi mai generale, se pot folosi cu succes algoritmi de învățare nesupervizată (de exemplul algoritmul mediilor).

Caracterizarea matematică a imaginilor numerice

Există diferite modalități de a interpreta din punct de vedere matematic o imagine numerică. Astfel, imaginea poate fi considerată o secvență bidimensională (2D) discretă, definită pe o grilă de format M N, cu elementul general f(x,y), x = 0,1,…,N-1, y = 0,1,…,M-1. Alternativ, imaginea poate fi reprezentată ca o matrice F, de format M N:

f0,0

f1,0

F

f0,1 

f1,1 

 

f0,N 1

f1,N 1

(1.2)

fM 1,0

fM 1,1 

fM 1,N 1

Un element al imaginii, f(x,y) sau fm,n este denumit curent pixel (de la termenii din limba engleză ”picture” plus ”element”). Într-o imagine monocromatică, pixelul este un scalar, reprezentând luminozitatea sau nivelul de gri. La imaginile color, pixelul devine un vector,

r(x, y)

c(x, y)

g(x, y)

b(x, y)

(1.3)

reprezentând componentele tricromatice ce definesc culoarea. De asemenea, imaginea color poate fi reprezentată cu ajutorul a trei matrici R,G și B, a trei secvențe 2D, sau a unei matrice 3D de format M N 3. Imaginile multispectrale furnizate de sateliții de teledetecție conțin mai mult decât trei componente, uzual 10-15.

Uneori este mai convenabil să reprezentăm imaginea unidimensional, ca un vector lung, f, obținut de exemplu prin concatenarea coloanelor imaginii. Un element al imaginii poate fi referit în acest caz printr-un singur indice, de exmplu fk.

Vecinătăți

Vecinătățile V4 și V8 ale unui pixel p sunt definite grafic în Fig. 2.5. Prima conține numai vecinii orizontali și verticali, în timp ce a doua îi include și pe cei diagonali. Considerente legate de analiza topologică a imaginilor bitonale (cuantizate pe un singur bit) impun utilizarea ambelor definiții. Doi pixeli situați reciproc în vecinătatea V4 a celuilalt se numesc 4-conecși sau 4-adiacenți. Doi pixeli situați reciproc în vecinătatea V8 a celuilalt se numesc 8-conecși sau 8-adiacenți.

Distanțe

Distanța euclidiană între doi pixeli, de coordonate p = (xp,yp) și q = (xq,yq) se calculează cu ajutorul ecuației:

d ( p, q)

(xp

x )2

( yp

1

y )2 2 .

(1.4)

Alte tipuri de distanță folosite în prelucrarea numerică a imaginilor sunt distanța d4 (”block city distance”):

d4 ( p, q)

| xp

xq |

| yp

yq | .

(1.5)

și d8 (”chessboard distance”):

d8 ( p, q)

max{| xp

xq |,| yp

yq |}

(1.6)

Cercurile de rază unitară, definind cele mai mici vecinătăți în imaginile digitale sunt ilustrate în figura 1.9.

y-1 y y+1

x-1 x x+1

y-1 y y+1

x x+1

b)

Figura – 1.9. Vecinătățile unui pixel. a) Vecinătatea V4; b) Vecinătatea V8;

Obiectivele filtrării imaginilor

Prin filtrarea imaginilor, se urmărește eliminarea selectivă a informației ce nu prezintă interes din punctul de vedere al obiectivelor analizei imaginii, concomitent cu păstrarea informației utile. Informația ce se dorește a fi eliminată este denumită “zgomot”, datorită probabil celei mai vechi probleme de filtrare abordate în electronică : reducerea zgomotului produs de amplificatoare. Un exemplu de imagine afectată de zgomot și filtrată este prezentat în figura 1.10.

Figura 1.10 – Exemplu de filtrare pentru atenuarea zgomotului

Abordarea tradițională a problemei filtrării prin sisteme liniare, spațial invariante, are la bază descompunerea (reală sau ipotetică) a semnalului supus filtrării în componente de frecvență. Proiectarea filtrului se concentrează, în această abordare, pe realizarea atenuării și eventual defazării dorite pentru fiecare componentă spectrală. De aici și denumirile consacrate : filtru trece-sus, trece-jos, trece-bandă, oprește bandă etc. Datorită faptului că toate celelalte tipuri de filtru pot fi sintetizate pornind de la un filtru trece-jos, acest tip de filtru ocupă cel mai însemnat loc în lucrările dedicate filtrelor liniare. Capitolul prezent urmează aceeași tendință, prin concentrarea pe filtre de netezire. Termenul de netezire a imaginilor este nu numai mai sugestiv decât cel de filtru trece jos pentru imagini, ci și mai general, fiind adecvat și pentru filtrele neliniare care sunt robuste și la care ne referim în principal. Pentru o perspectivă mai largă, este inclusă și o scurtă prezentare a tehnicilor de netezire liniare.

Succesul oricărei operații de prelucrare a imaginii sau, mai general, al oricărui proiect ingineresc, depinde în primul rând de măsura în care cerințele reale ale utilizatorului sunt incorporate în modelarea matematică a problemei. Evoluția tehnicilor de netezire a imaginilor reflectă această realitate, prin tendința de modelare din ce în ce mai exactă a cerințelor. În netezirea imaginilor, o cerință importantă o reprezintă păstrarea contururilor.

Operatori de netezire liniari

Operatorii de netezire liniari pot fi considerați operatori de filtrare de tip trece-jos. Efectul lor asupra spectrului Fourier constă în atenuarea componentelor de înaltă frecvență. Proiectarea filtrelor de netezire a imaginilor se concentrează cel mai frecvent pe domeniul spațial și nu cel de frecvență, datorită dificultății de a găsi formularea precisă a răspunsului în frecvență dorit. De exemplu, un filtru trece-jos cu a anumită bandă de trecere, produce numeroase oscilații la apariția unui semnal de tip treaptă, un efect cât se poate de indezirabil.

Medierea aritmetică. Filtrul uniform

Medierea aritmetică este una din cele mai simple metode de eliminare a zgomotului, utilizată cu succes și în tehnica măsurării. Să presupunem că se captează o imagine statică f, afectată aditiv de

zgomotul n. Putem presupune că zgomotul este alb și are dispersia 2. Mai presupunem că se captează N

cadre de imagine. Prin medierea aritmetică a imaginilor captate, obținem:

1 N

g

N k 1

( fk

nk )

1 N

fk

N k 1

1 N

N k 1

nk .

(1.7)

Pentru că imaginile captate, fk sunt statice, ele sunt toate identice și egale cu imaginea ideală, f. În consecință,

1 N

g f + nk .

N k 1

(1.8)

Zgomotul în imaginea mediată este

1 N

z nk .

N k 1

(1.9)

Matricea de covarianță a zgomotului la ieșire este:

K E{zzT }

N N

1 N N

E{ n nT }

N k 1 l 1

1 E{n nT }

k l

k 1 l 1

N

1 E{n nT }

N 2I= 1

2I=

2I.

N k 1

N N (1.10)

Se observă că zgomotul rămâne alb și dispersia scade de N ori, respectiv abaterea standard de

N ori. Acest gen de mediere aritmetică temporală este mijloc de eliminare a zgomotului deosebit de eficient. Teoretic N poate fi oricât de mare. Practic, N este limitat numai prin faptul că imaginea poate să nu rămână statică un timp nelimitat.

De cele mai multe ori, dispunem de un singur cadru de imagine, astfel că procedura de eliminare a zgomotului prin mediere în timp, nu este realizabilă. În locul ei, putem folosi medierea spațială prin convoluția cu filtrul uniform de dimensiuni L L:

1 1 1

1 1 1 1

h L2

  1

1 1 

1 . (1.11)

Presupunând că zgomotul este alb, și acest filtru reduce abaterea standard a zgomotului de L ori.

Filtrul uniform posedă o proprietate de optimalitate, în sensul că, media aritmetică furnizează o estimare de eroare pătratică minimă a intensității dintr-o fereastră cu un nivel constant. Într-adevăr, fie fk elementele imaginii cuprinse într-o fereastră oarecare, conținând N pixeli. Se caută un estimator, g, astfel încât eroarea

2 (g)

N

( fk g)

k 1

(1.12)

să fie minimă. Punând condiția:

2 ( g)

0,

g (1.13)

obținem după calcule simple soluția:

gˆ 1

N

N

fk

k 1 . (1.14)

Este de așteptat, prin urmare, ca filtrul uniform să funcționeze excelent în regiunile uniforme, în care ipotezele ce au condus la optimalitatea soluției de mediere aritmetică sunt întrunite. Pentru utilizarea adecvată a filtrului uniform, aceste ipoteze, sau, echivalent, modelul optimizat trebuiesc conștientizate.

Cu totul alta este funcționarea filtrului în regiunile neuniforme, de tipul muchiilor. În fig. 1.11 este redată o muchie ideală de tip treaptă 1D și rezultatul medierii aritmetice cu un filtru uniform de lungime

L. Filtrul produce o degradare a conturului ce se manifestă vizual prin estomparea tranzițiilor din zonele de contur, echivalând cu pierderea clarității imaginii. Rezultatul ar trebui să nu surprindă, pentru că în vecinătatea muchiei, modelul de imagine constantă este invalidat.

muchie idealã

rezultat mediere aritmeticã

L

Figura 1.11 – Efectul unui filtru uniform de lungime L asupra unei muchii treaptă 1D.

Rezultatele filtrului cu mediere aritmetică cu fereastră de 5×5 asupra unei imagini este ilustrat în figura 1.12. Dimensiunea ferestrei influențează decisiv proprietățile filtrului uniform. Creșterea ei conduce la eliminarea mai drastică a zgomotului, prin reducerea abaterii standard proproțional cu radicalul numărului elementelor din fereastră. În același timp, efectul advers al filtrului asupra muchiilor se agravează, alegerea dimensiunii ferestrei fiind bazată pe un compromis între gradul de suprimare a zgomotului și pierderea clarității contururilor.

Modelul de imagine constantă în fereastră care a condus la filtrul cu mediere aritmetică ignoră complet caracterul zgomotului ce se presupune a fi eliminat. Să presupunem că zgomotul este aditiv, independent si identic distribuit în fereastra de filtrare și că distribuția este una de tip Gaussian, cu medie nulă și dispersie necunoscută. Deoarece semnalul imagine este presupus constant, în fereastră, acesta

poate fi modelat ca având o distribuție Gaussiană, cu media nenulă și necunoscută, , egală cu nivgelul semnalului și cu dispersie nenulă, egală cu a zgomotului și de asemenea, necunoscută. Neglijând efectele cuantizării în imaginea digitală, putem exprima densitatea de probabilitate a imaginii f prin:

Figura 1.12 – Rezultatele filtrului de mediere aritmetică cu mască de 5×5 pixeli

p( f | )

ct.exp{

( f )2

}

2 2

(1.15)

Probabilitatea de a observa mulțimea eșantioanelor {fk , k=1,2,…,N} în fereastră devine (folosind independența distribuțiilor),

N

p( fk | )

k 1

ct.exp{

1 N

2 k 1

( fk

)2 }

(1.16)

Prin logaritmarea exprsiei, devine evident că această probabilitate este maximizată pentru

1 N

N k 1

fk

, (1.17)

adică pentru constanta egală cu media aritmetică a eșantioanelor.

Filtre de netezire neliniare

Metodele de netezire liniare funcționează bine în regiunile de imagine netede, afectate de zgomot cu distribuție gaussiană, dar au probleme în prezența zgomotului în impulsuri, de tipul produs de erorile introduse de canale de comunicație digitală afectate de perturbații. Un asemenea zgomot se caracterizează prin faptul că pixelii afectați sunt relativ distanțați spațial, dar amplitudinea erorii este mare, valoarea pixelului afectat de zgomot părând să nu mai aibă vreo legătură cu valoarea corectă. Acest tip de zgomot mai este denumit zgomot de canal sau zgomot de tip sare și piper, de la aspectul produs în imagine (figura

1.14 a).

b)

c) d)

Figura 1.14 – Imagine cu zgomot binar: a) imaginea cu zgomot, b) filtru median 5 5, c) filtru uniform 5 5, d) filtru binomial 5 5

Filtrele liniare cu mediere sau cu mediere ponderată, vezi figura 1.14. c) și d), au o eficacitate modestă în prezența unui asemenea zgomot. Prin mediere, impulsurile scad în intensitate, dar se redistribuie pe suprafață mai mare, vizibilitatea lor fiind puțin influențată favorabil de operația de filtrare liniară. Concomitent, se manifestă și efectul nefavorabil al filtrelor liniare, de estompare a contururilor. Atât zgomotul binar cât și contururile violează flagrant ipotezele de optimalitate pentru filtrele liniare. Prin comparație, filtrul median 5 5 (figura 1.14 b), elimină aproape integral zgomotul binar și în același timp afectează mai puțin redarea contururilor.

Filtrul median este un operator neliniar, ce înlocuiește fiecare pixel cu mediana pixelilor aflați într- o fereastră centrată în jurul acestuia. Mediana unui șir de numere reprezintă elementul aflat la mijlocul șirului, după ordonarea lui. Prin ordonare, vom înțelege în general ordonarea în sensul crescător, deși acest aspect este neimportant din punctul de vedere al definiției medianei. Schema bloc a procedeului de prelucrare pentru un pixel de ieșire este redată în figura 1.15. Vom nota cu f1, f2, …, fN pixelii din

fereastră și cu f(1), f(2), …, f(N) pixelii din șirul ordonat. Rezultatul prelucrării este f(m) , cu proprietatea: m = (N + 1) / 2. De menționat că numărul elementelor din fereastră, N, se alege impar, astfel ca m să fie un număr întreg .

f1 f2

. ordonare

.

.

fN

f(1)

f(2)

.

.

.

f(N)

selecție f(m) mediană

Figura 1.15 – Schema-bloc a filtrului median

Un exemplu de calcul pentru un filtru median cu fereastră pătrată de 3 3 pixeli se dă în Figura 1.16.

6

2, 3, 3, 4, 6, 7, 7, 7, 8

Figura 1.16 – Exemplu de calcul al medianei într-o fereastră pătrată 3 3

Proprietăți ale filtrului median

– Neliniaritate

Selecția este o operație neliniară. Astfel,

mediana{ f1 + f2} mediana{ f1} + mediana{ f2}. (1.18) Totuși,

mediana{c f } = c mediana{ f }, (1.19)

mediana{c + f } = c + mediana{ f }. (1.20)

Efectul asupra mediei

Mediana modifică media imaginii, dacă distribuția intensității este nesimetrică.

Optimalitate

Asemenea filtrului de mediere aritmetică, filtrul median posedă o anumită proprietate de optimalitate, în sensul că furnizează o estimare de eroare minimă a intensității dintr-o fereastră cu un nivel

constant. În acest caz însă, eroarea minimizată este definită prin suma abaterilor în modul față de nivelul estimat:

N

( f (m) ) | f k

f (m) |

k 1 (1.21)

Pentru a demonstra acest fapt, grupăm termenii sumei în mod convenabil:

( N 1)/2

( f (m) ) (| f ( k )

k 1

f (m) | | f ( N k )

( N 1)/2

f (m) |) ( f ( N k )

k 1

f ( k ) )

. (1.22)

Să presupunem că selectăm la ieșirea filtrului un element diferit de mediană, de exemplu f(m 1).

Eroarea devine:

( N 1)/2

( f (m 1) ) (| f ( k )

k 1

f (m 1) | | f ( N k )

f (m 1) |) | f (m)

f (m 1) |

( f (m) ) | f (m)

f (m 1) |

(1.23)

Continuând raționamentul, obținem pentru orice selecție a unui rang q mai mic decât m,

m 1

( f (q ) ) ( f (m) ) | f (q 1)

k q

f (q ) |

, (1.24)

deci eroarea este mai mare decât la mediană. Similar se arată că eroarea este mai mare pentru oricare q>m.

Această proprietate a filtrului median, de a minimiza suma distanțelor la restul eșantioanelor din ferestră, poate servi și ca definiție mai generală a filtrului median, valabilă și pentru date vectoriale, de exemplu imagini color. Prin aplicarea independentă a filtrului median asupra componentelor color (de exemplu R,G,B) nu se mai garantează selecția medianei pentru cele trei componente de la același eșantion din fereastră, putând rezulta culor false, mai ales la zonele de tranziție dintre obiecte.

Rejecția zgomotului

Așa cum s-a menționat deja, filtrul median este deosebit de eficient în rejecția zgomotului binar. Să presupunem că într-o zonă cu nivelul de gri constant se injectează un zgomot contând în impulsuri, de mare amplitudine. Cât timp proporția pixelilor afectați de zgomot este sub 50% în fereastra de filtrare, filtrul median reconstituie semnalul perfect, ca și cum zgomotul nu ar fi existat! Pe de altă parte, filtrul median are performanțe mediocre în prezența zgomotului gaussian, pentru care filtrele liniare sunt mai bine adaptate.

Efectul asupra muchiilor

Filtrul median păstrează muchiile mult mai bine decît filtrele de netezire liniare. O muchie treptă este redată perfect, pentru că filtrul median nu mediază ci selectează un anumit pixel din fereastră. Filtrul median păstrează rampele de luminanță.

Efectul asupra punctelor, colțurilor și a liniilor subțiri

O proprietate uneori mai puțin favorabilă a filtrului median este aceea că el șterge punctele izolate, colțurile, liniile subțiri, și alte detalii de dimensiuni reduse în comparație cu fereastra de filtrare. Câteva exemple concludente sunt ilustrate în Fig. 2.17.

Aplicare repetată

Filtrul median poate fi aplicat în mod repetat, rezultând o netezire mai pronunțată. După un număr de iterații, ieșirea tinde să se stabilizeze, deși acest lucru nu se întîmplă în mod necesar.

Filtrul median separabil

Aplicarea succesivă a unui filtru median cu fereastră orizontală și a unuia cu fereastră verticală definesc filtrul median separabil. Filtrul separabil nu este echivalent cu un filtru cu fereastră rectangulară, dar are performanțe apropiate. Avantajul filtrului separabil constă în reducerea numărului de operații. Câștigul este mai mare decât la filtrele liniare, pentru că numărul mediu de comparații crește pătratic cu numărul elementelor din fereastră.

imagine test de intrare

rezultatul prelucrării cu filtrul median cu fereastră de 3 3 pixeli

Figura 1.17 – Efectul filtrului median cu fereastră pătrată 3 3 asupra unor imagini-test

Unele din deficiențele exemplificate pot fi remediate prin utilizarea unei ferestre în formă de cruce (Figura 1.18).

rezultatul prelucrării cu filtrul median cu fereastră în formã de cruce, cu 9

Figura 1.18 – Rezultatul prelucrării imaginilor-test din figura 1.17, cu filtrul median cu fereastră în

formă de cruce, cu 9 elemente

Variante ale filtrului median

Filtrul median ponderat sau mediana cu repetiții se definește cu ajutorul unei măști cu ponderi, asemănător filtrelor liniare. Ponderea fiecărui pixel indică de cîte ori se repetă acel pixel pentru a fi introdus în șirul ordonat. Procedeul permite să li se acorde pixelilor o importanță dependentă de poziția lor în fereastră. În general, pixelii centrali vor fi ponderați mai puternic. De menționat că ponderile pot fi și numere neîntregi. Mediana se obține pornind de la o extremă a șirului ordonat și însumând ponderile aferente eșantioanelor șirului până când se cumulează jumătate din suma totală a ponderilor acordate. Un exemplu se dă în figura 1.17. Filtrul median cu repetiții păstrează contururile mai bine decât filtrul median convențional. În același timp, eficiența lui în eliminarea zgomotului binar este diminuată.

6

2, 2, 3, 3, 3, 3, 4, 6, 6, 7, 7, 7, 7, 7,

Figura 1.19 – Filtrul median ponderat

Filtrul median multiplu este conceput în ideea detecției și păstrării structurilor locale coerente, de tipul liniilor subțiri sau al curbelor, concomitent cu rejecția energică a zgomotului în impulsuri (figura 1.18).

Răspunsul filtrului este mediana medianelor celor patru regiuni și a pixelului central.

1.4 Accentuarea contururilor și a detaliilor în imagine

Analiza imaginilor poate avea ca obiectiv examinarea unor structuri locale de dimensiuni reduse, de tipul liniilor subțiri, punctelor etc. Fisurile în lagărele de safir pentru pivoți, utilizate în mecanica fină, sau accidentele vasculare în angiografia de contrast sunt asemenea exemple.

1.4.1 Filtre trece-sus

Creșterea vizibilității detaliilor fine poate fi obținută prin operații de filtrare de tip trece-sus.

O modalitate simplă și convenabilă de a obține accentuarea frecvențelor înalte este de a scădea din imagine o versiune filtrată cu un filtru trece-jos. Operația se poate scrie:

Lf = f g cf

Lf ,

(c

Lf ,

(1.25)

unde c 1 este o constantă care controlează gradul de accentuare a detaliilor. Denumită “unsharp masking”, tehnica este cunoscută din domeniul fotografic. Imaginea filtrată trece-jos se obține prin expunerea defocalizată iar scăderea prin adunarea negativului. Folosind un filtru uniform 3 3 și c = 10, obținem operatorul trece-sus

Alți operatori 3 3 generați prin acest procedeu sunt:

(1.26)

(1.27)

1 2

sh 2 13

1 2

1

2

1 . (1.28)

De remarcat că operatorii astfel obținuți au suma ponderilor unitară, deci păstrează media imaginii.

Operatorul definit de ecuația (1.25) poate fi interpretat ca o însumare a imaginii cu imaginea filtrată cu un operator de ordinul doi, ce aproximează discret un laplacian:

1

Lh 1 4

1

1

. (1.29)

În figura 1.20, este ilustrat rezultatul filtrării unei imagini cu operatorul trece-sus definit prin ecuația (1.29).

Figura 1.20 – Imagine filtrată cu operatorul trece-sus definit prin ecuația (2.29)

Datorită prezenței operațiilor de scădere (de tip derivativ), este posibilă (și în general se și produce) depășirea gamei dinamice inițiale a imaginii. La implementare, este necesar să se trateze atent acest aspect, prin transformarea scării de gri.

Analiza și modelarea sistemului informațional

Una dintre condițiile ce trebuie îndeplinite ca un proiect să aibă succes este aceea ca cerințele proiectului să fie definite într-o manieră care să permită o ușoară înțelegere, indiferent de nivelul de pregătire informatică al celui care este implicat în proiect. De asemenea, modificările ce apar pe parcurs în cerințe trebuie să fie cu ușurință asimilate de către membrii echipei de dezvoltare.

Diagramele de cazuri de utilizare au rolul de a reprezenta într-o formă grafică funcționalitățile pe care trebuie să le îndeplinească sistemul informatic în faza sa finală. De aceea modelul realizat de diagramele de cazuri de utilizare alături de documentele de descriere succintă a fiecărui caz de utilizare determinat, poartă numele de model al cerințelor sistemului.

Analiza problemei

În calitate de limbaj de modelare a fost ales UML. Unified Modeling Language (UML) este un limbaj standard pentru scrierea de schițe software. În acest context, scopul UML este vizualizarea, specificarea, construirea și documentarea artefactelor unui sistem software-intensiv, orientat pe obiect UML poate fi definit, pe scurt, ca un limbaj de vizualizare, specificare, construire și documentare a modelelor. Valoarea lui constă în următoarele:

este un standard deschis;

realizează întreg ciclul de viață al dezvoltării software-ului,

acoperă multe tipuri de aplicații,

este bazat pe marea experiență a celor care l-au realizat,

este implementat de multe produse de tip CASE.

În calitate de instrument de modelare a fost ales instrumental Rational Rose. Instrumentul CASE Rational Rose din momentul apariției primelor versiuni a suferit o mulțime de schimbări și s-a transformat într-un instrument de modelare comod, mai complet și foarte puternic. Anume în Rational Rose limbajul UML a devenit tehnologia de bază a vizualizării și elaborării produselor software.

Funcționalitățile sistemului grafic sunt prezentate în următoarele diagrame.

Modelarea sistemului informațional

Diagrama cazurilor de utilizare. Diagrama cazurilor de utilizare reflectă interacțiunea dintre variantelor de utilizare, care reprezintă funcțiile sistemului și actorii, care reprezintă persoane sau sisteme ce primesc sau transmit informație în sistemul dat. Pe diagramă este prezentată interacțiunea dintre

variantele de utilizare și actori. Ea reflectă cerințele către sistem din punct de vedere al utilizatorului. Astfel, variantele de utilizare sunt funcții îndeplinite de sistem, iar actorii sunt persoanele interesate față de sistemul creat.

În figura 2.1 este prezentată diagrama cazurilor de utilizare a funcționalitățile aplicației.

Alege o imagine

Utilizator

Aplica efectul dorit

Salv eaza imagine

Figura 2.1 – Diagrama cazurilor de utilizare a funcționalității sistemului

Utilizatorul, după cum se vede în figura de mai sus are posibilitatea de a accesa aplicația, incărca imaginea în sistem și de a salva această imagine.

În figura 2.2 urmează de a arăta procesul de încărcare a imaginii cu ”zgomot” în sistem și de a elimina zgomotul.

Adauga efect

Selecteaza efectul dorit

«include»

«include»

Incarca imagine

«include»

Vizualizare diagrama

(from Actors)

«include»

Vizualizare rezultat

Figura 2.2 – Diagrama cazurilor de utilizare a procesului de eliminare a zgomotului din imagine

După ce, utilizatorul va încărca imaginea în sistem, va alege procentajul de curatețe și se va efectua procesul de eliminare ”zgomot”.

Diagramele de interacțiune ale sistemului. Diagramele de interacțiune ale obiectelor specifică modelarea comportamentală a sistemelor, care se concentrează asupra aspectelor dinamice ale sistemului, reprezentînd modul în care obiectele (instanțe ale claselor) interacționează între ele pentru a asigura funcționalitatea acestuia.

Interacțiunile între obiecte se pot modela prin diagrame de colaborare și diagrame ale secvențelor de mesaje. În astfel de diagrame se reprezintă obiecte și mesajele dintre acestea.

Diagrama de secvențe din figura 2.3, reprezintă operația de interacțiune dintre sistem și utilizator.

sd Business Process Model

Utilizator

Interfata sistemului

Modulul sistemului

Porneste aplicatie()

Proceseaza comanda()

Afisare ()

Comanda procesata()

Executa()

Incarca imagine()

Proceseaza comanda()

Imagine incarcata()

Executa incarcare poza()

Afisare imagine()

Salveaza imagine()

T ransmite comanda de salvare()

Imagine salvata()

Executa salvare()

Afisare rezultat()

Figura 2.3 – Diagrama de secvență a operațiilor sistemului

În această diagramă sunt sugerate ce mesaje sunt transmise între obiectele utilizator, interfața grafică a sistemului și modulul sistemului. În urma acestei acțiuni utilizatorul va fi informat dacă datele au fost introduse cu succes și timpul de prelucrare a informației.

În figura 2.4 urmează a fi prezentat procesul de curățire (eliminare zgomot), a imaginii.

sd Eliminare zgomot

Utilizator

Interfata sistemului

Modulul sistemului

Incarca imaginea() Proceseaza comanda incarcare()

Afisare imagine()

Imagine incarcata()

Executa comanda()

Selecteaza nivel eliminare "zgomot"()

Eliminare "zgomot"()

Proceseaza comanda eliminare()

Eliminare reusita()

Executa eliminare "zgomot"()

Afisare imagine()

Figura 2.4 – Diagrama de secvență a procesului de eliminare zgomot a imaginii

Pentru a elimina ”zgomotul” din imagine, utilizatorul va încărca imaginea în interfața sistemului, apoi va alege procentajul de eliminare zgomot și va da start procedurii.

Diagrama claselor sistemului. Implimentarea sistemului presupune codificarea într-un limbaj de programare. Clasele se implementează în mod real într-un limbaj orientat obiect; ele vor fi compilate, testate și combinate în programe executabile. În figura 2.5 sunt prezentate clasele sistemului proiectat.

class Remov eNoice

About

image1: Image

image2: Image

MainImage: Image

percentNoise: float = 0

RemoveNoice

Form

button1: Sy stem.Windows.Forms.Button

components: Sy stem.ComponentModel.IContainer = null

label1: Sy stem.Windows.Forms.Label

label2: Sy stem.Windows.Forms.Label

label3: Sy stem.Windows.Forms.Label

label4: Sy stem.Windows.Forms.Label

panel1: Sy stem.Windows.Forms.Panel

resultsList: IList<ResultOfFilters>

aboutProgrammToolStripMenuItem_Click(object, Ev entArgs) : v oid

button1_Click(object, Ev entArgs) : v oid

button2_Click(object, Ev entArgs) : v oid

+ Dispose() : v oid

ex itToolStripMenuItem_Click(object, Ev entArgs) : v oid

Form1_Load(object, Ev entArgs) : v oid

# Dispose(bool) : v oid

– InitializeComponent() : v oid

Program

– Main() : v oid

+ About()

About

Form

GetAv rgOfPix el(Color) : int

GetPersentNoise(Bitmap) : float

GetPSNR(Image, Image) : double

InitializeComponent(object, Ev entArgs) : v oid

MedianFilter(Bitmap, int) : Bitmap

operToolStripMenuItem_Click(object, Ev entArgs) : v oid

+ Remov eNoice()

sav eImageToolStripMenuItem_Click(object, Ev entArgs) : v oid

SetImage(string) : v oid

trackBar1_Scroll(object, Ev entArgs) : v oid

UpdateGrafic() : v oid

ResultOfFilters

+ DetectedPix els: double

+ PercentOfNoise: int

+ PSNR: double

button1_Click(object, Ev entArgs) : v oid

# Dispose(bool) : v oid

InitializeComponent() : v oid

+ ResultOfFilters()

+ ResultOfFilters(double, double, int)

Figura 2.5 – Diagrama claselor sistemului

Unul din avantajele CASE-ului, Enterprice Arhitect este posibilitatea generării carcasului preventiv al sistemului soft din modelul static (în unele cazuri pentru sistemele distribuite se permite generarea codului și din alte tipuri de diagrame), la generare se iau în considerație proprietățile proiectului în întregime, dar și proprietățile claselor, rolurile, atributelor, operațiile, etc. Pe lîngă proprietățile ce reglementează caracteristicile proiectului propriu zis, există și denumirile fișierelor proiectului, denumirea claselor container, parametrii ce indică deosebirile limbajelor în parte. În diagrama claselor prezentată în figura 3.5, avem cinci clase de bază: clasa ”Program” ce este indicat main-ul programului, clasa ”RemoveNoice” ce efectuaza operațiunea de eliminare zgomot, clasa ”ResultOfFilters” prelucrează pixelii ”zgomotoși”.

Următoarea figură șine de resursele sistemului, figura 2.6.

class Properties

Resources

resourceCulture: global::System.Globalization.CultureInfo

resourceMan: global::System.Resources.ResourceManager

~ Resources()

«property»

~ Culture() : global::System.Globalization.CultureInfo

~ ResourceManager() : global::System.Resources.ResourceManager

System.Configuration.ApplicationSettingsBase

Settings

{lea -defaultInstance

– defaultInstance: Settings = ((Settings)(glo…

«property»

+ Default() : Settings

Figura 2.6 – Diagrama claselor a proprietăților și resursele sistemului

Prin diagrama vizualizată mai sus, sunt prezentate proprietățile și resursele sistemului. Aici avem doua clase: ”Settings” și ”Resources”.

Diagrama de stare. Diagramele de stare sunt destinate pentru modelarea diferitor stări în care poate să se afle obiectul. În timp ce diagrama claselor arată imaginea statică a claselor și legăturile lor, diagrama stărilor se folosește la descrierea dinamică a comportamentului sistemului. Diagrama de stare reflectă comportamentul obiectului.

Cînd obiectul se află într-o stare concretă se pot îndeplini unele sau alte procese. Diagrama de stare nu e numaidecît de construit pentru fiecare clasă. Ele se construiesc numai în cazuri excepțional de complicate. Dacă obiectul clasei poate exista în mai multe stări, și în fiecare se comportă diferit probabil va trebui o astfel de diagramă. Însă în multe proiecte nu se folosesc.

În figura 2.7 urmează a fi prezentată diagrama stărilor sistemului.

Diagrama de stare

Start

Initiere

obiect

Selectarea imaginii

Procesare imagine

Selectare efect

Eliberare obiect

Final

Figura 2.7 – Diagrama de stare a desfășurării operațiilor sistemului

În figură se observă bine cum are loc parcurgerea desfășurarii operațiilor de la o stare la alta. Trecerea de la o stare la alta este determinată de tranzacțiile intermediare – acestea corespund acțiunilor pe care se întîlnesc și la Activity Diagram ( Statechart Diagram reprezintă într-un fel un alt mod de a vedea un flux ce poate fi modelat exclusiv prin Activity Diagram, inventat pentru a exprima mai elocvent trecerile de la o stare la alta), figura 2.8.

În diagrama dată am reprezentat diagrama de activitate în cazul lucrului cu sistemul. Utilizatorul la fel va da start aplicației, apoi va încărca imaginea în sistem și dacă operația are loc cu succes se va selecta nivelul de eliminare a zgomotului, iar dacă operația eșuază, utilizatorul poate să încarce imaginea din nou pentru a fi prelucrată. După prelucrarea imaginii la fel se va vizualiza imaginea și dacă pe utilizator îl va satisface rezultatul desigur se va salva imaginea, dar dacă nu urmează să selecteze un nivel de eliminare zgomot mai avansat.

Diagrama de activ itate

Start

Acces meniu de editare

Alege imagine

[SelectedImage = null]

[EfectSelected = -1]

[SelectedImage = image]

Selecteaza efectul

[EfectSelected >= 0]

Afisare imagine editata

Final

Salveaza imaginea

Figura 2.8 – Diagrama de activate a procesului de efectuare a operațiilor în sistem

Diagrama componentelor sistemului. Pentru reprezentarea entităților fizice în limbajul UML se utilizează componentele (component). Componenta realizează un set de interfețe și desemnează elementele reprezentării fizice a unui model. Grafic componenta se reprezintă printr-un dreptunghi cu anexe. În înteriorul acestui dreptunghi se indică numele componentei și posibil informația suplementară. Reprezentarea acestui simbol variază în dependență de informația asociată cu componenta dată.

În figura 2.9 vom prezenta diagrama componentelor pentru sistemul dat.

cmp Components

Program.exe

Settings

Remov eNoice

Resources

ResulteOfFilters About

Figura 2.9 – Diagrama componentelor sistemului

Componenetele sistemului prezentat în diagrama de mai sus sunt: RemoveNoice, ResultOfFilters, About, Settings și Resources.

Descrierea produsului realizat

Tehnologiile utilizate

Platforma .Net Framework. Microsoft .NET Framework este o colecție cuprinzătoare de clase, care furnizează programatorilor aproape tot ce le trebuie pentru a scrie aplicații pentru Internet, Web și Windows. Cele mai importante caracteristici esențiale ale acestei platforme sunt următoarele:

compilarea mai multor limbaje într-un limbaj intermediar comun (MSIL);

MSIL executat pe mașina virtuală:

VM similară cu mașina virtuală JAVA în multe privințe;

model de securitate mult mai elaborat;

JIT – standard, în locul interpretorului;

permite interoperabilitate între:

Cod managed – provenit de pe platforma .NET;

Cod unmanaged – provenit de pe alte surse;

orientat spre realizarea serviciilor WEB;

accent pe securitate și trust. Permite construirea și livrarea aplicațiilor cu diverse grade de securitate și trust;

componente principale, Common Language Runtime (CLR) și .NET Framework Class library;

pot fi dezvoltate o varietate largă de aplicații, de la programe Desktop pâna la aplicații pentru dispozitive mobile, aplicații și servicii web sau servicii Windows, de la programe izolate și pînă la sisteme distribuite de dimensiuni enorme;

mediul de execuție este strict controlat de un motor de execuție, care oferă o serie de facilități ce ridică mult nivelul de calitate al aplicațiilor (managementul automat al memoriei și securitatea fiind primele două care ies în evidență).

Printre limbajele puse la dispoziție de Microsoft se numără C# , un limbaj dezvoltat într-un mod cât se poate de concret, unul pentru altul. cu platforma .NET și situat undeva între Java si C++ ca sintaxă, dar cu câteva inovații semnificative. Librăriile de clase grupate în .NET Framework, împreună cu extensiile care le pot fi aduse și posibilitatea de a le utiliza pe toate dintr-un mediu unitar, ca de exemplu Visual Studio, permite crearea de aplicații într-o manieră consistentă, indiferent de natura proiectului dezvoltat. Coborând puțin mai jos și vedem care sunt categoriile de aplicații care pot fi construite cu ajutorul .NET Framework. La apariția lor, primele servere web răspundeau cererilor clienților cu conținut static – fișiere HTML, imagini și alte tipuri de informații luate de pe disc. Pe lângă aplicații și servicii

Web, .NET Framework oferă posibilitatea dezvoltării de aplicații Windows, folosind cadrul Windows Forms. Fără a intra în prea multe detalii, merită menționat ca dezvoltarea aplicațiilor Windows se face foarte similar cu cea a aplicațiilor web. De asemenea, .NET Framework oferă suport pentru dezvoltarea serviciilor Windows, aplicații care rulează în fundal, fără interacțiune directă cu utilizatorul și care pun diverse funcții la dispoziția altor aplicații de pe același calculator sau din rețeaua locală. Platforma .NET face posibile două scenarii foarte importante pentru dezvoltatori: programarea orientată pe componente și arhitecturile orientate pe servicii. Programarea orientată pe componente duce noțiunea de programare pe obiecte (OOP) cu un pas mai departe. Pentru toate componentele utilizate, fie ele vizuale sau non-vizuale, și indiferent de tipul aplicației în care sunt folosite, modul de dezvoltare este de obicei același – funcțiile unor componente mai simple sunt folosite pentru a dezvolta componente și sisteme mai complexe. Aceasta consistență se traduce de obicei în viteza mai mare de dezvoltare, în reutilizarea eficientă a codului și în calitatea sporită a aplicațiilor. Arhitecturile orientate pe servicii sunt un concept apărut relativ nou și tind să facă o paralelă între modul în care evoluează sistemele software în prezent și modul în care au evoluat alte sisteme în trecut. Toate aplicațiile dezvoltate pe .NET rulează într-un mediu de execuție controlat (managed execution environment), furnizat de Common Language Runtime (CLR). Acest mediu de execuție furnizează un set complex de servicii care au rolul de a face mai usoară viața dezvoltatorilor, încercând în același timp să mențină un nivel de performanță și fiabilitate cât mai ridicată. Platforma oferă suport pentru securizarea aplicațiilor, în așa fel încât aplicațiile bine proiectate și implementate să primească doar privilegiile de care au nevoie pentru a rula corect, iar administratorii de sistem să poată controla politicile de acordare a privilegiilor. Acest lucru se realizează prin Code Access Security (CAS). Alte mecanisme de securitate folosite pe scară largă în .NET sunt Role-based Security, autentificarea și autorizarea, ca și diverse tehnici criptografice. Prin mecanismele de suport al versiunilor,

.NET permite execuția componentelor side-by-side. Acest lucru înseamnă că, daca o aplicație a fost construită cu o anumită versiune a unei componente oarecare, iar o alta aplicație foloseste o versiune diferită a acelei componente, cele două versiuni pot coexista pașnic pe același calculator. Fiecare aplicație va folosi versiunea componentei cu care a fost construită și testată, fară a ține cont de cealalta versiune.

Descrierea aplicației

În lucrarea de licență prezentă a fost proiectată și elaborată o aplicație ce are ca destinație eliminarea zgomotelor din imagini.

Interfața principală a aplicației este una extrem de simplă, ce dă posibilitatea utilizatorului ușor să orienteze în funcționalitatea ei și de efectua operațiile dorite. Pe imaginea din figura 3.1, se poate observa că interfața aplicației este strict orientă pentru efectuarea operațiilor de înlăturare a zgomotelor din imagini și pentru acesta au fost create: meniul principal al aplicației, de unde se poate încărca imagine

sursă și salva rezultatul, butonul de lansare a procesului de eliminare a zgomotelor, bara de indicare a parametrului de lucru și zona prezentare a rezultatelor.

Figura 3.1 – Interfața principală a sistemului informațional

Pentru a încărca o imagine sursă, utilizatorul, va accesa opțiunea File, a meniului principal de unde va selecta opțiunea OpenImage, și în fereastra de navigare va selecta imaginea ce necesită a fi prelucrată. După selectarea imaginii, ea va fi prezentată în zona rezultatelor.

Un exemplu de imagine încărcată pentru prelucrare este prezentat în figura 3.2.

Figura 3.2 – Încărcarea unei imagini pentru prelucrare

După ce imaginea este încărcată, utilizatorul va seta parametrul de înlăturare a zgomotelor din imagine. Pentru a selecta acest parametru, utilizatorul va mișca cursorul sub valoarea parametrului

necesară lui. Cu cît valoarea acestui parametru este mai mare cu atît rezultatul va fi mai satisfăcător, dar totodată și timpul de prelucrare va fi mai mare.

În figura 3.3 este prezentat rezultatul prelucrării unei imagini cu indicarea parametrului de eliminare a zgomotului la 100%.

Figura 3.3 – Rezultatul prelucrării unei imagini

După cum se poate observa din figura 3.3, rezultatul este unul satisfăcător și diferența vizuală dintre imagini este mare. Tot odată putem observa și graficul de eliminare a zgomotului, în care este prezentat nivelul zgomotelor eliminate.

După ce operația de eliminare a zgomotelor este finalizat, utilizatorul are posibilitatea să salveze imaginea rezultat în memoria calculatorului, pentru aceasta va selecta opțiunea File a meniului principal și din ea va selecta operația Save Image.

În final putem spune că s-a obținut o aplicație, ce ne permite să îmbunătățim calitatea imaginilor și un exemplu concludent de utilizare a filtrului median pentru prelucrarea imaginilor și eliminarea zgomotelor din ele.

Argumentarea economică

Planul calendaristic

Urmând ca scop final alcătuirea unui sistem informațional ce monitorizează și analizează rețeaua, pentru pregătirea efectuării lucrării va fi necesară o săptămână, pe parcursul căreia se vor studia cerințele utilizatorului (în cazul dat utilizatorul se consideră însăși programatorul care se ocupă cu ingineria software). Se vor lua în calcul tehnologiile de prelucrare a informației necesare pentru integrare în sistem. Elaborarea va dura patru luni. Planul calendaristic include informația referitoare la executarea în timp a acțiunilor planificate. Rezultatele planificării sunt reflectate în tabelul 4.1.

Tabelul 4.1 – Planul calendaristic

Continuare Tabel 4.1

Din tabelul de mai sus sau obținut 66 de zile (aproximativ 3 luni) necesare pentru a elabora un prototip a aplicației.

Calculul indicatorilor economici

Pentru evaluarea economică a proiectului, trebuie să determinăm eficiența utilizării rezultatelor de realizare a programului. Compartimentul acesta servește drept bază pentru concluzia dacă proiectul este

eficient din punct de vedere economic. Toate calculele sunt efectuate în lei moldovenești (MDL). Prețurile materialelor sunt actuale. În tabelul 4.2 sunt prezentate toate consumurile de materiale directe necesare pentru elaborarea sistemului informațional.

Tabelul 4.2 – Consumuri de materiale directe, pentru elaborarea sistemului informațional

În total au fost cheltuite 508 lei pentru materialele directe necesare pentru elaborarea sistemului informațional. Hardware și software nu au fost incluse în buget. Costul elementelor procurate nu depășește 1000 de lei. În tabelul 4.3 sunt prezentate activile materiale și nemateriale pe termen lung utilizate pentru elaborarea sistemului informatic.

Tabelul 4.3 – Active materiale și nemateriale pe termen lung

Cheltuieli privind retribuirea muncii

Calculul salariului de bază a colaboratorilor pe proiect. Salariul de bază se plătește în lei pe zile. Programatorul se remunerează cu 300 lei pe zi. Asupra acestui proiect a lucrat numai un programator

capabil să înlocuiască un manager de proiect, și administrator. Respectiv evaluarea acestuia va costa triplu datorită meritelor lui Evaluarea cheltuielilor pe salariu de bază este dată în tabelul următor. Evaluarea salariului de bază. Cheltuielile privind retribuirea muncii sunt afișate în tabelul 4.4.

Tabelul 4.4 – Cheltuielile materiale directe

Suma cheltuielilor privind retribuirea muncii constituie 24694,00 lei. Cheltuielile au fost socotite pe baza formulelor, din care fondul social constituie 23% din fondul de salarii, asigurarea medicală obligatorie constituie 3.5% din salariu.

Să presupunem că la finele anului angajatul în calitate de programator a obținut un venit brut de 76400 lei.

O să calculăm venitul net anual și suma impozitului pe venit a angajatului luînd în considerație că pentru anul 2013 sunt planificate următoarele taxe și scutiri la venituri pentru persoane fizice:

– pentru venituri anuale de pîne la 26700 lei se aplică cota de impozitare 7%;

pentru venituri mai mari de 26700 lei se aplică cota de impozitare 18%;

fondul de pensionare(FP) 6% din venit;

fondul de asigurare medicală(FAM) 3,5% din venit;

suma scutirii personale(SP) 9120 lei;

suma pentru persoana întreținută(SiP) 2040 lei;

suma scutirii personale majore(SM) 13560 lei.

Fondul Pensionar și Fondul de Asigurare Medicală:

FPprogramator=6%*76400=4584 lei; FAMprogramator=3,5%*76400=2674 lei;

Venitul impozabil(VI):

VI=VB-FP-FAM-SP-SiP-SM.

De unde avem:

VIprogramator=76400-4584-2674-9120=60022 lei.

Calcularea venitului net aplicînd cotele de impozitare în vigoare:

VN=VB-IV-FP-FAM.

IVprogramator=26700*7%+(60022-26700)*18%=1869+5997,96=7866,96 lei.

De aici reese că venitul net(VN) va constitui:

VNprogramator=76400-7866.96-4584-2674=61275.04 lei.

Tabelul 4.5 – Cheltuierile indirecte nemateriale

Cheltuielile au fost înmulțite la 3 conform nr. de luni necesare pentru elaborarea sistemului informațional. Aceste cheltuieli au fost obligatorii pentru crearea capabilității de lucru confort.

Uzura mijloacelor fixe și amortizarea activelor nemateriale

Scoaterea din funcție (a fluxului circular al capitalului) este rezultatul deprecierii capitalului fix datorate atât uzurii fizice cât și a cele morale a acestuia. Se cunoaște uzura fizică și morală a capitalului fix. Uzura fizică este pierderea treptată a proprietăților lui tehnice de exploatare în urma folosirii productive și acțiunii factorilor naturali. Amortizarea reprezintă expresia valorică a uzurii, și mărimea

anuală a amortizării se determină raportând valoarea capitalului fix la durata normală de funcționare în ani. Mai jos este reprezentat tabelul de calcul a uzurii (Tabelul 4.6).

Partea importantă a cheltuielilor indirecte constituie calcularea uzurii și amortizării. Formula generală: FA = [(V : T) x T1] (1)

unde:

FA – fondul de amortizare;

V – suma care trebuie să fie amortizată (uzată); T – durata utilizării activului;

T1 – durata proiectului.

Tabelul 4.6 – Amortizarea activelor nemateriale și materiale pe termen lung (AMTL și ANTL)

Amortizarea activelor nemateriale și materiale pe termen lung este de 726 lei.

Costul de producție

În tabelul 4.7 sunt arătate cheltuielile totale pentru realizarea proiectului.

Tabelul 4.7 – Cheltuielile totale pentru realizarea proiectului.

Din datele obținute am ajuns la concluzia că cel mai mult s-a cheltuit pentru fondul salariului iar cel mai puțin pentru consumurile materialelor directe. Suma totală a cheltuielilor a fost calculată pe baza tuturor cheltuielilor asupra proiectului și costul proiectului este de 29726 lei.

Partea organizatorică. Tema: Profitul: noțiuni, formele profitului.

Profitul are destinația de a determina necesitatea remunerării capitalului propriu, constituirii fondurilor pentru autofinanțare și cointeresării salariaților. întreprinderile stabilesc profitul pe produs, pe grupe de produse, pe întreprinderi- fiice sau pe alte elemente.

Profit brut = Preț de vînzare – TVA- Costul producției.

Profitul rezultat din activitatea de bază și din alte activități poate fi influențată de:

dividendele și dobînzile încasate din cumpărarea acțiunilor și obligațiilor a altor agenți economici;

vînzarea ambalajelor și a altor active nemateriale;

amenzile și penalitățile;

anularea unor comenzi;

surplusurile de la inventariere;

venituri financiare;

pierderi din calamitățile naturale;

micșorarea datoriilor.

Profitul și rata profitului (sau rata rentabilității) reflectă capacitatea întreprinderii de a produce profit net peste cheltuielile efectuate.

Profitul unui agent economic este format din profit normal sau ordinar, iar în unele cazuri din supraprofit sau profit de monopol.

Profitul normal sau ordinar este acel care e realizat în condițiile de concurență. în cazul lipsei de concurență unele întreprinderi obțin supraprofit sau profit suplimentar, ceea ce nu reflectă real situația economico- financiară a întreprinderii.

Profitul îndeplinește următoarele funcții:

este un indicator sintetic de apreciere a eficienței activității economice;

este un mijloc de cointeresare a agenților economici;

instrument de control asupra modului de realizare, de repartizare și de impunere fiscală;

stimulează inițiativa și acceptarea riscului din partea celor care au scop obținerea unui profit.

Profitul trebuie să stimuleze agenții economici în realizarea programului de producție, îmbunătățirea calității și diversificarea sortimentului. Căile de sporire a profitului sunt:

reducerea costului producției fără a afecta calitatea producției;

coordonarea nivelului prețului de vînzare, adică în cazul cînd crește prețul de vînzare crește profitul și respectiv poate crește volumul producției;

creșterea volumului producției comercializate și a serviciilor prestate;

îmbunătățirea calității producției și serviciilor.

Cu cât profitul obținut este mai mare cu atât este mai ridicat nivelul rentabilității. Nivelul rentabilității depinde de activitatea internă a agenților economici, de relațiile cu mediul extern și de atitudinea de a se adapta la cerințele pieții.

Profitul se determină potrivit unei metodologii oficiale, care este reglementată în mod diferit de la o țară la alta. În acest sens, în teorie și practică, putem întâlni mai multe forme ale profitului:

profit legitim (normal sau legal) – este cel realizat în conținutul respectării prevederilor legale;

profitul nelegitim (nelegal) – se realizează ca urmare a încălcării în mod deliberat sau nu, a legalității sustragerii de la plata impozitelor;

profitul admis – reflectă punctul de vedere oficial cu privire la mărimea și dinamica profitului pe ramuri și subramuri, pe categorii de mărime a firmelor;

profitul de monopol (cunoscut sub denumirea de supraprofit de monopol) – este obținut, de regulă, de către firmele care câștigă și își mențin o poziție de monoplo pe piață, profit care este mult mai mare decât cel obișnuit (legitim);

profit neașteptat – câștig neașteptat, datorat unor conjuncturi economice și politice favorabile;

profit minimal – (normal sau economic) – suma remunerațiilor minime pentru diferite aporturi productive ale întreprinzătorilor. Este format din multe remunerații distincte:

salariul întreprinzătorului;

dobânda la capitalul propriu al întreprinzătorului;

chiria pentru clădirile proprii;

dividendele plătite acționarilor;

renta pentru pământul proprietate al întreprinzătorului.

profitul pur – diferențe pozitive între profitul brut și cel minimal, sursele profitului pur sunt:

profitul brut – profitul obținut în urma unor afaceri (cuprinde inclusiv impozitul pe profit);

profitul contabil – excedentul de venit net peste costul contabil;

profitul economic – reprezintă diferența dintre venitul total al firmei și costurile de oportunitate ale tuturor intrărilor, utilizate de acesta într-o perioadă de timp;

Concluzie. Produsul realizat este un produs gratuit, avantajul principal fiind necesitatea produsului pe piața Moldovei, este un produs puțin utilizat de către utilizatorii din Moldova. Din punct de vedere economic aplicația dată reprezintă un produs non-comercial și a fost creată ca un serviciu gratuit pentru orice utilizator.

Concluzii

Domeniul video digital este în continuă dezvoltare. Provocările în acest domeniu sunt analiza mișcării (estimarea și segmentarea mișcării bidimensionale,mișcarea tridimensionala, estimarea structurii și segmentarea ei, urmărirea obiectelor în imagine, ocluzie, deformare), filtrarea și conversia standardelor (înlăturarea încețoșării imaginii (deblurring), filtrarea zgomotului, ascuțirea marginilor, conversia frecvenței cadrelor și mărirea rezoluției)

Este important de precizat că analiza imaginilor a mers mai departe decât simpla înlocuire a observatorului uman, deoarece au apărut soluții novatoare pentru probleme cu care acesta nu mai fusese confruntat.

În sens restrâns, obiectivul prelucrării numerice a imaginilor constă în transformarea imaginii în scopul facilitării interpretării vizuale sau al reducerii cerințelor de memorie pentru reprezentare sau stocare, respectiv al debitului de date sau benzii de frecvență necesare transmiterii la distanță. În sensul cel mai larg, prelucrarea poate urmări măsurarea unor parametri de poziție, viteză de mișcare sau formă al unor obiecte, recunoașterea obiectelor dintr-un cadru de imagine, interpretarea scenei sau recunoașterea tipului de activități ce sunt surprinse în video-secvențe.

Programele de uz general permit efectuarea unui mare număr de operații de prelucrarea și analiza imaginilor, cu numeroși parametri reglabili. Interacțiunea cu operatorul uman este mare și acesta trebuie să aibă o calificare superioară. Programele de acest tip nu sunt de timp real și în general sunt cuplate off- line cu instalațiile tehnologice propriu-zise, făcând parte mai ales din dotarea laboratoarelor de cercetare și de analiza calității și conformității. Interfața utilizator este cea care creează diferența între două categorii de programe, în ceea ce privește modalitatea în care operatorul specifică succesiunea de operații de executat.

Aplicația implementată în această lucrare poate fi utilizată pentru prelucrarea imaginilor în studiourile foto, unde des este necesar de a elimina zgomotele de pe poze învechite de timp.

În final, putem afirma că prelucrarea și analiza imaginilor a reușit să câștige teren ca urmare a realizărilor spectaculoase ale tehnologiei electronice și informaticii. Creșterea continuă a puterii de calcul disponibile în unitățile de prelucrare ale calculatoarelor va transforma probabil în viitorul apropiat prelucrarea și analiza imaginilor dintr-o anexă nebuloasă și exotică a aplicaților speciale într-o soluție fiabilă de larg consum industrial.

Anexa A Listingul programului

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms; using ZedGraph;

namespace RemoveNoice

{

public partial class Form1 : Form

{

Image image1; Image image2; Image MainImage;

float percentNoise = 0; IList<ResultOfFilters> resultsList;

// List<

public Form1()

{

InitializeComponent();

}

private void operToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog. if (result == DialogResult.OK) // Test result.

{

string file = openFileDialog1.FileName;

try

{

SetImage(file); button1.Enabled = true;

resultsList = new List<ResultOfFilters>(); pictureBox2.Image = null;

percentNoise = GetPersentNoise((Bitmap)MainImage); UpdateGrafic();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

}

private void SetImage(string file)

{

Image image = Image.FromFile(file); pictureBox1.Image = image;

image1 = image; MainImage = image;

pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

}

private void button1_Click(object sender, EventArgs e)

{

pictureBox2.Image = (Image)MedianFilter((Bitmap)pictureBox1.Image, trackBar1.Value*2);

pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

image2 = pictureBox2.Image;

// MessageBox.Show(GetPersentNoise((Bitmap)pictureBox2.Image).ToString()); ResultOfFilters res = new ResultOfFilters();

res.PSNR = GetPSNR(MainImage, image2); res.PercentOfNoise =(int)percentNoise;

float onePer = (float)(percentNoise / 100.0);

if (onePer == 0.0)

{

res.DetectedPixels = 0.0;

}

else

{

/ onePer;

res.DetectedPixels =(percentNoise – (float)GetPersentNoise((Bitmap)pictureBox2.Image))

}

resultsList.Add(res); UpdateGrafic();

}

private Bitmap MedianFilter(Bitmap Image, int Size)

{

System.Drawing.Bitmap TempBitmap = Image;

System.Drawing.Bitmap NewBitmap = new System.Drawing.Bitmap(TempBitmap.Width, TempBitmap.Height);

System.Drawing.Graphics NewGraphics = System.Drawing.Graphics.FromImage(NewBitmap);

NewGraphics.DrawImage(TempBitmap, new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height), new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height), System.Drawing.GraphicsUnit.Pixel);

NewGraphics.Dispose();

Random TempRandom = new Random(); int ApetureMin = -(Size / 2);

int ApetureMax = (Size / 2);

toolStripProgressBar1.Maximum = NewBitmap.Width * NewBitmap.Height; toolStripProgressBar1.Visible = true;

toolStripProgressBar1.Value = 0;

for (int x = 0; x < NewBitmap.Width; ++x)

{

for (int y = 0; y < NewBitmap.Height; ++y)

{

toolStripProgressBar1.Value++; List<int> RValues = new List<int>();

List<int> GValues = new List<int>(); List<int> BValues = new List<int>();

for (int x2 = ApetureMin; x2 < ApetureMax; ++x2)

{

int TempX = x + x2;

if (TempX >= 0 && TempX < NewBitmap.Width)

{

for (int y2 = ApetureMin; y2 < ApetureMax; ++y2)

{

int TempY = y + y2;

if (TempY >= 0 && TempY < NewBitmap.Height)

{

Color TempColor = TempBitmap.GetPixel(TempX, TempY); RValues.Add(TempColor.R);

GValues.Add(TempColor.G); BValues.Add(TempColor.B);

}

}

}

}

RValues.Sort(); GValues.Sort();

BValues.Sort();

Color MedianPixel = Color.FromArgb(RValues[RValues.Count / 2], GValues[GValues.Count / 2],

BValues[BValues.Count / 2]); NewBitmap.SetPixel(x, y, MedianPixel);

}

}

toolStripProgressBar1.Visible = false; return NewBitmap;

}

private void trackBar1_Scroll(object sender, EventArgs e)

{

toolStripStatusLabel1.Text = (trackBar1.Value*10).ToString()+"%";

}

private void trackBar1_DragLeave(object sender, EventArgs e)

{

toolStripStatusLabel1.Text = "";

}

private void Form1_Load(object sender, EventArgs e)

{

resultsList = new List<ResultOfFilters>(); UpdateGrafic();

}

private double GetPSNR(Image img0,Image img1)

{

Bitmap img1_data = (Bitmap)img0; Bitmap img2_data = (Bitmap)img1;

double pix = (double)img0.Width * (double)img0.Height; double x, psnr, MSE = 0.0, RMSE = 0.0;

int max = 0;

for (int i = 0; i < img0.Width; i++)

{

for (int j = 0; j < img0.Height; j++)

{

double first = (double)(img1_data.GetPixel(i, j).R + img1_data.GetPixel(i, j).G + img1_data.GetPixel(i, j).B) / 3.0;

double second = (double)(img2_data.GetPixel(i, j).R + img2_data.GetPixel(i, j).G + img2_data.GetPixel(i, j).B) / 3.0;

if (max < first) max = (int)first;

x = (double)first – (double)second; MSE = ((x * x) / pix);

}

}

RMSE = Math.Sqrt(MSE);

if (RMSE == 0.0) RMSE = 1.0;

psnr = 10.0 * Math.Log10((double)max / RMSE); return psnr;

}

private void UpdateGrafic()

{

// Lets generate sine and cosine wave double[] x = new double[100]; double[] y = new double[100];

double[] z = new double[100]; List<string> strList = new List<string>();

for (int i = 0; i < x.Length; i++)

{

x[i] = i;

y[i] = 20;

}

x[0] = 0;

y[0] = 20;

foreach (ResultOfFilters item in resultsList)

{

y[(int)item.DetectedPixels-1] = item.PSNR;

}

// This is to remove all plots NoiceGraf.GraphPane.CurveList.Clear();

// GraphPane object holds one or more Curve objects (or plots) GraphPane myPane = NoiceGraf.GraphPane; myPane.YAxis.Title.Text = "PSNR";

myPane.XAxis.Title.Text = "Percentage (%) of Pixels Detected as Impulsive Noise";

// PointPairList holds the data for plotting, X and Y arrays PointPairList spl1 = new PointPairList(x, y);

// PointPairList spl2 = new PointPairList(x, z);

// Add cruves to myPane object

LineItem myCurve1 = myPane.AddCurve("Original", spl1, Color.Blue, SymbolType.None);

// LineItem myCurve2 = myPane.AddCurve("Proposed", spl2, Color.Red, SymbolType.None);

myCurve1.Line.Width = 3.0F;

// myCurve2.Line.Width = 3.0F;

myPane.Title.Text = "Image with " + percentNoise + "% impulsive noice";

// I add all three functions just to be sure it refeshes the plot. NoiceGraf.AxisChange();

NoiceGraf.Invalidate(); NoiceGraf.Refresh();

}

private void button2_Click(object sender, EventArgs e)

{

pictureBox1.Image = MainImage;

}

private float GetPersentNoise(Bitmap bmp)

{

int countPix = bmp.Width * bmp.Height; int countPixDetected = 0;

int currPix,margPix;

toolStripProgressBar1.Maximum = (int)countPix; toolStripProgressBar1.Visible = true; toolStripProgressBar1.Value = 0;

for (int i = 1; i < bmp.Width – 1; i++)

{

for (int j = 1; j < bmp.Height – 1; j++)

{

currPix = GetAvrgOfPixel(bmp.GetPixel(i, j));

margPix = (GetAvrgOfPixel(bmp.GetPixel(i-1, j-1)) + GetAvrgOfPixel(bmp.GetPixel(i-1, j)) +

GetAvrgOfPixel(bmp.GetPixel(i, j+1)) + GetAvrgOfPixel(bmp.GetPixel(i+1,

j+1)) +

1)) +

+ 1))) / 8;

GetAvrgOfPixel(bmp.GetPixel(i+1, j)) + GetAvrgOfPixel(bmp.GetPixel(i+1, j-

GetAvrgOfPixel(bmp.GetPixel(i, j – 1)) + GetAvrgOfPixel(bmp.GetPixel(i – 1, j toolStripProgressBar1.Value++;

if ((currPix – margPix) > 63 || (currPix – margPix) < -63) countPixDetected++;

}

}

toolStripProgressBar1.Visible = false;

return ((float)countPixDetected / (float)(countPix / 100.0));

}

private int GetAvrgOfPixel(Color pix)

{

return (pix.R + pix.G + pix.B) / 3;

}

private void aboutProgrammToolStripMenuItem_Click(object sender, EventArgs e)

{

About about = new About(); about.ShowDialog();

}

private void saveImageToolStripMenuItem_Click(object sender, EventArgs e)

{

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif"; saveFileDialog1.Title = "Save an Image File";

saveFileDialog1.ShowDialog();

// If the file name is not an empty string open it for saving.

if (saveFileDialog1.FileName != "")

{

// Saves the Image via a FileStream created by the OpenFile method. System.IO.FileStream fs =

(System.IO.FileStream)saveFileDialog1.OpenFile();

// Saves the Image in the appropriate ImageFormat based upon the

// File type selected in the dialog box.

// NOTE that the FilterIndex property is one-based. switch (saveFileDialog1.FilterIndex)

{

case 1:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);

break;

case 2:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp);

break;

case 3:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Gif);

break;

}

fs.Close();

}

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.Exit();

}

}

}

using System;

using System.Collections.Generic; using System.Linq;

using System.Windows.Forms;

namespace RemoveNoice

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary> [STAThread] static void Main()

{

Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());

}

}

}

using System;

using System.Collections.Generic; using System.Linq;

using System.Text;

namespace RemoveNoice

{

public class ResultOfFilters

{

public double PSNR;

public double DetectedPixels; public int PercentOfNoise;

public ResultOfFilters()

{

}

public ResultOfFilters(double x,double y,int p)

{

PSNR = x;

DetectedPixels = y; PercentOfNoise = p;

}

}

}

Anexa B

Lista materialului grafic

Figura B.1 – Interfața principală a sistemului informațional

Figura B.2 – Încărcarea unei imagini pentru prelucrare

Figura B.3 – Rezultatul prelucrării unei imagini

Anexa A Listingul programului

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms; using ZedGraph;

namespace RemoveNoice

{

public partial class Form1 : Form

{

Image image1; Image image2; Image MainImage;

float percentNoise = 0; IList<ResultOfFilters> resultsList;

// List<

public Form1()

{

InitializeComponent();

}

private void operToolStripMenuItem_Click(object sender, EventArgs e)

{

DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog. if (result == DialogResult.OK) // Test result.

{

string file = openFileDialog1.FileName;

try

{

SetImage(file); button1.Enabled = true;

resultsList = new List<ResultOfFilters>(); pictureBox2.Image = null;

percentNoise = GetPersentNoise((Bitmap)MainImage); UpdateGrafic();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

}

private void SetImage(string file)

{

Image image = Image.FromFile(file); pictureBox1.Image = image;

image1 = image; MainImage = image;

pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

}

private void button1_Click(object sender, EventArgs e)

{

pictureBox2.Image = (Image)MedianFilter((Bitmap)pictureBox1.Image, trackBar1.Value*2);

pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

image2 = pictureBox2.Image;

// MessageBox.Show(GetPersentNoise((Bitmap)pictureBox2.Image).ToString()); ResultOfFilters res = new ResultOfFilters();

res.PSNR = GetPSNR(MainImage, image2); res.PercentOfNoise =(int)percentNoise;

float onePer = (float)(percentNoise / 100.0);

if (onePer == 0.0)

{

res.DetectedPixels = 0.0;

}

else

{

/ onePer;

res.DetectedPixels =(percentNoise – (float)GetPersentNoise((Bitmap)pictureBox2.Image))

}

resultsList.Add(res); UpdateGrafic();

}

private Bitmap MedianFilter(Bitmap Image, int Size)

{

System.Drawing.Bitmap TempBitmap = Image;

System.Drawing.Bitmap NewBitmap = new System.Drawing.Bitmap(TempBitmap.Width, TempBitmap.Height);

System.Drawing.Graphics NewGraphics = System.Drawing.Graphics.FromImage(NewBitmap);

NewGraphics.DrawImage(TempBitmap, new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height), new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height), System.Drawing.GraphicsUnit.Pixel);

NewGraphics.Dispose();

Random TempRandom = new Random(); int ApetureMin = -(Size / 2);

int ApetureMax = (Size / 2);

toolStripProgressBar1.Maximum = NewBitmap.Width * NewBitmap.Height; toolStripProgressBar1.Visible = true;

toolStripProgressBar1.Value = 0;

for (int x = 0; x < NewBitmap.Width; ++x)

{

for (int y = 0; y < NewBitmap.Height; ++y)

{

toolStripProgressBar1.Value++; List<int> RValues = new List<int>();

List<int> GValues = new List<int>(); List<int> BValues = new List<int>();

for (int x2 = ApetureMin; x2 < ApetureMax; ++x2)

{

int TempX = x + x2;

if (TempX >= 0 && TempX < NewBitmap.Width)

{

for (int y2 = ApetureMin; y2 < ApetureMax; ++y2)

{

int TempY = y + y2;

if (TempY >= 0 && TempY < NewBitmap.Height)

{

Color TempColor = TempBitmap.GetPixel(TempX, TempY); RValues.Add(TempColor.R);

GValues.Add(TempColor.G); BValues.Add(TempColor.B);

}

}

}

}

RValues.Sort(); GValues.Sort();

BValues.Sort();

Color MedianPixel = Color.FromArgb(RValues[RValues.Count / 2], GValues[GValues.Count / 2],

BValues[BValues.Count / 2]); NewBitmap.SetPixel(x, y, MedianPixel);

}

}

toolStripProgressBar1.Visible = false; return NewBitmap;

}

private void trackBar1_Scroll(object sender, EventArgs e)

{

toolStripStatusLabel1.Text = (trackBar1.Value*10).ToString()+"%";

}

private void trackBar1_DragLeave(object sender, EventArgs e)

{

toolStripStatusLabel1.Text = "";

}

private void Form1_Load(object sender, EventArgs e)

{

resultsList = new List<ResultOfFilters>(); UpdateGrafic();

}

private double GetPSNR(Image img0,Image img1)

{

Bitmap img1_data = (Bitmap)img0; Bitmap img2_data = (Bitmap)img1;

double pix = (double)img0.Width * (double)img0.Height; double x, psnr, MSE = 0.0, RMSE = 0.0;

int max = 0;

for (int i = 0; i < img0.Width; i++)

{

for (int j = 0; j < img0.Height; j++)

{

double first = (double)(img1_data.GetPixel(i, j).R + img1_data.GetPixel(i, j).G + img1_data.GetPixel(i, j).B) / 3.0;

double second = (double)(img2_data.GetPixel(i, j).R + img2_data.GetPixel(i, j).G + img2_data.GetPixel(i, j).B) / 3.0;

if (max < first) max = (int)first;

x = (double)first – (double)second; MSE = ((x * x) / pix);

}

}

RMSE = Math.Sqrt(MSE);

if (RMSE == 0.0) RMSE = 1.0;

psnr = 10.0 * Math.Log10((double)max / RMSE); return psnr;

}

private void UpdateGrafic()

{

// Lets generate sine and cosine wave double[] x = new double[100]; double[] y = new double[100];

double[] z = new double[100]; List<string> strList = new List<string>();

for (int i = 0; i < x.Length; i++)

{

x[i] = i;

y[i] = 20;

}

x[0] = 0;

y[0] = 20;

foreach (ResultOfFilters item in resultsList)

{

y[(int)item.DetectedPixels-1] = item.PSNR;

}

// This is to remove all plots NoiceGraf.GraphPane.CurveList.Clear();

// GraphPane object holds one or more Curve objects (or plots) GraphPane myPane = NoiceGraf.GraphPane; myPane.YAxis.Title.Text = "PSNR";

myPane.XAxis.Title.Text = "Percentage (%) of Pixels Detected as Impulsive Noise";

// PointPairList holds the data for plotting, X and Y arrays PointPairList spl1 = new PointPairList(x, y);

// PointPairList spl2 = new PointPairList(x, z);

// Add cruves to myPane object

LineItem myCurve1 = myPane.AddCurve("Original", spl1, Color.Blue, SymbolType.None);

// LineItem myCurve2 = myPane.AddCurve("Proposed", spl2, Color.Red, SymbolType.None);

myCurve1.Line.Width = 3.0F;

// myCurve2.Line.Width = 3.0F;

myPane.Title.Text = "Image with " + percentNoise + "% impulsive noice";

// I add all three functions just to be sure it refeshes the plot. NoiceGraf.AxisChange();

NoiceGraf.Invalidate(); NoiceGraf.Refresh();

}

private void button2_Click(object sender, EventArgs e)

{

pictureBox1.Image = MainImage;

}

private float GetPersentNoise(Bitmap bmp)

{

int countPix = bmp.Width * bmp.Height; int countPixDetected = 0;

int currPix,margPix;

toolStripProgressBar1.Maximum = (int)countPix; toolStripProgressBar1.Visible = true; toolStripProgressBar1.Value = 0;

for (int i = 1; i < bmp.Width – 1; i++)

{

for (int j = 1; j < bmp.Height – 1; j++)

{

currPix = GetAvrgOfPixel(bmp.GetPixel(i, j));

margPix = (GetAvrgOfPixel(bmp.GetPixel(i-1, j-1)) + GetAvrgOfPixel(bmp.GetPixel(i-1, j)) +

GetAvrgOfPixel(bmp.GetPixel(i, j+1)) + GetAvrgOfPixel(bmp.GetPixel(i+1,

j+1)) +

1)) +

+ 1))) / 8;

GetAvrgOfPixel(bmp.GetPixel(i+1, j)) + GetAvrgOfPixel(bmp.GetPixel(i+1, j-

GetAvrgOfPixel(bmp.GetPixel(i, j – 1)) + GetAvrgOfPixel(bmp.GetPixel(i – 1, j toolStripProgressBar1.Value++;

if ((currPix – margPix) > 63 || (currPix – margPix) < -63) countPixDetected++;

}

}

toolStripProgressBar1.Visible = false;

return ((float)countPixDetected / (float)(countPix / 100.0));

}

private int GetAvrgOfPixel(Color pix)

{

return (pix.R + pix.G + pix.B) / 3;

}

private void aboutProgrammToolStripMenuItem_Click(object sender, EventArgs e)

{

About about = new About(); about.ShowDialog();

}

private void saveImageToolStripMenuItem_Click(object sender, EventArgs e)

{

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif"; saveFileDialog1.Title = "Save an Image File";

saveFileDialog1.ShowDialog();

// If the file name is not an empty string open it for saving.

if (saveFileDialog1.FileName != "")

{

// Saves the Image via a FileStream created by the OpenFile method. System.IO.FileStream fs =

(System.IO.FileStream)saveFileDialog1.OpenFile();

// Saves the Image in the appropriate ImageFormat based upon the

// File type selected in the dialog box.

// NOTE that the FilterIndex property is one-based. switch (saveFileDialog1.FilterIndex)

{

case 1:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);

break;

case 2:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp);

break;

case 3:

this.pictureBox2.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Gif);

break;

}

fs.Close();

}

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.Exit();

}

}

}

using System;

using System.Collections.Generic; using System.Linq;

using System.Windows.Forms;

namespace RemoveNoice

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary> [STAThread] static void Main()

{

Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());

}

}

}

using System;

using System.Collections.Generic; using System.Linq;

using System.Text;

namespace RemoveNoice

{

public class ResultOfFilters

{

public double PSNR;

public double DetectedPixels; public int PercentOfNoise;

public ResultOfFilters()

{

}

public ResultOfFilters(double x,double y,int p)

{

PSNR = x;

DetectedPixels = y; PercentOfNoise = p;

}

}

}

Anexa B

Lista materialului grafic

Figura B.1 – Interfața principală a sistemului informațional

Figura B.2 – Încărcarea unei imagini pentru prelucrare

Figura B.3 – Rezultatul prelucrării unei imagini

Similar Posts