Procesare paralelă a imaginilor
Acest articol sau această secțiune are bibliografia incompletă sau inexistentă. Puteți contribui prin adăugarea de referințe în vederea susținerii bibliografice a afirmațiilor pe care le conține. |
Procesarea imaginilor prinde din ce în ce mai multă importanță în foarte multe arii de aplicare. Vederea activă, cum ar fi cea pentru vehiculele autonome, necesită o putere ce calcul foarte mare pentru a putea să opereze în timp real. În acest caz, viziunea permite dezvoltarea de sisteme mult mai flexibile și inteligente decât în cazul altor sisteme senzoriale. Există nevoia de grăbire a procesului de prelucrare a imaginilor de tip non-critic precum evaluarea imaginilor medicale sau imaginilor provenite de la sateliți. În timp ce era sistemelor SIMD de mărimi mari precum Connection Machine[1] sau MasPar[2] a trecut, conceptul poate fi utilizat pentru sisteme embedded. Conceptul ideal de a avea un singur procesor (ALU) pentru fiecare pixel dintr-o imagine permite o definiție foarte simplă și naturală a procesului de prelucrare a imaginilor.
Reprezentarea paralelă a imaginilor
modificareFie o matrice de elemente punctiforme, suficient de mare pentru a avea un element punctiform pentru fiecare pixel din imagine. În condițiile în care există mai puține elemente punctiforme se poate avea un element punctiform virtual pentru fiecare pixel, urmând ca sistemul de operare sau compilatorul să se ocupe de iterație. Această arhitectură este reflectată și definită în Programul 1.
Mărimea elementului punctiform nu este predefinită, ea putând fi setată de programatorul aplicației. Variabilele dreapta, stânga, sus, jos și cele patru diagonale pot fi utilizate cu ușurință pentru schimbul de date.
Programul 1: Configurarea procesorului pentru datele imaginii.
CONFIGURATION grid[*],[*];
CONNECTION
right:grid[i,j]<->grid[i ,j+1]:left;
up :grid[i,j]<->grid[i-1,j ]:down;
up_l :grid[i,j]<->grid[i-1,j-1]:down_r;
up_r :grid[i,j]<->grid[i-1,j+1]:down_l;
Acum se definesc tipurile de date paralele. Precum în procesarea secvențială a imaginilor, trebuie avute în vedere diferențele între imagini color, imagini în nivel de gri și imagini binare. Contrastele pentru negru și alb sunt specificate pentru fiecare tip. Detaliile se pot observa în Programul 2.
Programul 2: Tipuri de date.
TYPE binary = BOOLEAN;
gray = [0..255];
color = RECORD
red, green, blue: gray
END;
CONST b_black = TRUE;
b_white = FALSE;
g_black = 0;
g_white = 255;
c_black = color( 0, 0, 0);
c_white = color(255,255,255);
Operații punctuale și operatori locali
modificareÎn următoarele subsecțiuni vor fi prezentate câteva operații de baza împreună cu implementarea lor paralelă. Se va observă că, în cele mai multe cazuri, abordarea paralelă este mai simplă și mai lizibilă decât abordarea directă. Header-ul unei operații punctuale arăta precum exemplul de mai jos.
PROCEDURE xyz(img: VECTOR OF gray):
VECTOR OF gray;
În timp ce header-ul general al unei operații locale arăta precum:
PROCEDURE xyz(img: grid OF gray):
grid OF gray;
În ambele cazuri, o imagine gri este convertită în altă imagine. Folosind cuvântul cheie ”VECTOR“ care definește un parametru de orice tip de dată, deci declararea este mult mai generală decât în exemplul de configurare anterior. O consecință logică este aceea că schimbul local de date, în procedura este posibil doar dacă parametrii folosesc grila de configurare, în timp de VECTOR ascunde structura de configurare.
Operații punctuale
modificareCea mai simplă clasa de operatori de imagine sunt operatorii punctuali. Un nou pixel este creat ca o funcție a pixelului original; nu sunt utilizare date ale pixelilor din apropriere. Deci, operațiile punctuale nu au dependințe și pot fi foarte ușor calculate în paralel.
Media
modificareUrmătorii operatori sunt locali, care pentru a realiza o operație pe un pixel, un număr de pixeli vecini trebui luați în considerare. Mai multe zone de pixeli vecini sunt posibile: fie stânga/dreapta și sus/jos implicând 5 pixeli, fie toți vecinii direcți ai unui pixel (3*3) implicând 9 pixeli, fie 5*5 implicând 25 de pixeli. Desigur cu cât luăm în considerare mai mulți vecini cu atât creștem mai mult timpul de calcul. Accesul la pixeli vecini este implementat prin schimb de date local, într-un mod paralel.
Programul 3: întindere pe plan de gri
PROCEDURE gray_stretch(img:
VECTOR OF gray; g_min,g_max: gray):
VECTOR OF gray;
(* stretch values to g_min..g_max *)
VAR tmax,tmin: INTEGER;
BEGIN
tmin := REDUCE.MIN(img);
tmax := REDUCE.MAX(img);
(* avoid division by 0 *)
IF tmin = tmax THEN INC(tmax) END;
RETURN (g_max-g_min) * (img-tmin)
DIV (tmax-tmin) + g_min;
END gray_stretch;