Sunteți pe pagina 1din 9

6,67(0(,0$*,67,&(0(',&$/(Lucrarea 8

Prelucrări geometrice ale imaginilor

Scopul lucrării: prezentarea si analiza principalilor operatori geometrici. Se va utiliza pachetul de


programe DIGIMAG destinat dezvoltării aplicaţiilor de prelucrare a imaginilor cu niveluri de gri. Partea
practică este precedată de o scurtă parte teoretică necesară pentru o bună desfăşurare a lucrului în
laborator.

1. Introducere

Prelucrările geometrice sunt utilizate pentru îmbunătăţirea calităţii imaginilor şi implementează


funcţii ce modifică poziţia pixelului de coordonate ( x1 , y1 ) din imaginea de intrare în locaţia ( x2 , y 2 ) din
imaginea de ieşire. Operatorii ce realizează prelucrări geometrice descrişi în continuare sunt funcţii
polinomiale de ordinul I:

⎡ x2 ⎤ ⎡ x1 ⎤ ⎡a a12 ⎤ ⎡b ⎤
⎢ y ⎥ = A× ⎢ y ⎥ + B , A = ⎢ 11 B = ⎢ 1⎥ (1)
⎣ 2⎦ ⎣ 1⎦ ⎣a 21 a 22 ⎥⎦ ⎣b2 ⎦

Translaţia se realizează folosind valorile din matricea B, în timp ce scalarea, rotaţia şi reflexia sunt
definite de valorile din matricea A. O transformare generală ce utilizează ambele matrici utilizată adesea
pentru corectarea distorsiunilor geometrice o reprezintă transformarea afină.

2. Translaţia

Operatorul de translaţie realizează operaţia geometrică de mapare a poziţiei pixelului de coordonate


( x1 , y1 ) din imaginea de intrare în poziţia ( x2 , y2 ) din imaginea de ieşire, poziţie care este obţinută prin
translarea pixelului de coordonate ( x1 , y1 ) cu (b1 , b2 ) . Translaţia este o particularizare a transformării
afine.
Operatorul de translaţie implementează următoarele formule:

⎧ x2 = x1 + b1
⎨ (2)
⎩ y 2 = y1 + b2

Translaţia are multe aplicaţii şi este utilizată ca o operaţie de postprocesare. De exemplu, operatorii de
detecţie a contururilor ca şi algoritmii de filtrare spaţială introduc un offset în ceea ce priveşte poziţia
pixelilor în imaginea rezultat.
Algoritmul ce implementează operatorul de translaţie este prezentat în continuare.

procedure Translate(src , dst, x, y)

for i = 0 to nRows-1 do
for j = 0 to nCols-1 do
if(i+x < nRows and j+y < nCols) then
dst(i+x,j+y)= src(i,j);
endif
endfor
endfor

Intrări:
– src, dst reprezintă matricea de imagine sursă, respectiv destinaţie;
– nRows, nCols reprezintă numărul de linii, respectiv numărul de coloane ale matricii de imagine;
– x, y reprezintă deplasarea relativă a pixelului.

3. Scalarea

Operatorul de scalare implementează transformarea geometrică ce realizează mărirea, respectiv


micşorarea dimensiunii imaginii (a întregii imagini sau numai a unei porţiuni din aceasta). Reducerea
dimensiunii imaginii, operaţie cunoscută şi sub numele de reeşantionare, este realizată prin înlocuirea unui
grup de pixeli cu unul singur, al cărui nivel de gri este arbitrar ales din acest grup sau prin interpolarea
acestora. Mărirea imaginii este realizată prin replicarea unui pixel sau prin interpolarea pixelilor din
vecinătatea acestuia. Scalarea este o particularizare a transformării afine.
Scalarea este definită prin ecuaţia:

⎡ x2 ⎤ ⎡ x1 ⎤ ⎡a x 0⎤
⎢ y ⎥ = A× ⎢ y ⎥ A=⎢
a y ⎥⎦
, (3)
⎣ 2⎦ ⎣ 1⎦ ⎣0

unde a x , respectiv a y reprezintă constantele (factorii) de scalare. Factorii de scalare supraunitari aplicaţi
mulţimii de puncte ale unui obiect conduc la mărirea obiectelor din imagine şi depărtarea acestora de
originea sistemului de coordonate, în timp ce factorii de scalare subunitari conduc la micşorarea obiectului
şi apropierea lui de originea sistemului de coordonate. Daca factorii de scalare sunt negativi, atunci
rezultatul scalarii este o reflexie.
În Figura 1 sunt prezentate două metode de reeşantionare. În primul caz, un singur pixel din
vecinătate este selectat (posibil aleator) ca fiind reprezentativ pentru acea vecinătate. Această metodă, deşi
este facilă din punct de vedere computaţional, nu oferă rezultate satisfăcătoare dacă dimensiunea
vecinătăţii nu este redusă. În cel de-al doilea caz se interpolează pixelii din vecinătate, făcându-se apel la
media nivelurilor de gri ale pixelilor din acea vecinătate.

2 2 2 2
Înlocuire 6 6 6 6 Interpolare
2 2 4 4
2 2 2 2 2 2 4 2
6 6 6 6
a)
b)

Figura 1 – Metode de reeşantionare a) Înlocuirea cu pixelul din stânga sus


b) Interpolare cu valoarea medie
O imagine, sau o regiune din aceasta poate fi mărită (Zoom) folosind replicarea sau interpolarea.
Replicarea (Figura 2a) presupune înlocuirea unui pixel cu un grup de pixeli având acelaşi nivel de gri.
Dimensiunea grupului de pixeli este corelată cu factorul de scală. Rezultate mai bune se obţin dacă se
realizează interpolarea între pixelii vecini (Figura 2b).

