Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Procesarea imaginilor folosind JAI

Procesarea imaginilor folosind JAI


Procesarea imaginilor utilizand JAI API cuprinde operatii de manipulare, imbunatatire, transformare geometrica si analiza a imaginilor.


1. Manipularea imaginilor


Obiectele si metodele JAI pentru manipularea imaginilor sunt utilizate pentru imbunatatire si modificare geometrica a imaginilor si pentru a extrage informatie din imagini. Manipularea imaginilor cuprinde:

Controlul regiunilor de interes ROI (Region of Interest)

Operatori relationali



Operatori logici

Operatori aritmetici

Efect de vibratie (dithering)

Fixarea (clamping) valorilor pixelilor

Copierea benzilor


Controlul regiunilor de interes. De obicei, orice imbunatatire a unei imagini se produce asupra intregii imagini. Dar operatia de imbunatatire a imaginii poate sa imbunatateasca portiuni dintr-o imagine, celelalte portiuni ale imaginii pot sa piarda detalii, de aceea operatia de imbunatatire trebuie limitata la o regiune specifica a imaginii.

Pentru a restrictiona operatia de imbunatatire a imaginii la o regiune specifica din imagine, se creeaza o masca regiune de interes. O regiune de interes (Region of Interest - ROI) este conceptual o masca de valori true sau false. Masca ROI controleaza care pixel sursa din imagine trebuie procesat si care pixel destinatie trebuie inregistrat.

JAI suporta doua tipuri diferite de masti ROI: masca booleana si valoare de prag. Clasa ROIShape utilizeaza o masca booleana, care permite efectuarea de operatii rapid si folosind moduri de stocare compacte. Clasa ROI permite specificarea unei valori de prag, valorile pixelilor mai mari sau egale cu o valoare de prag sunt incluse in ROI. Valorile pixelilor mai mici decat valoarea pragului sunt excluse din ROI.

Regiunea de interes este definita de cele mai multe ori folosind un obiect ROIShape, care stocheaza aria folosind clase java.awt.Shape. Aceste clase definesc o arie ca si o descriere geometrica a conturului ei. Clasa ROI stocheaza o arie ca si o imagine cu o singura banda.

Un ROI poate fi atasat unei imagini ca si proprietate.

Operatori relationali. Operatorii relationali ai JAI permit efectuarea urmatoarelor operatii, folosind doua imagini sursa si o imagine destinatie:

Gasirea pixelilor celor mai mari din doua imagini sursa si stocarea rezultatelor in destinatie (Max).

Gasirea pixelilor celor mai mici din doua imagini sursa si stocarea rezultatelor in destinatie (Min).

Operatorii relationali necesita ca amandoua imaginile sursa si destinatie sa aiba acelasi tip de data si numar de benzi. Marimea celor doua imagini (inaltimea si latimea), nu trebuie sa fie neaparat la fel.

Atunci cand se determina maximul si minimul pixelilor in doua imagini, JAI executa o comparare banda cu banda.

Operatori logici. JAI suporta operatori logici monadici, diadici si unari. Operatorii logici monadici includ operatii pixel-cu-pixel AND, OR si  XOR intre o imagine sursa si o constanta pentru a produce o imagine destinatie. Operatiile logice diadice includ operatii pixel-cu-pixel AND, OR si XOR intre doua imagini sursa pentru a produce o imagine destinatie. Operatia logica unara este operatia NOT (complementare imagine) asupra fiecarui pixel a unei imagini sursa pe baza benzilor.

JAI suporta urmatoarele operatii logice:

And - preia rezultatul unei operatii pe biti AND asupra a doua imagini sursa si stocheaza rezultatul intr-o destinatie.

AdConst - preia rezultatul unei operatii pe biti AND asupra unei imagini sursa si a unei constante dintr-un set al benzilor.

Or - preia rezultatul unei operatii pe biti OR asupra a doua imagini sursa si stocheaza rezultatul intr-o destinatie.

OrConst - preia rezultatul unei operatii pe biti OR asupra unei imagini sursa si a unei constante dintr-un set al benzilor.

Xor - preia rezultatul unei operatii pe biti XOR asupra a doua imagini sursa si stocheaza rezultatul intr-o destinatie.

