∂ f ( x, y)
∂x
∇ f (x, y)=
∂ f ( x, y)
∂y
∂f ( x, y )
∂f ( x, y ) ∂f ( x, y ) ∂x D x
Notam cu D x = şi D y = , atunci ∂f ( x, y ) =
∂x ∂y D y
∂y
1
D (x, y) = [D x2 (x, y) + D y2 (x, y)] 2
D( x, y ) =| D x | + | D y |
D( x, y ) = Max(| D x |, | D y |)
Pentru implementarea discretă a gradientului au fost propuşi mai mulţi operatori. De exemplu:
∂f ( x, y ) f ( x + ∆x, y ) − f ( x, y )
D1x = ≈
∂x ∆x
∂f ( x, y ) f ( x, y + ∆y ) − f ( x, y )
D1 y = ≈
∂y ∆y
[ − 1 1] si
1
− 1
f ( x + ∆x, y ) − f ( x − ∆x, y )
D2 x ≈
2(∆x)
f ( x, y + ∆y ) − f ( x, y − ∆y )
D2 y ≈
2( ∆y )
D2x şi D2y sunt aproximări mai bune în mijlocul intervalului, adică în (x,y) şi corespund corelării
funcţiei imagine cu măştile:
½[-1 0 1] si ½ [ 1]
[ 0]
[-1]
Cei mai utilizati detectori de fronturi bazati pe gradient sunt: Roberts (numit si operatorul cruce),
Sobel si Prewitt. Ei sunt definiti pentru imagini in mai multe nivele de gri, dar utilizarea lor poate
fi extinsa pentru imagini color.
Detectorul Roberts (cruce)
D- D +
Cele 2 masti sunt proiectate pentru detectia maxima a fronturilor avand directii de 45 si 135
grade (directii perpendiculare, de unde si numele de “operatorul cruce”):
Orientarea (unghiul) zero inseamna ca directia contrastului maxim de la negru la alb este de la
stanga la dreapta in imagine, celelalte unghiuri fiind masurate in sensul acelor de ceas fata de
unghiul zero.
De regula, iesirea produsa de acest detector este numai matricea amplitudinilor, vizualizata sub
forma unei imagini in nivele de gri. In acest caz, cele doua componente ale gradientului pot fi
calculate si adunate intr-un singur pas, utilizand urmatoarea masca de pseudo-convolutie:
Principalul avantaj al utilizarii acestui detector este simplitatea calculelor: operatii de adunare si
scadere cu valorile a numai 4 pixeli.
Dezavantajul: deoarece utilizeaza un nucleu foarte mic, este foarte sensibil la zgomot. De
asemenea, raspunsul sau la frontiere reale este slab daca acestea nu sunt foarte “abrupte” (o
tranzitie de intensitate foarte mare).
Dx Dy
Mastile sunt proiectate pentru raspuns maxim la fronturi cu directiile verticala si orizontala. Ele
pot fi aplicate separat imaginii de intrare, fiind apoi folosite pentru calculul amplitudinii si al
directiei frontului in fiecare pixel al imaginii de intrare.
Amplitudinea este aproximata prin:
Unghiul zero inseamna ca directia contrastului maxim de la negru la alb este de la stanga la
dreapta in imagine, celelalte unghiuri fiind masurate in sens trigonometric (invers acelor de ceas)
fata de unghiul zero.
Atunci cand iesirea detectorului de fronturi este numai matricea amplitudinilor, componentele Dx
si Dy pot fi calculate si adunate intr-un singur pas, folosind operatorul de pseudo-convolutie:
D(x,y) = | (P3 + 2xP6 + P9) – (P1 + 2x P4 + P7)| + | (P1 + 2xP2 + P3) – (P7 + 2x P8 + P9) |
unde P1,…, P9 sunt pixelii acoperiti de masca de convolutie, ca in figura urmatoare:
Operatorul Sobel solicita mai multe calcule decat operatorul Roberts, dar masca sa de
convolutie fiind mai mare, netezeste mai mult imaginea si de aceea este mai putin sensibil la
zgomot. Produce valori de amplitudine mai mari decat cele produse de operatorul Roberts,
pentru aceleasi frontiere.
void divideReg(imagine a, imagine b, int N1, int M1, int N2, int M2,
int T, int *N)
{// a este imaginea de intrare iar b, imaginea de iesire
//N1,M1 - N2,M2 sunt colturile dreptunghiului imaginii segmentate
// reprezinta pragul folosit in criteriul de omogenitate
// in N se memoreaza numarul de regiuni rezultate din divizarea
recursiva
long s;
if(!omogen(a,N1,M1,N2,M2,T) && (N2-N1)>1 && (M2-M1)>1)
{
divideReg(a,b,N1,M1,N1+(N2-N1)/2,M1+(M2-M1)/2, T,N);
divideReg(a,b,N1+(N2-N1)/2,M1,N2,M1+(M2-M1)/2, T,N);
divideReg(a,b,N1,M1+(M2-M1)/2,N1+(N2-N1)/2,M2 T,N);
divideReg(a,b,N1+(N2-N1)/2,M1+(M2-M1)/2,N2,M2, T,N);
}
else
// regiune omogena; calculeaza media sa si o asigneaza
// pixelilor regiunii in imaginea de iesire
{
(*N)++;
s =0;
for(int i= M1; i<M2; i++)
for(int j=N1;j<N2;j++)
s+ = a[i][j];
s/=(N2-N1)*(M2-M1);
for(i=M1; i<M2; i++)
for(j=N1; j<N2; j++)
b[i][j] = (unsigned char) s;
}
return;
}
int omogen(imagine a, int N1, int M1, int N2, int M2, int T)
{
int max =0, min = Lmax; // nivelul maxim de intensitate
for(int i=M1; i<M2; i++)
for(j=N1; j<N2; j++)
{
if(a[i][j] < min) min= a[i][j];
if(a[i][j] > max) max = a[i][j];
}
if(max - min < T) return 1; // criteriul de omogenitater
else return 0;
}
Fiecare nod are patru fii, corespunzători celor patru regiuni în care se face divizarea de fiecare
dată. Este suficient să se memoreze în fiecare nod al arborelui intensitatea care a fost atribuită
pixelilor regiunii corespunzătoare nodului.
• Algoritmul are însă un dezavantaj major : poate produce regiuni adiacente similare.
Astfel:
dacă P(R) este un predicat logic care defineşte regula de segmentare (de
exemplu Imax – Imin < prag ),
atunci,
dacă P(Ri U Rj) = TRUE
=> Ri si Rj sunt regiuni similare.
Regiunile adiacente similare trebuie să fie unificate.
3 2 1
4 P 0
5 6 7
Iniţial D=6.
Este posibil ca pixelul de start sa fie un punct izolat. De aceea, daca dupa trei iteratii
nu s-a gasit un alt punct de contur, inseamna ca punctul de start este punct izolat.
D = D ⊕ 2;
return C;
}
// traverseaza conturul
while( C != S)
C = PunctContur(C);
return 1;
}
F(u) = U*MH
Atunci, ecuatia curbei Hermite se poate rescrie astfel:
p(u) = U*MH*GH
raport cu w.
vectorii de rasucire ( cate unul pentru fiecare colt ) :
Puw00, Puw01,Puw10,Puw11 , unde
plin:
Exemplu:
Fie :
∩ - intersectia;
U - reuniunea;
\ - diferenta;
┐ - complementul;
Stiind ca :
A U B = ┐ (┐A ∩ ┐B);
A \ B = A ∩ (┐ (A ∩ B));
Maparea S
Maparea O
4. (xi,yi,zi) este intersectia suprafetei cu dreapta care trece prin (x,y,z) si are
directia normalei la suprafata.
Acest tip de mapare O este corelat cu o mapare S pe un plan sau pe fetele
unui cub.
------2008-----------------
9. Comparatie curbe B-spline-Bezier. Ecuatia parametrica a curbelor Nurbs
(P1 U P2) – P3
unde: P1 = P (param 1) T1
P2 = P (param 2) T2
P3 = C (param 3 ) T3 ,
P, paralelipiped parametrizat
C, cilindru parametrizat
T1, T2, T3 transformarile geometrice aplicate celor 3
primitive solide
Reprezentarea unui solid prin aceasta metoda nu este unica si este
ne-ambigua numai daca operatiile booleene sunt “regulate”;
combinarea a 2 solide nu trebuie sa produca fete sau laturi
neconectate. Figura urmatoare reda cazul 2D al unei interectii
conventionale si cel al intersectiei regulate.
Un solid este alcatuit din 2 multimi de puncte: puncte interioare si
puncte de frontiera. Fie A si B doua solide, iA, iB multimile punctelor
interioare si f(iA), f(iB) multimile punctelor de frontiera.
A = iA U f(iA)
B = iB U f(iB)
Analog in B:
Calculul valorilor u si v in punctele intermediare, M, M’:
Rezulta ca, atat pentru punctele de pe laturi cat si pentru cele de pe segmentele
interioare, coordonatele (u,v) se obtin printr-un calcul incremental.
H h
0 L-1 0
Imagine intunecata imagine luminoasa L-1
0 L-1
g k = T (hk )
egalizarea histogramei
L-1 K
k nj k
gk = ∑ = ∑ hj
j =0 n j =0
h[i]=lh[i]/n;
* dealocare lh;
}
Daca toate valorile din w sunt pozitive, filtrul realizeaza o netezire medie (average
smoothing) a imaginii.
Filtrul medie
Cel mai simplu filtru de mediere este filtrul medie, care inlocuieste valoarea
fiecarui pixel cu media aritmetica a valorilor pixelilor din fereastra de filtrare. De
exemplu, pentru a=1, b=1 (fereastra de filtrare 3x3 pixeli), filtrul medie este definit
astfel:
1 1
g(x,y) = 1/9 Σ Σ f( x+i, y+j)
i= -1 j= -1
Filtrul medie este un filtru de netezire (FTJ- filtru “trece jos”). Tot un FTJ
este si filtrul cu urmatoarea masca:
Un FTJ atenueaza componentele de inalta frecventa din imagine, care pot
reprezenta zgomote. Imaginea rezultata din aplicarea unui FTJ este mai incetostata
(neclara) decat imaginea originala. Filtrul atenueaza tranzitiile bruste de intensitate
lasand impresia ca imaginea are mai putine detalii.
void f_net (imagine a, imagine b, int w int h, int N1, int M1, int N2, int
M2)
{
float wh, s;
wh= (float)(w*h);
w2 = l/2; h2 = h/2;
∂ f ( x, y)
∂x
∇ f (x, y)=
∂ f ( x, y)
∂y
∂f ( x, y )
∂f ( x, y ) ∂f ( x, y ) ∂x D x
Notam cu D x = şi D y = , atunci ∂f ( x, y ) =
∂x ∂y D y
∂y
Amplitudinea gradientului în pixelul (x,y) este:
1
D (x, y) = [D x2 (x, y) + D y2 (x, y)] 2
D( x, y ) =| D x | + | D y |
D( x, y ) = Max(| D x |, | D y |)
Punctele de front dintr-o imagine sunt detectate calculând gradientul in fiecare pixel şi
identificând acei pixeli pentru care amplitudinea gradientului este mai mare decât un prag dat.
Pentru implementarea discretă a gradientului au fost propuşi mai mulţi operatori. De exemplu:
∂f ( x, y ) f ( x + ∆x, y ) − f ( x, y )
D1x = ≈
∂x ∆x
∂f ( x, y ) f ( x, y + ∆y ) − f ( x, y )
D1 y = ≈
∂y ∆y
[ − 1 1] si
1
− 1
f ( x + ∆x, y ) − f ( x − ∆x, y )
D2 x ≈
2(∆x)
f ( x, y + ∆y ) − f ( x, y − ∆y )
D2 y ≈
2( ∆y )
D2x şi D2y sunt aproximări mai bune în mijlocul intervalului, adică în (x,y) şi corespund corelării
funcţiei imagine cu măştile:
½[-1 0 1] si ½ [ 1]
[ 0]
[-1]
Cei mai utilizati detectori de fronturi bazati pe gradient sunt: Roberts (numit si operatorul cruce),
Sobel si Prewitt. Ei sunt definiti pentru imagini in mai multe nivele de gri, dar utilizarea lor poate
fi extinsa pentru imagini color.
Intrarea pentru transformata Hough este matricea obţinută prin binarizarea matricei
amplitudinilor fronturilor.
Fie o imagine de N1xN2 pixeli. Cea mai simplă abordare a determinării liniilor drepte este de a
găsi linii determinate de perechi de pixeli şi apoi a găsi pixeli din imagine care aparţin acestor
linii. Numărul maxim de linii posibile este N(N-1) /2, unde N = N1 x N2. În cazul cel mai
defavorabil, fiecare pixel este verificat dacă aparţine uneia dintre cele N(N-1) /2 linii. Deci,
complexitatea calculului este O(N3), ceea ce face ca metoda să nu poată fi aplicată în practică.
--------2006---------------------
17. Ec parametrica a suprafetei care se obtine prin translatia unei drepte oarecare
din planul xoy pe o traiectorie liniara avand directia AVG?? (Nu stiu sigur, nu am
auzit bine)
0<= u <= 1
unde Bi,n(u) este polinomul Bernstein de gradul n.
Ecuatia parametrica a peticului Bezier definit prin (m+1 x n+1) puncte este :
0<= u, w <= 1
In practica se folosesc curbele cubice Bezier si suprafetele bicubice Bezier,
acestea fiind satisfacatoare din punct de vedere al continuitatii geometrice.
unde ultima este matricea de baza Bezier, notata MB. Putem deci scrie
ecuatia parametrica in forma matriciala :
p(u) = U * MB * GB
Matricea de baza, MB, este aceeasi pentru toate curbele Bezier, iar GB este
cea care difera de la o curba la alta.
19. Cond geometrice care determina un petic bicubic Bezier. Forma geometrica
matriciala
cu precizarea semnif. fiecarei matrici
(sub 10)
20. Formula Euler pentru solide oarecare
Conectivitatea unui solid oarecare este definita prin formula Euler
generalizata:
obtinem:
Algortimii clasici de scheletizare considera drept pixeli schelet pixelii multiplii care satisfac
conditia (1) din definitia pixelului multiplu (vezi “Regiuni liniare in spatiul discret”), adica satisfac
unul dintre cele 6 sabloane.
Intr-un grup de pixeli marcati cu aceeasi litera cel putin unul are valoarea diferita de zero.
Imaginea de intrare este binara. Se considera ca pixeli de contur pixelii care au un vecin-d egal
cu zero. Numai pixelii de contur pot fi pixeli de schelet.
In fiecare iteratie se parcurge imaginea marcand pixelii de contur si pixelii de schelet, pe toate
cele 4 laturi ale fiecarei regiuni existente in imagine. Dupa ce toata imaginea a fost traversata,
pixelii marcati ca fiind de contur sunt eliminati (li se da valoarea zero).
In descrierea algoritmului se apeleaza functia sablon care primeste coordonatele unui pixel si
indicele unuia dintre cele 6 sabloane. Functia intoarce 1 daca vecinatatea pixelului satisface
sablonul.
Exemplu:
0 2 0 A A A
0 P 0 satisface sablonul 0 P 0
1 0 0 B B B
void subtiere3 (imagine x, int N!, int M1, int N2, int M2)
{ int k, l, gata, D;
do
{ gata = 1;
for ( D = 0; D<7; D+=2 ) // D = 0, 2, 4, 6
{
for ( k = N1 + 1; k< N2 – 1; k++ )
for ( l = M1 + 1; k< M2 – 1; l++ )
if (x[k][l] == 1 && vecin (x, k, l, D) == 0) // pixel de contur
{ for ( i = 0, j = 0; i < 6 && !j; i++ )
j= sablon(x, k, l, i);
if ( j) // pixel schelet
x[k][l] = 3; // se marcheaza ca pixel schelet
else { x[k][l] = 2; // pixel contur
gata = 0; // mai sunt pixeli de contur ne-eliminati
}
}
}// for D
-----------2005---------------------
26. Algoritmi scan-line folositi pentru maparea texturilor pe
un poligon : Calculul matematic al coordonatelor poligonului;
algoritmii in pseudocod.
1. Pe liniile scan care trec prin varfuri apar discontinuitati ale texturii datorita
schimbarii bruste a lui du si dv atunci cand se trece printr-un varf.
Atunci cand poligonul este inclinat fata de planul de vizualizare, datorita scalarii
inegale, punctele nu mai sunt egal distribuite de-a lungul liniilor. Textura ar
trebui sa fie scalata inegal pe suprafata poligonului. O astfel de mapare se
numeste mapare perspectiva.
Maparea texturii poate fi exprimata ca o transformare de imagine spatiala generala, care aplica suprafata unui
patrat din spatiul (u,v) pe suprafata unui patrulater :
Fie x0=x si x1=x+1 doua puncte succesive de pe linia scan curenta, (u0,v0) si
(u1,v1) coordonatele in spatiul textura al celor 2 puncte.
Obtinem :
Reprezentare
Avantajele metodei :
Reprezentarea se obtine simplu,
Permite sa se calculeze proprietatile fizice ale solidului
(volumul, momentul de inertie, s.a.)
Permite realizarea cu usurinta a operatiilor booleene intre
solide.
Reprezentarea este invarianta in raport cu translatia dar nu
si cu rotatia, deoarece fetele voxelilor trebuie sa fie paralele
(daca se roteste obiectul trebuie reconstruita reprezentarea)
cu planele sistemului de coordonate 3D.
Avantajele metodei :
Metoda este adecvata pentru obiecte solide modulare, compuse din forme
paralelipipedice (arhitectura) si pentru obiecte de forme foarte neregulate, cum
sunt obiectele biologice (o aplicatie este tomografia computerizata).
29. Gradientul unei imagini : definitie, la ce se foloseste,
operatori discreti de aproximare.
(sub 1)
30. Algoritmul de extragere a tuturor contururilor dintr-o regiune.
Descriere, explicatii, pseudocod.
(nu e sub 3 )
Pentru simplificare, vom considera ca:
O regiune poate avea mai multe contururi interioare care marginesc „gauri” ale
regiunii.
PStart[ncont++] = S;
Img[S.y][S.x]++;
// traverseaza conturul
while( C != S)
{ Img[C.y][C.x]++ ;
C = PunctContur(C);
}
contur[n++] = 8;
return 1;
}
Pasii algoritmului:
Parcurgerea regiunii are loc întotdeauna spre dreapta, de aceea punctul de start
pentru parcurgere se alege de pe un arc coborâtor.
Condiţia ca un punct sa fie punct de start parcurgere este:
o codul punctului de contur anterior să fie cuprins între 4-7
o codul punctului de contur curent să fie cuprins între 5-7
3) Se parcurge regiunea din punctul de start determinat, spre dreapta, căutând fie
un punct de start pentru un contur interior, fie marginea regiunii (ieşirea din
regiune).
Parcurgerea regiunii pe linia curenta se termină la întâlnirea secvenţei 120 sau 01.
Atunci cand un contur interior are pixeli comuni cu un alt contur (cel exterior sau
unul interior), dupa traversarea sa pixelii comuni vor avea o valoare >2.
Exemple: curs
Implementarea in C a algoritmului:
Punct * PStart; int ncont=0;
unsigned char ** Img;
unsigned char * contur;
int n=0, D;
int ExtrageToateContururile(Punct S)
{
int A, B, C, l, c, c0;
int ks =0; Punct P, PS;
l=0;
c0 = 6; // codul punctului de contur anterior
P = S; // punctul de contur anterior
if( c0 >=4 && c0 <= 7 && c>=5 && c <= 7) // P este punct de start
// parcurgere spre dreapta
{ x = P.x; y = P.y; gata = 0;
while( ! gata)
{ A = (int)Img[y][x]; B = (int)Img[y][x+1]; C = (int)Img[y][x+2];
if( A==0 && B==1 || A==0 && B==2 && C==0)
{ // B este punct de start contur interior
PS.y = y; PS.x = x+1;
ExtrageContur(PS);
gata =1;
}
else
if( A==0 && B>2 && C==0 // contur interior deja parcurs
|| A==1 && B==2 && C==0) // contur exterior regiune
{ //sfarsit parcurgere linie
gata = 1;
}
x++;
}// while (! gata)
}
c0 = c;
}//while (l<n-1) – sfarsit lista contururi
return 1;
}
OBSERVATIE
In cadrul implementarii algoritmului nu au fost prevazute unele cazuri particulare,
cum ar fi:
- iesirea din spatiul imaginii, in ciclul de parcurgere spre dreapta a imaginii
- posibile configuratii de contururi interioare lipite intre ele sau de conturul exterior,
care nu satisfac sabloanele utilizate pentru a depista un contur interior neparcurs
sau unul deja parcurs
Operatorul Laplacian, care detecteaza tranzitiile bruste de intensitate din imagine, cere mai
puţin calcule. El este definit în funcţie de derivatele parţiale de ordinul 2, astfel :
∂ 2 f (x, y) ∂ 2 f (x, y)
∇ 2 f (x, y) = +
∂x 2 ∂y 2
Derivatele parţiale de ordinul al 2 –lea, de-a lungul direcţiilor x si y, sunt aproximate prin
diferente finite astfel:
∂ 2 f ( f ( x + ∆x, y ) − f ( x, y )) − ( f ( x, y ) − f ( x − ∆x, y ))
=
∂x 2 ( ∆x ) 2
∂ 2 f ( f ( x, y + ∆y ) − f ( x, y )) − ( f ( x, y ) − f ( x, y − ∆y ))
=
∂y 2 (∆y ) 2
Pentru ∆x = ∆y = 1 . Rezultă :
∂2 f
= f ( x + 1, y ) − 2 f ( x, y ) + f ( x − 1, y ).
∂x 2
∂2 f
= f ( x, y + 1) − 2 f ( x, y ) + f ( x, y − 1).
∂y 2
∇ 2 f = f ( x + 1, y ) − 4 f ( x, y ) + f ( x − 1, y ) + f ( x, y + 1) + f ( x, y − 1).
f(x,y) + f(x,y)
Adunand sau scazand imaginea rezultata prin aplicarea Laplacianului se obtine o imagine cu
frontierele evidentiate.
Pentru detectia frontierelor folosind Laplacianul, se poate proceda in mai multe moduri:
1) Se aplica un prag peste g(x,y), rezultand o imagine binara, B(x,y):