Procesarea de imagini folosind programarea paralela. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte laborator. 4. Tema. 1. Obiectivul lucrarii. Lucrarea de faţă are rolul de a prezenta şi familiariza studentul cu modul de prelucrare a imaginilor date prin tablouri in fisiere text si de folosire a firelor de executie in scrierea de programe paralele ce prelucreaza imagini. La sfârşitul acestei lucrări, studentul va avea posibilitatea să foloseasca notiunile si algoritmii prezentati pentru rezolvarea unor probleme. 2. Notiuni teoretice In continuare vom considera imaginile date printr-un tablou tridimensional cu inaltimea 3, pe fiecare plan m linii si n coloane. Fiecare componenta a tabloului reprezinta luminozitatea pixelului culorii rosu (h=1), verde (h=2) si albastru (h=3) cu coordonate respective. Luminozitatea poate avea valori din multimea,0,1,2,, 255-0 negru... 255 - alb Exemplu m=4, n=5 si tabloul cu intensitatea luminozitatii unei imagini: h=1 (rosu) h=2 (verde) h=3 (albastru) 4 29 123 3 8 66 54 3 3 11 45 78 200 45 98 2 45 67 8 99 4 2 12 3 8 66 5 3 3 11 45 8 100 45 98 2 5 97 8 9 4 9 23 3 8 6 4 3 3 11 5 78 200 45 8 21 4 7 8 11 Intrare
4 5 4 29 123 3 8 66 54 3 3 11 45 78 200 45 98 2 45 67 8 99 4 2 12 3 8 66 5 3 3 11 45 8 100 45 98 2 5 97 8 9 4 9 23 3 8 6 4 3 3 11 5 78 200 45 8 21 4 7 8 11 Iesire 4 29 123 3 8 66 54 3 3 11 45 78 200 45 98 2 45 67 8 99 4 2 12 3 8 66 5 3 3 11 45 8 100 45 98 2 5 97 8 9 4 9 23 3 8 6 4 3 3 11 5 78 200 45 8 21 4 7 8 11 Program secvential import java.io.*; import java.util.*; class imagine1 { public static void main(string[] args) throws IOException { FileInputStream f=new FileInputStream("imagine.in"); InputStreamReader fchar=new InputStreamReader(f); BufferedReader buf=new BufferedReader(fchar); int m, n,i,j,h; String linie; StringTokenizer t;
linie=buf.readline(); t=new StringTokenizer(linie); m=integer.parseint(t.nexttoken()); n=integer.parseint(t.nexttoken()); int a[][][]=new int[4][m+1][n+1]; for(h=1;h<=3;h++) for(i=1;i<=m;i++){ linie=buf.readline(); t=new StringTokenizer(linie); for(j=1;j<=n;j++) a[h][i][j]=integer.parseint(t.nexttoken()); fchar.close(); FileOutputStream g=new FileOutputStream("imagine.out"); PrintStream gchar=new PrintStream(g); for(h=1;h<=3;h++){ for(i=1;i<=m;i++){ linie=""; for(j=1;j<=n;j++) linie=linie+" "+a[h][i][j]; gchar.println(linie); gchar.println(); gchar.close(); 1. Transformări simple ale imaginilor 1.1. Transformarea imaginilor din RGB în nivele de gri Nivelul de gri corespunzător culorii unui pixel se obţine prin aducerea la aceeasi intensitate a celor trei componente ale culorii pixelului respectiv (R-rosu, G-verde, B-albastru). Procedeul se aplică pentru toţi pixelii din imagine. Figura următoare prezintă cele 256 de nivele de gri reprezentate pe 24 biţi/pixel:
Intensitatea comună ale celor trei componente RGB, poate fi obţinută prin următoarea regulă: I = 0.299 R + 0.587 G + 0.114 B 1.2. Negativarea imaginilor Negativarea unei imagini poate fi efectuată transformând componentele culorii fiecărui pixel folosind următoarea regulă: 1.3. Modificarea luminozităţii imaginilor Luminozitatea unei imagini se poate modifica prin adunarea unei valori (D) la componentele culorii fiecărui pixel din imaginea respectivă, având însă grijă să nu se iasă în afara intervalului *0, 255+. Folosind o valoare pozitivă (D >0), se obţine o luminozitate mai deschisă, în timp ce o valoare negativă (D<0) determină o luminozitate mai închisă a imaginii. Modificarea luminozităţii poate fi efectuată folosind următoarea regulă:
2. Histograma unei imagini Histograma unei imagini reprezintă numărul de pixeli (frecvenţa) pentru fiecare intensitate din imaginea respectivă. De exemplu, în figura următoare 84 de pixeli din imagine au intensitatea 5: 4.1 Scalarea Scalarea este o operaţie geometrica care măreste sau micsorează o imagine sau o parte a unei imagini. Micsorarea imaginii se realizează prin înlocuirea unui grup de pixeli din imaginea originală (mărimea grupului este determinată de factorul de scalare), cu un singur pixel în imaginea destinaţie. Acest pixel va avea intensitatea unui anumit pixel din grup, sau intensitatea obţinută prin interpolarea intensităţilor pixelilor din grup (de exemplu intensitatea medie). Figura 7. Metode de micsorare. a) Inlocuirea cu pixelul din dreapta sus. b) Interpolarea folosind valoarea
Mărirea unei imagini este realizată prin replicare sau prin interpolare. Astfel, unui pixel din imaginea originală îi corespunde un grup de pixeli în imaginea destinaţie, care vor avea fie intensitatea pixelului original (din imaginea sursă), fie o interpolare a acesteia cu intensităţile pixelilor invecinaţi. Mărimea grupului este determinată de factorul de scalare. Operaţiile de interpolare, desi sunt mai mari consumatoare de resurse de procesare (ceea ce se traduce prin cresterea timpului de procesare), oferă rezultate superioare din punct de vedere calitativ. 3. Cerinte laborator. Se va verifica fiecare din sursele java prezentate anterior si se vor testa pe mai multe exemple, pentru a observa modul de functionare. Realizarea de implementari pentru problemele propuse. 4. Tema. Să se implementeze tehnicile prezentate anterior folosind algoritmi paraleli. 1. Pentru o imagine data afisati intensitatea cumulata a fiecarui pixel. 2. Realizati negativitatea unei imagini 3. Pentru o imagine si D cunoscute, modificati luminozitatea acesteia. 4. Pentru o imagine data afisati histograma ei. 5. Mariti o imagine data folosind replicarea unui singur pixel si apoi afisati noua imagine. 5. Mariti o imagine data folosind interpolarea si apoi afisati noua imagine.