XorConst - preia rezultatul unei operatii pe biti XOR asupra unei imagini sursa si a unei constante dintr-un set al benzilor.

Not - preia rezultatul unei operatii pe biti NOT asupra fiecarui pixel din benzi a unei imagini sursa.

Asemenea operatorilor relationali, operatorii logici necesita ca amandoua imaginile sursa si imaginea destinatie sa aiba acelasi tip de data si numar de benzi. Marimea celor doua imagini (inaltime si latime) poate sa difere.

Operatori aritmetici. JAI suporta operatori aritmetici monadici si diadici. Operatiile aritmetice monadice includ adunarea pe banda, scaderea, divizarea si multiplicarea intre o imagine sursa si o constanta pentru a produce o imagine destinatie. Operatiile aritmetice diadice includ adunarea pe banda, scaderea, divizarea si multiplicarea intre doua imagini sursa pentru a produce o imagine destinatie.

JAI suporta urmatorii operatori aritmetici:

Add - adunarea a doua imagini sursa si stocarea rezultatului in imaginea destinatie

AddConst - adunarea unei valori constante la pixelii dintr-o imagine sursa si stocarea rezultatelor intr-o imagine destinatie.

AddCollection - aduna o colectie de imagini si stocheaza rezultatele intr-o imagine destinatie.

AddConstToCollection - aduna o arie de constante double la o colectie de imagini Rendered.



Substract - scade o imagine sursa din alta si stocheaza rezultatele intr-o imagine destinatie.

SubstractConst - scade o valoare constanta din pixelii unei imagini sursa si stocheaza rezultatele intr-o imagine destinatie.

Divide - imparte o imagine sursa cu alta si stocheaza rezultatele intr-o imagine destinatie.

DivideComplex - imparte doua imagini sursa cu date complexe si stocheaza rezultatele intr-o imagine destinatie.

DivideByConst - imparte o imagine sursa cu o valoare constanta.

Multiply - inmulteste doua imagini sursa si stocheaza rezultatele intr-o imagine destinatie.

MultiplyConst - inmulteste o imagine sursa cu o valoare constanta.

MultiplyComplex - inmulteste doua imagini reprezentand date complexe.

Absolute - gaseste valoarea absoluta a pixelilor intr-o imagine sursa si stocheaza rezultatele intr-o imagine destinatie.

Exp - preia exponentul unei imagini si stocheaza rezultatele intr-o imagine destinatie.

Asemenea operatorilor relationali si logici, operatorii aritmetici necesita ca amandoua imaginile sursa si destinatie sa aiba acelasi tip de data si numar de benzi. Marimea celor doua imagini (inaltime si latime) poate sa difere.

Atunci cand JAI aduna doua imagini, preia valoarea de la locatia 0,0 dintr-o imagine sursa, aduna la valoarea de la locatia 0,0 din cea de-a doua imagine sursa si scrie suma in imaginea destinatie la locatia 0,0. Pentru toate celelalte puncte din imagine se procedeaza la fel. Scaderea, inmultirea si impartirea sunt tratate in mod similar.

Operatiile aritmetice asupra imaginilor cu mai multe benzi se executa pe benzile corespunzatoare din imaginile sursa.

Efect de vibratie (dithering). Afisarea unei imagini color de 24 biti pe un bufer cadru de 8 biti necesita o operatie numita dithering. Aceasta operatie comprima cele trei benzi ale unei imagini RGB la o imagine byte cu o singura banda.

Operatia dithering utilizeaza un tabel de cautare prin care imaginea sursa este trecuta pentru a produce imaginea destinatie. Cea mai utilizata facilitate ale acestei operatii este conversia imaginilor true-color (byte cu trei benzi) in imagini pseudocolor (byte cu o singura banda).

Fixarea (clamping) valorilor pixelilor. Operatia clamp restrictioneaza intervalul valorilor pixelilor pentru o imagine sursa prin restrangerea intervalului pixelilor la valori "low" si "high" definite. Operatia preia o imagine sursa Rendered sau Renderable si seteaza toti pixelii a caror valoare este sub o valoare inferioara la acea valoare inferioara si toti pixelii a caror valoare este peste o valoare superioara la acea valoare superioara. Pixelii a caror valoare este intre valoarea inferioara si valoarea superioara sunt lasati nemodificati.

