Differences

This shows you the differences between two versions of the page.

Link to this comparison view

spg:laboratoare:08 [2017/10/02 10:46]
127.0.0.1 external edit
spg:laboratoare:08 [2023/11/20 16:40] (current)
andrei.lambru
Line 1: Line 1:
-===== Laboratorul 08=====+===== Laboratorul 08 =====
  
 +===== Îmbunătățirea și Restaurarea imaginilor =====
  
 +Operațiile de restaurare și îmbunătățire a imaginilor pot fi efectuate:
 +  * În domeniul spațial (asupra imaginii reprezentate ca tablou bidimensional)
 +  * În domeniul frecvenței (asupra transformatei Fourier a imaginii)
 +
 +==== Restaurarea unei imagini ====
 +
 +Reprezintă reconstruirea imaginii fără defectele introduse de sistemul de achizitie sau operația de achiziție, cunoscând natura defectelor (modelul matematic al defectelor).
 +
 +Operații tipice:
 +  * Corecția distorsiunilor geometrice
 +  * Corecția defectelor produse de defocalizarea camerei
 +  * Corecția defectelor produse de mișcarea camerei sau a obiectelor din imagine (motion blur)
 +  * Reducerea zgomotului din imagine
 +
 +==== Îmbunătățirea unei imagini ====
 +
 +Creșterea calității imaginii în scopul interpretării sale vizuale sau al extragerii caracteristicilor din imagine.
 +
 +Operații tipice:
 +  * Transformarea nivelelor de gri (intensitate) sau a culorilor
 +  * Îmbunătățirea contrastului
 +  * Evidențierea caracteristicilor (de exemplu contururi)
 +
 +
 +==== Filtrarea Spațială a Imaginilor ====
 +
 +Are drept scop reducerea zgomotului din imagini sau evidențierea anumitor caracteristici prin procesarea reprezentării imaginii în domeniul spațial. Există mai multe tipuri de filtre spațiale:
 +  * Filtre de mediere: fiecare pixel este calculat drept o medie ponderată a valorilor pixelilor din vecinătatea sa; mai eficiente pentru imagini cu zgomot uniform sau zgomot gaussian
 +  * Filtre ordonate, filtrul conservativ:​ fiecare pixel primește una din valorile pixelilor din vecinătatea sa, aleasă pe baza poziției sale în vectorul ordonat crescător al valorilor pixelilor din vecinătate (prima, ultima, la mijloc); mai eficiente pentru imaginile cu zgomote sare-și-piper,​ zgomote exponențial negative și zgomote Rayleigh
 +  * Filtre adaptive: își schimbă comportamentul în funcție de caracteristicile nivelelor de gri din vecinătatea fiecărui pixel
 +
 +=== Filtrul median ===
 +
 +Este un filtru spațial ordonat, care înlătură zgomotele dintr-o imagine fără a atenua punctele de frontieră (tranziții bruște de intensitate). Pentru fiecare pixel al imaginii, valoarea pixelului curent este înlocuită cu valoarea pixelului din mijlocul vectorului sortat crescător, format din pixelii din vecinătatea acestuia.
 +
 +{{ :​spg:​laboratoare:​median.png?​800 |}}
 +
 +Filtrul median reduce variația intensităților din imagine, producând regiuni de intensitate constantă sau aproape constantă. Forma regiunilor depinde însă de geometria ferestrei de filtrare; acest lucru reprezintă un dezavantaj, deoarece sunt introduse în imaginea filtrată regiuni care nu existau în imaginea inițială. În general, fereastra de filtrare se alege de dimensiuni mici pentru a evita efortul de sortare a vectorilor. De obicei, forma ferestrei se bazează pe cunoașterea caracteristicilor de zgomot din imagine. Fereastra poate fi pătrat, dreptunghi (orizontal sau vertical) sau cruce.
 +
 +Filtrul median netezește oscilațiile de intensitate cu o perioadă mai mică decât lățimea ferestrei. Mai mult, modifică valoarea medie a intensităților din imagine dacă distribuția spațială a zgomotului nu este simetrică în imaginea inițială. Filtrul conservă anumite forme de frontiere și nu generează niveluri noi de gri.
 +
 +== Implementarea filtrului median ==
 +
 +**Algoritmul Huang**
 +
 +<​code>​
 +pentru fiecare rând al imaginii:
 +    pentru prima fereastră de pe rând:
 +        calculează histograma în vectorul h
 +        construiește și sortează vectorul intensităților pixelilor din fereastră
 +        determină valoarea mediană imed
 +    pentru celelalte ferestre de pe rând:
 +        actualizează histograma:
 +            scăzând contribuțiile pixelilor de pe coloana din stânga ferestrei
 +            adăugând contribuțiile pixelilor de pe ultima coloană a ferestrei
 +        actualizează imed prin incrementare/​decrementare astfel încât suma valorilor de pe primele imed poziții din vectorul h să fie egal cu jumătate din numărul de pixeli din fereastră ​
 +</​code>​
 +
 +<​note>​
 +Histograma unei imagini este o reprezentare a distribuției intensităților pixelilor din imagine.
 +h(k) = numărul de pixeli din imagine, cu intensitatea k
 +</​note>​
 +
 +**Calculul iterativ al valorii mediane bit cu bit**
 +
 +Pentru fiecare fereastră se construiește vectorul nesortat al intensităților pixelilor. Fiecare valoare din vector se reprezintă în format binar. Se determină bitul valoare medie de pe poziția cea mai semnificativă din vector. Acesta va fi bitul cel mai semnificativ al valorii mediane. Se continuă procesul de alegere a bitului valoare medie de pe fiecare poziție din reprezentarea binară a intensităților. Numărul astfel obținut va reprezenta noua valoare a pixelului.
 +
 +<note warning>​Mai multe detalii despre filtrul median găsiți în curs!</​note>​
 +
 +==== Framework laborator ====
 +
 +<note tip>
 +Framework-ul de laborator are suport de **file browsing folosind WinAPI**.
 +  * Permite încărcarea unei imagini (format png/​jpg/​bmp/​tga/​gif) prin apăsarea **tastelor SPACE**, **F** sau **ENTER**
 +  * Permite salvarea imaginii curente prin apăsarea **tastei S**
 +  * Permite schimbarea între procesare pe GPU/CPU prin apăsarea **tastei E**
 +  * Permite schimbarea procesarii cu ajutorul **tastelor 0 (original)**,​ **1 (conversie RGB - grayscale)**,​ **2 (filtrul medie)**
 +</​note>​
 +
 +De ce se bazează și acest laborator pe shadere? Framework-ul cu shadere este utilizat în principiu numai pentru afișarea pe ecran a imaginii astfel:
 +  - Se creează un dreptunghi cât fereastra aplicației,​ în spațiul NDC
 +  - Se aplică pe el o textură ce reprezintă imaginea curentă
 +  - În fragment shader se realizează doar calculul culorii, prin eșantionarea texturii.
 +
 +Folosind shadere, se poate realiza prelucrarea imaginii direct în fragment shader. În acest caz se prelucrează pixelii afișați pe ecran, și nu imaginea reală. Cealaltă posibilitate este aceea de a prelucra imaginea reală pe CPU și apoi afișarea ei pe ecran prin shadere.
 +
 +Salvarea imaginii prin apăsarea butonului “Save As” se implementează diferit, în funcție de opțiunea “Shader Based”:
 +  * Dacă filtrarea s-a realizat pe CPU, atunci ea s-a aplicat direct pe imagine, deci e suficient să salvăm imaginea, folosind biblioteca STB, în fișierul ales de utilizator.
 +  * Dacă filtrarea s-a realizat în shadere, atunci ea s-a aplicat pe pixelii afișați pe ecran, nu direct pe imagine. Pentru a obține imaginea prelucrată în shadere, se folosește funcția glReadPixels (care citește un bloc de pixeli din frame buffer și îl salvează în memoria client), după ce fereastra a fost redimensionată la rezoluția imaginii inițiale.
 +
 +Filtrele din scheletul de laborator sunt implementate astfel încât fiecare filtrare să pornească de la imaginea inițială, imaginea filtrată fiind newImageData.
 +
 +<note tip>
 +În implementarea folosind shadere, este necesar ca în fragment shader să se acceseze pixelii vecini pixelului curent. Cum facem acest lucru?
 +
 +<​code>​
 +vec2 texelSize = 1.0f / screenSize;
 +texture(textureImage,​ textureCoord + vec2(i, j) * texelSize);
 +</​code>​
 +
 +Ce este un texel? Unitatea fundamentală dintr-o textură. Cum coordonatele de textură sunt în intervalul [0, 1], iar pozele pot avea rezoluții diferite, este necesar ca mai întâi să se calculeze dimensiunea unui texel.
 +</​note>​
 +
 +<note important>​
 +În laborator sunt implementate în fragment shader conversia din RGB în grayscale și filtrul medie. Pe CPU este implementata doar conversia RGB Grayscale. Sunteți încurajați să implementați filtrul medie pe CPU și să încercați cât mai multe din filtrele prezentate la curs (atat pe CPU cât și în shadere).
 +</​note>​
 +
 +==== Cerinte laborator ====
 +
 +  - Descărcați [[https://​github.com/​UPB-Graphics/​gfx-framework|framework-ul de laborator]]
 +  - Investigați implementarea GPU / CPU pentru filtrul medie.
 +  - Implementați filtrul median pe GPU calculand vectorul ordonat al intensitatilor si valoarea mediana pentru fiecare fereastra (pentru fiecare pixel).
spg/laboratoare/08.1506930382.txt.gz · Last modified: 2018/11/16 14:22 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0