2 3 4 5
2 2 5 5 2 3 4 5
2 2 5 5 Replicare 2 5 Interpolare
2 3 4 5
2 2 5 5 2 5 2 3 4 5
2 2 5 5
a) b)

Figura 2 – Metode de mărire a) Replicarea unui singur pixel b) Interpolare

Algoritmii ce realizează reeşantionarea imaginii prin înlocuire, respectiv prin interpolare sunt
prezentaţi în continuare.

procedure Shrink_Sample (src, dst, scalefactor)

new_h = nRows/scalefactor;
new_w = nCols/scalefactor;

for i = 0 to nRows-1-scalefactor, i = i + scalefactor do


for j = 0 to nCols-1- scalefactor, j = j + scalefactor do
sample = GetRect (src, i, j, scalefactor, scalefactor);
sample_point = sample(0); /*pixelul din coltul stanga sus*/
dst(i/scalefactor, j/scalefactor) = sample_point;
endfor
endfor

procedure Shrink_Average (src, dst, scalefactor)

new_h = nRows/scalefactor;
new_w = nCols/scalefactor;

for i = 0 to nRows-1-scalefactor), i = i + scalefactor do


for j = 0 to nCols-1-scalefactor), j = j + scalefactor do
sample = GetRect (src, i, j, scalefactor, scalefactor);
sample_point = 0;
for k = 0 to scalefactor*scalefactor-1 do
sample_point += sample(k);
endfor
sample_point /= (scalefactor*scalefactor);
dst(i/scalefactor, j/scalefactor) = sample_point;
endfor
endfor
Intrări:
– src, dst reprezintă matricea de imagine sursă, respectiv destinaţie;
– nRows, nCols reprezintă numărul de linii, respectiv numărul de coloane ale matricii de imagine;
– scalefactor reprezintă factorul de scală.

PIXEL* function GetRect (src, x, y, width, height)

k = 0;
for i = x to x+width-1 do
for j = y to y+height-1 do
result(k++) = src(i,j);
endfor
endfor

return result;

Intrări:
– src reprezintă matricea de imagine sursă;
– x, y reprezintă coordonatele unui pixel curent;
– width, height reprezintă dimensiunile unei vecinătăţi în jurul pixelului de coordonate x, y,
vecinătate definită de factorul de scală.

Ieşire:
– un tablou de pixeli de dimensiune width*height.

Algoritmul ce implementează mărirea imaginii (Zoom) folosind replicarea este prezentat în


continuare.

procedure Grow_Replicate(src, dst, scalefactor)

new_h = nRows*scalefactor;
new_w = nCols*scalefactor;

for i = 0 to new_h-1 do
for j = 0 to new_w-1 do
sample = src(i/scalefactor, j/scalefactor);
dst(i,j) = sample;
endfor
endfor

Intrări:
– src, dst reprezintă matricea de imagine sursă, respectiv destinaţie;
– nRows, nCols reprezintă numărul de linii, respectiv numărul de coloane ale matricii de imagine;
– scalefactor reprezintă factorul de scală.
3.1 Scalarea după o axă

