Sunteți pe pagina 1din 6

Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

1


Prelucrarea imaginilor


Procesarea de imaginii este arta i tiina de manipulare a imaginilor digitale. Aceasta
se afl cu un picior ferm n matematic i cellalt n estetic i este o component critic a
sistemelor grafice de calculator.
Prelucrarea imaginilor nu este dificil. De fapt, conceptele fundamentale sunt ntr-
adevr destul de simple. O imagine, la urma urmei, este doar un dreptunghi de pixeli colorai.
Procesarea unei imagini este pur i simplu o chestiune de calcul a unei culori pentru fiecare
pixel. Noua culoare a fiecrui pixel se poate baza pe culoarea pixelului existent, culoarea
pixelilor din mprejur, ali parametri, sau o combinaie a acestor elemente.
API-ul 2D introduce un model de procesare a imaginii simplu pentru a ajuta
dezvoltatorii n a manipula acesti pixeli de imagine. Acest model se bazeaz pe clasa
java.awt.image.BufferedImage, i operaiunile de procesare a imaginii, cum ar fi convoluie i
conturare, sunt reprezentate de implementri ale interfeei java.awt.image.BufferedImageOp.







Implementarea acestor operaiuni este relativ simpl. S presupunem, de exemplu, c
avei deja imaginea surs ca un BufferedImage numit source. Efectuarea operaiunii este ilustrat
n figura de mai sus i nu necesit dect cteva linii de cod:
001 short[] threshold = new short[256];
002 for (int i = 0; i < 256; i++)
003 threshold[i] = (i < 128) ? (short)0 : (short)255;
004 BufferedImageOp thresholdOp =
005 new LookupOp(new ShortLookupTable(0, threshold),
null);
006 BufferedImage destination = thresholdOp.filter(source,
null);
Codul de mai sus face urmtoarele :

1. Instaniaz operaia de prelucrare a imaginii pe care o dorete user-ul (liniile 004 i
005). Aici s-a folosit un LookupOp, care este una dintre operaiile de imagine incluse n
Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

2

implementarea Java 2D. Ca orice alt operaie de imagine, se implementeaz interfaa
BufferedImageOp.
2. Se apeleay metoda filter() cu imaginea surs (linia 006). Sursa este procesat i
destinaia imaginii este returnat.
Dac e creat deja un BufferedImage, care va conine destinaia imaginii,se trece la al
doilea parametru pentru filter(). Dac trecem null, aa ca n codul de mai sus, este creat o
nou destinaie BufferedImage.

Convoluia

O operaiune de convoluie v permite s combinai culorile unui pixel surs i vecinii
si pentru a determina culoarea unui pixel destinaie. Aceast combinaie este specificat
utiliznd un nucleu (kernel), un operator liniar care determin proporia fiecrui pixel surs de
culoare, utilizat pentru a calcula culoarea pixelilor destinaie.
Privim nucleul ca un ablon care este suprapus pe imagine pentru a efectua o
convoluie pe un pixel la un moment dat. Dup ce pixelul este convoluionat, ablonul este
deplasat la urmtorul pixel din imaginea surs i procesul de convoluie se repet. O copie
surs a imaginii este folosit ca valoare de intrare pentru convoluie i toate valorile de ieire
sunt salvate ntr-o copie destinaie a imaginii. Dup ce operaia de convoluie este complet,
imaginea destinaie este returnat.
Centrul nucleului (kernel) poate fi considerat ca acoperirea pixelilor surs ca fiind
convoluionai. De exemplu , o operaiune de convoluie care utilizeaz urmtoarele nuclee nu
are nici un efect pe o imagine: fiecare pixel destinaie are aceeai culoare ca i pixelul surs
corespunztor.
0.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 0.0
Regula de baz pentru crearea unui nucleu (kernel) este ca toate elementele s adauge
1, dac dorii s se pstreze luminozitatea imaginii.
n API 2D, o convoluie este reprezentat de java.awt.image.ConvolveOp. Sepoate construi
o ConvolveOp folosind un nucleu, care este reprezentat de o instan a java.awt.image.Kernel.
Urmtorul cod construiete un ConvolveOp folosind nucleul prezentat mai sus.
001 float[] identityKernel = {
002 0.0f, 0.0f, 0.0f,
003 0.0f, 1.0f, 0.0f,
Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

3

004 0.0f, 0.0f, 0.0f
005 };
006 BufferedImageOp identity =
007 new ConvolveOp(new Kernel(3, 3, identityKernel));
Acum putem a ilustra unele nuclee de procesare de imagine i efectele lor.