Copierea benzilor. Operatia BandSelect alege N benzi din o imagine sursa Rendered sau Renderable si copiaza datele pixelilor ale acestor benzi la imaginea destinatie in ordinea specificata.


2. Imbunatatirea imaginilor


Imbunatatirea imaginilor prin operatii JAI cuprinde urmatoarele:

Adaugare de borduri

Decuparea unei imagini

Rescalare de amplitudine

Egalizare de histograma

Modificare prin tabele de cautare

Filtrare prin convolutie

Filtrare mediana

Procesare in domeniul frecventa

Procesare punctuala

Binarizare (threshold)


Rescalare de amplitudine. Rescalarea de amplitudine reprezinta o transformare liniara a valorilor pixelilor de intrare la valorile pixelilor de iesire. Aceasta operatie poate fi folosita pentru imbunatatirea imaginilor care au contrast insuficient intre valorile cele mai luminoase si cele mai intunecoase, cum ar fi cele cauzate prin subexpunerea sau supraexpunerea imaginii originale.

Egalizarea de histograma. O histograma a unei imagini este un instrument analitic utilizat pentru a masura distributia amplitudinilor pixelilor dintr-o imagine. Prin analizarea distributiei amplitudinilor pixelilor, se poate obtine informatii despre aparitia vizuala a imaginii. O imagine cu contrast mare contine o distributie larga a contorizarilor pixelilor acoperind intregul interval de amplitudini. O imagine cu contrast mic are cele mai multe dintre amplitudinile pixelilor adunate intr-un spatiu relativ ingust.

Exemplul urmator (Exemplul 20.) demonstreaza crearea unui obiect histograma si o operatie de egalizare de histograma folosind acest obiect. Operatia de egalizare de histograma se realizeaza utilizand operatorul MatchCDF.


Exemplul 20. Operatie de egalizare de histograma



PlanarImage img; // imaginea sursa

// obtine histograma pentru imagine.
int binCount=256;
// obtine numarul de benzi
int numBands = img.getSampleModel().getNumBands();
// Aloca memorie pentru histograma
int[] numBins = new int[numBands];
double[] lowValue = new double[numBands];
double[] highValue = new double[numBands];
for(int i = 0; i < numBands; i++)
// creeaza un obiect Histogram.
Histogram hist = new Histogram(numBins, lowValue, highValue);
ROIShape roi;
if(frame.isGotSelected())// specifica ROI
roi = frame.getSelection();
else
roi = new ROIShape(img.getBounds());
// creeaza o operatie histogram.
RenderedOp histImage = JAI.create('histogram', img, hist, roi,
new Integer(1), new Integer(1));
// creeaza un CDF (cumulative distribution function) pentru egalizare
float[][] CDFeq = new float[numBands][];
for(int b = 0; b < numBands; b++)

// creeaza o imagine cu histograma egalizata
frame.setImage(JAI.create('matchcdf', histImage, CDFeq, roi));

Modificare prin tabele de cautare. Modificarea prin tabele de cautare (lookup table) furnizeaza o transformare de amplitudine neliniara. Transformarile de amplitudine neliniare sunt utile daca avem o diferenta de raspuns neliniar a amplitudinii dintre un senzor care captureaza datele imagine si afisare.

Mecanismul de modificare prin tabela de cautare permite conversia arbitrara intre imaginea sursa cu valorile pixelilor de tipul byte, short, sau integer si una sau mai multe valori de iesire ale pixelilor. Valoarea de iesire a pixelului imagine poate sa fie byte, short, integer, float, sau double.

Valoarea de intrare a pixelului de intrare se comporta ca si o adresa in intrarea in tabela de cautare (vezi Figura 12.). Fiecare locatie din tabela de cautare stocheaza valoarea de iesire dorita pentru o adresa particulara.





Tabela de cautare este la inceput incarcata cu datele necesare. Tabelul 18. defineste o lista partiala dintr-un exemplu de tabela de cautare.

In acest exemplu, valorile de intrare variaza intre 0 si 255. Valorile de iesire furnizeaza o transformare intre intrare si iesire, conform cu urmatoarea ecuatie:


Intrare

Iesire

0

0

1

16

2

23

3

28



253

254

254

255

255

255