Transformarea de scalare după o axă distorsionează un obiect prin modificarea dimensiunilor sale
după o singura direcţie (Figura 3).

y y y

x x x
a) b) c

Figura 3 – Scalarea după o axă a) Figura iniţială b) Scalarea după axa y c) Scalarea după axa x

4. Rotaţia

Operatorul de rotaţie realizează operaţia geometrică de mapare a pixelului de coordonate ( x1 , y1 ) din


imaginea de intrare în poziţia ( x2 , y 2 ) din imaginea de ieşire prin rotirea cu unghiul θ în jurul originii O .
În implementărilor operatorului, poziţiile ( x2 , y 2 ) care depăşesc dimensiunile imaginii pot fi ignorate.
Rotaţia este utilizată cu precădere ca o operaţie de preprocesare urmată de aplicarea operatorilor
direcţionali. Rotaţia este o particularizare a transformării afine.

P2
y2

r
P1
y1
θ r
φ
P0 x2 x1 x

Figura 4 – Rotaţia unui obiect faţă de un punct de referinţă

Rotaţia cu un unghi θ a unui obiect faţă de un punct P0 (de coordonate ( x0 , y 0 ) ) conduce la păstrarea
distantei obiectului faţă de acel punct şi modificarea coordonatelor in sensul pozitiv (trigonometric) pentru
θ > 0 sau in sensul orar, negativ, pentru θ < 0 .
Pentru exprimarea rotaţiei este preferabil lucrul cu coordonate polare (Figura 4).
⎧ x − x = r cos ϕ
P1 ( x1 , y1 ) : ⎨ 1 0 (4)
⎩ y1 − y0 = r sin ϕ

Rotaţia cu unghiul θ este echivalentă cu relaţiile:

⎧ x − x0 = r cos(θ + ϕ ) = r cosθ cos ϕ − r sin θ sin ϕ


Rθ : ⎨ 2 ,
⎩ y 2 − y 0 = r sin(θ + ϕ ) = r sin θ cos ϕ + r cosθ sin ϕ

sau

⎧ x = cosθ ( x1 − x0 ) − sin θ ( y1 − y 0 ) + x0
Rθ : ⎨ 2 (5)
⎩ y 2 = sin θ ( x1 − x0 ) + cosθ ( y1 − y0 ) + y 0

La fel ca şi translaţia operatorul de rotaţie poate fi folosit cu succes în etapele de preprocesare a


imaginilor. Este cunoscut faptul că o serie de operatori de detecţie direcţionali, în majoritatea
implementărilor, sunt definiţi de-a lungul unor axe situate la 00, 450, 900 etc. Utilizatorul poate astfel să-şi
construiască un operator hibrid care să acţioneze asupra direcţiei prin rotirea imaginii în direcţia dorită,
efectuarea operaţiei de detecţie şi apoi rotirea înapoi a imaginii, ca în Figura 5.

Imagine intrare
Rotire înainte Translaţie

Imagine ieşire
Scădere Rotire înapoi

Figura 5 – Operator simplu de detecţie de contur

Algoritmul ce implementează operatorul de rotaţie este prezentat în continuare.

procedure Rotate(src, dst, angle, x0, y0)

for i = 0 to nRows-1 do
for j = 0 to nCols-1 do
x2 = rot_x(angle, i-x0, j-y0) + x0;
y2 = rot_y(angle, i-x0, j-y0) + y0;
if((x2 >= 0 and x2 < nRows) and (y2 >= 0 and y2 < nCols)) then
dst(i,j) = src(x2, y2);
endif
endfor
endfor

Intrări:
– src, dst reprezintă matricea de imagine sursă, respectiv destinaţie;
– nRows, nCols reprezintă numărul de linii, respectiv numărul de coloane ale matricii de imagine;
– angle reprezintă unghiul de rotaţie;
– x0, y0 reprezintă coordonatele punctului P0 faţă de care se realizează rotaţia;

real function rot_y (angle, x, y)

cosinus = cos(angle/180*PI);
sinus = sin(angle/180*PI);

return (x*cosinus + y*(-sinus));

real function rot_x (angle, x, y)

cosinus = cos(angle/180*PI);
sinus = sin(angle/180*PI);

return (x*sinus + y*cosinus);

Intrări:
– angle reprezintă unghiul de rotaţie;
– x, y reprezintă deplasamentul relativ al pixelului curent faţă de punctul P0 ;

Ieşire:
– o valoare reală reprezentând noua poziţie a pixelului rotit cu unghiul angle faţă de axa y , respectiv x .

