Procesare paralela de imagini
Introducere
modificareProcesarea 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 cazult 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 embeded. Conceptul ideal de a avea un singu 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
modificareLuăm în considerare o matrice de elemente punctiforme, suficient de mare pentru a avea un element punctiform pentru fiecare pixel din imagine. În conditille în care avem mai puține elemente punctiforme putem evea un element puctiform virtual pentru fiecare pixel, urmând ca sistemul de operare sau compilatorul să se ocupe de iterație. Această arhitectură este reflecatata și definită în Programul 1 Mărimea elementului punctiform nu este predefinita, ea poate fi setată de programatorul aplicației. Variabilele dreata, 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 vom defini tipurile de date paralele. Precum în procesarea secvențială a imaginilor, va trebui să avem în vedere diferențele între imagini color, inmagini în nivel de gri și imagini binare. Contrastele pentru negru și alb sunt secificate pentru fiecare tip. Detaliile se pot observă î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 subsectiuni 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 poeratii 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. Folosing 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 pizeli vecini nust posibile: fie stânga/dreapta și sus/jos implicatnd 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 cosiderare mai mulți vecini cu atât creștem mai mult timpul de calcul. Acceul 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;