Urmtorul cod creeaz un ConvolveOp care combin sume egale din fiecare pixel surs
i vecinii si. Aceast tehnic conduce la un efect de neclaritate.
001 float ninth = 1.0f / 9.0f;
002 float[] blurKernel = {
003 ninth, ninth, ninth,
004 ninth, ninth, ninth,
005 ninth, ninth, ninth
006 };
007 BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3,
blurKernel));
Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

4

Un alt nucleu comun de convoluie subliniaz marginile din imagine. Aceast operaie
se numete n mod obinuit detectare margine. Spre deosebire de alte nuclee prezentate aici,
coeficienii acestui nucleu nu adug pn la 1.
001 float[] edgeKernel = {
002 0.0f, -1.0f, 0.0f,
003 -1.0f, 4.0f, -1.0f,
004 0.0f, -1.0f, 0.0f
005 };
006 BufferedImageOp edge = new ConvolveOp(new Kernel(3, 3,
edgeKernel));
Efectul acestui cod este urmatorul:


















Se poate vedea c acest nucleu nu se uita la coeficienii din nucleu (liniile 002-004).
Ne gndim pentru un moment despre modul n care nucleul de detectare a marginii este folosit
pentru a opera ntr-o zon care este n ntregime o singur culoare. Fiecare pixel se va termina
cu nici o culoare (negru), deoarece culoarea pixelilor din jurul anuleaz culoare pixelului
sursa. Pixelii strlucitori nconjurai de pixeli negri vor rmne luminoi.
Se poate observa ct de ntunecat este imaginea procesat n comparaie cu originalul.
Acest lucru se ntmpl pentru c elementele nucleului detectare margine nu adug pn la 1.
O variaie simpl de detectare margine este nucleul ascuire. n acest caz, imaginea
surs este adugat ntr-un nucleu de detectare margine dup cum urmeaz:
Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

5

0.0 -1.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0
-1.0 4.0 -1.0 + 0.0 1.0 0.0 = -1.0 5.0 -1.0
0.0 -1.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0
Alegerea unui nucleu de 3 x 3 este oarecum arbitrar. Putem defini nucleele de orice
dimensiune i nu trebuie mcar s fie ptratice. n JDK 1.2 Beta 3 i 4, cu toate acestea, un
nucleu non-ptratic a produs un accident de cerere i un nucleu de 5 x 5 a amestecat datele
imaginii ntr-un mod mai ciudat. Dac nu avem un motiv ntemeiat s ne abatem de la nucleu
3 x 3, nu este recomandat altfel.
Se pune ntrebarea ce se ntmpl la marginea imaginii. Dup cum se tie, operaiunea
de convoluie ia in considerare un pixel sursa vecin, dar pixelii surs la marginile imaginii nu
au vecini pe o parte. Clasa ConvolveOp include constante care specific ce comportament ar
trebui s fie la margini.Constanta EDGE_ZERO_FILL specific faptul c marginile imaginii
destinaie sunt setate pe zero. Constanta EDGE_NO_OP specific faptul c pixelii surs de-a
lungul marginea imaginii sunt copiai la destinaie fr a fi modificai. Dac nu specificm un
comportament al marginii atunci cnd se construiete ConvolveOp, EDGE_ZERO_FILL este
utilizat.
Urmtoarea secven arat cum se poate crea un operator de ascuire care utilizeaz
regula EDGE_NO_OP (NO_OP este trecut ca un parametru ConvolveOp n linia 008) :


001 float[] sharpKernel = {
002 0.0f, -1.0f, 0.0f,
003 -1.0f, 5.0f, -1.0f,
004 0.0f, -1.0f, 0.0f
005 };
006 BufferedImageOp sharpen = new ConvolveOp(
007 new Kernel(3, 3, sharpKernel),
008 ConvolveOp.EDGE_NO_OP, null);

Efectul acestei secvene este urmtorul:


Prelucrarea imaginilor n J ava 2D Vancea I oana- Elena

6