5. Reflexia

Operatorul de reflexie realizează operaţia geometrică de modificare a poziţiei pixelului de coordonate


( x1 , y1 ) din imaginea de intrare în poziţia ( x2 , y 2 ) din imaginea de ieşire, poziţie care este obţinută prin
oglindirea pixelului de coordonate ( x1 , y1 ) în jurul unei axe. Reflexia este o particularizare a transformării
afine.
Reflexia în jurul axei verticale situate în punctul x0 este definită de relaţiile:

⎧ x2 = − x1 + (2 ⋅ x0 )
⎨ (6)
⎩ y 2 = y1

Reflexia în jurul axei orizontale situate în punctul y0 este definită de relaţiile:

⎧ x2 = x1
⎨ (7)
⎩ y 2 = − y1 + (2 ⋅ y0 )

Reflexia în jurul unui punct de coordonate ( x0 , y 0 ) este definită de relaţiile:

⎧ x2 = − x1 + (2 ⋅ x0 )
⎨ (8)
⎩ y 2 = − y1 + (2 ⋅ y0 )
Algoritmii ce implementează operatorul de reflexie după axa x , respectiv y este prezentat în
continuare.

procedure ReflectX(src, dst, x0)

for i = 0 to nRows-1 do
for j = 0 to nCols-1 do
x1 = -i + 2*x0;
y1 = j;
if((x1 >= 0 and x1 < nRows) and (y1 >= 0 and y1 < nCols)) then
dst(i,j) = src(x1,y1);
endif
endfor
endfor

procedure ReflectY(src, dst, y0)

for i = 0 to nRows-1 do
for j = 0 to nCols-1 do
x1 = i;
y1 = -j + 2*y0;
if(x1 >= 0 and x1 < nRows) and (y1 >= 0 and y1 < nCols) then
dst(i,j) = src(x1, y1);
endif
endfor
endfor

6. Transformarea afină

În multe situaţii imaginile achiziţionate prezintă distorsiuni geometrice introduse de senzor


(camera video). Prin aplicarea transformării afine o imagine cu distorsiuni geometrice uniforme poate fi
corectată.
Transformarea afină reprezintă o clasă de transformări geometrice bidimensionale care mapează
poziţia pixelului de coordonate ( x1 , y1 ) din imaginea de intrare în poziţia ( x2 , y 2 ) din imaginea de ieşire,
poziţie care este obţinută prin aplicarea combinaţiilor liniare de translare, rotire şi scalare.

7. Modul de lucru în laborator

1. Se studiază algoritmul ce implementează operatorul de translaţie.


2. Folosind programul DIGIMAG se realizează translaţia unei imagini cu diferite valori a parametrilor x
şi y . Se comentează rezultatele.
3. Se studiază algoritmii ce implementează reeşantionarea imaginii prin înlocuire, respectiv prin
interpolare.
4. Folosind programul DIGIMAG se realizează reeşantionarea imaginii prin înlocuire, respectiv prin
interpolare pentru diferite valori ale factorului de scalare. Se comentează rezultatele.
5. Se adaugă zgomot de tip uniform, respectiv “sare şi piper” şi se reia procedura de la punctul 4. Se
comentează efectul acestora.
6. Utilizând imagini cu obiecte de diferite mărimi să se determine factorii de scalare pentru care obiectele
din imaginile de ieşire nu mai devin vizibile.
7. Se studiază algoritmul ce implementează operatorul de rotaţie.
8. Folosind programul DIGIMAG se realizează rotaţia unei imagini cu diferite unghiuri.
9. Se studiază algoritmii ce implementează operatorul de reflexie.
10. Folosind programul DIGIMAG se realizează reflexia imaginii după axa x , respectiv după axa y .

8. Modul de lucru în laborator

1. Să se scrie o funcţie ce realizează implementarea în DIGIMAG operatorului de translaţie.


2. Să se scrie o funcţie ce realizează implementarea în DIGIMAG operatorului de scalare.
3. Să se scrie o funcţie ce realizează implementarea în DIGIMAG operatorului de scalare după axa x ,
respectiv după axa y .
4. Să se scrie o funcţie ce realizează implementarea în DIGIMAG operatorului de rotaţie.
5. Să se scrie o funcţie ce realizează implementarea în DIGIMAG operatorului de reflexie.
6. Să se scrie o funcţie ce realizează implementarea în DIGIMAG a transformării afine.

S-ar putea să vă placă și