Tabelul 18. Exemplu de tabela de cautare


Exemplul 21. este un fragment de cod care ilustreaza constructia si utilizarea unei tabele de cautare.




Exemplul 21. Utilizarea tabelei de cautare

PlanarImage image; // imaginea sursa
private byte lut[][];
private byte newlut[][];
private int brightness = 0;

lut = new byte[3][256];
newlut = new byte[3][256];
int i;
// initializarea tabelei de cautare
for ( i = 0; i < 256; i++ )
for ( i = 0; i < 256; i++ )
// creeaza tabela de cautare
LookupTableJAI lookup = new LookupTableJAI(newlut);
ParameterBlock pb = new ParameterBlock();
pb.addSource(image);
pb.add(lookup);
// aplica operatia de cautare in tabela
PlanarImage dst = JAI.create('lookup', pb, null);


final private byte clamp(int v) else if ( v < 0 ) else


Filtrare prin convolutie. Filtrarea prin convolutie este utilizata pentru a reduce efectele de zgomot din imagini ori pentru a accentua detaliile din imagini. Aceasta filtrare este o forma de filtrare spatiala care calculeaza fiecare esantion de iesire prin inmultirea elementelor unui nucleu cu esantioanele incunjuratoare a unui esantion sursa.

Operatiile de filtrare prin convolutie se realizeaza in JAI cu ajutorul operatorului convolve.

Filtrarea mediana. Un filtru median este utilizat pentru a elimina zgomotul de impuls din imagine si de a netezi imaginea.

Efectul de reducere a zgomotului pe care il are filtrul median asupra imaginii depinde de extinderea spatiala a vecinatatii (masca) si numarul de pixeli implicati in procesare. Operatia MedianFilter suporta trei forme de masti diferite: patrata, plus si forma de X.


3. Manipularea geometrica a imaginilor


Modificarile geometrice ale imaginii include urmatoarele:

Transformarea geometrica

Transformarea de perspectiva

Transpunerea

Shear

Rasucire

Cativa dintre operatiile de manipulare geometrica a imaginii, cum ar fi Affine, Rotate, Scale, Shear, Translate si Warp, utilizeaza o transformare geometrica pentru a calcula coordonatele punctului dintr-o imagine sursa pentru fiecare pixel destinatie din imagine. In cele mai multe cazuri, pixelul destinatie nu se afla la locatia pixelului sursa, dar se afla undeva printre pixelii vecini. Valoarea estimata pentru fiecare pixel este stabilita intr-un proces numit re-esantionarea imaginii.

Re-esantionarea este actiunea de calculare a valorii unui pixel la o pozitie pe cat posibil ne-intreaga a imaginii. Imaginea defineste valorile pixelilor in puncte intregi ale laticei si este la latitudinea re-esantionatorului sa produca o valoare rezonabila pentru pozitii care nu cad in latice. Tehnicile utilizate pentru aceasta sunt urmatoarele:

Cel mai apropiat vecin, care preia valoarea celui mai apropiat punct din latice.

Bilinear, care interpoleaza linear intre patru puncte ale laticei cele mai apropiate.

Bicubic, care aplica o functie polinomiala pe o vecinatate a punctului de 4x4.


4. Reprezentare de grafice


JAI furnizeaza clase care suporta operatii de desenare in plus fata de clasa Graphics2D. Sunt oferite trei tipuri de reprezentari grafice: grafica 2D simpla, grafica de tipul Renderable si grafica de imagine segmentata.

Clasa Graphics2D extinde clasa Graphics pentru a furniza mai mult control asupra geometriei, transformarilor de coordonate, gestiunii culorilor si afisare de text.

Clasa RenderableGraphics este o implementare a Graphics2D cu semnificatie de RenderableImage. Aceasta clasa permite stocarea unei secvente de comenzi de desenare si replicarea la o rezolutie de iesire arbitrara.

Metodele clasei RenderableGraphics rescriu metodele din clasele Graphics si Graphics2D. Acest lucru inseamna ca se pot utiliza metode in RenderableGraphics pentru a aplica culori si fonturi, pentru a crea forme grafice si text, etc.

Clasa Graphics2D permite desenarea de linii, forme geometrice, imagini si text. Aceste obiecte pot fi pictate deasupra unui TiledImage.