Sunteți pe pagina 1din 7

Laborator 7.

Operatori morfologice
Scopul laboratorului: învățarea conceptelor de bază ale morfologiei și a efectelor acestora asupra imaginilor binare și
de intensitate.

Cele două operații de bază ale morfologiei sunt expansiunea și contracția. Aceste operații utilizează un element de
structurare pentru a efectua operația dorită. În OpenCV, elementul de structurare implicit este un pătrat 3x3, dar
este posibilă înlocuirea acestuia.

Un element structurant de formă regulată este creat după cum urmează:

IplConvKernel* b = cvCreateStructuringElementEx(size_x,size_y,orig_x,orig_y,shape)

Parametrii intrucției:

size_x, size_y – lățimea și înălțimea elementului de structurare în pixeli. Dacă doriți un element structurant
simetric, utilizați numere impare.

orig_x, orig_y – poziția originii elementului de structurare. Dacă dorim să centrăm originea, atunci să fie
orig_x = size_x/2 și orig_y = size_y/2.

shape – specifică forma elementului de structurare, care poate fi CV_SHAPE_RECT, adică dreptunghi,
CV_SHAPE_ELLIPSE, adică elipsă, sau CV_SHAPE_CROSS, adică cruce.

Valoarea returnată este elementul de structurare, la care se poate face referire prin pointerul b.

Utilizarea expansiunii:

cvDilate(imIn,imOut,b,count)

Parametrii intrucției:

imIn, imOut – imaginea de intrare și de ieșire

b – elementul de structurare utilizat. Se poate da pointer NULL, dacă ne convine mărimea implicită.

count – este un număr întreg care vă permite să specificați numărul de câte ori să fie executat expansiunea. Valoarea
implicită este 1.

Utilizarea contracției:

cvErode(imIn,imOut,b,count)

Parametrii intrucției:

imIn, imOut – imaginea de intrare și de ieșire

b – elementul de structurare utilizat. Se poate da pointer NULL, dacă ne convine mărimea implicită.

count – este un număr întreg care vă permite să specificați numărul de câte ori să fie executat contracția. Valoarea
implicită este 1.

1
Problema A: Încărcați imaginea binară "cartofi.png", sau ceva similar pe care ați desenat-o cu Paint. Să examinăm
efectul asupra acestei imagini al succesiunilor succesive de contracție și expansiune (în această ordine) și de
expansiune și contracție (în această ordine).

O soluție posibilă
void labor6a()
{
// încărcarea imaginii orininale utilizând un canal de culori
IplImage* imO = cvLoadImage("cartofi.png",0);
// o clonăm imaginea pentru ieșire
IplImage* imRe = cvCloneImage(imO);
// vizualizăm imaginea citită
cvShowImage("Fereastra",imRe); cvWaitKey();
// executăm de mai multe ori contractia și vizualizăm rezultatul
for (int i=0; i<8; ++i)
{
cvErode(imRe,imRe,NULL,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// executăm de mai multe ori expansiunea și vizualizăm rezultatul
for (int i=0; i<8; ++i)
{
cvDilate(imRe,imRe,NULL,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// revenim la imaginea originală
cvCopy(imO,imRe);
// executăm de mai multe ori expansiunea și vizualizăm rezultatul
cvShowImage("Fereastra",imRe); cvWaitKey();
for (int i=0; i<12; ++i)
{
cvDilate(imRe,imRe,NULL,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// executăm de mai multe ori contractia și vizualizăm rezultatul
for (int i=0; i<12; ++i)
{
cvErode(imRe,imRe,NULL,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// eliberăm memoria
cvReleaseImage(&imO);
cvReleaseImage(&imRe);
}

Rezultate

Imaginea originală După contracție și expansiune După expansiune și contracție

Se poate observa că după expansiunea obiectul a devenit mai mic (de exemplu, și-a pierdut alungirea), în timp ce
contracția obiectului l-a făcut mai mare (de exemplu, și-a umplut fantele).
2
Problema B: Încărcați imaginea binară "cartofi.png", sau ceva similar pe care ați desenat-o cu Paint. Să examinăm
efectul pe care îl are asupra acestei imagini contracția și expansiunea ei cu elemente de structurare circulară din ce
în ce mai mari.

O soluție posibilă
void labor7b()
{
// încărcarea imaginii orininale utilizând un canal de culori
IplImage* imO = cvLoadImage("cartofi.png",0);
// o clonăm imaginea pentru ieșire
IplImage* imRe = cvCloneImage(imO);
// vizualizăm imaginea citită
cvShowImage("Fereastra",imRe); cvWaitKey();

// declarăm elementul de structurare


IplConvKernel* b;
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<16; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_ELLIPSE);
// contracția
cvErode(imO,imRe,b,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// revenim la imaginea originală
cvCopy(imO,imRe);
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<16; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_ELLIPSE);
// expansiune
cvDilate(imO,imRe,b,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// eliberăm memoria
cvReleaseImage(&imO);
cvReleaseImage(&imRe);
}

Rezultate (rândul de sus reprezintă rezultatul după contracție, iar rândul de jos reprezintă rezultatul după
expansiune, pentru elemente structurante de mărimi 7x7 și 15x15)

3
Probllema C: Să încărcăm o imagine color (de exemplu, "bond.jpg") și să vedem cum arată după o îngustare și o
lărgire, folosind un element structurant din ce în ce mai mare.

Mâzgăliți imaginea cu linii negre (trasați linii drepte pe ea). Repetați mărirea practicată mai sus, folosind un element
structurant din ce în ce mai mare.

Mâzgăliți peste imagine cu linii albe (trasați linii drepte). Repetați exercițiul de restrângere de mai sus, cu un element
structurant din ce în ce mai mare.

O soluție posibilă
void labor7c()
{
srand(time(0));

// încărcarea imaginii color


IplImage* imO = cvLoadImage("bond.jpg",1);
// o clonăm imaginea pentru ieșire
IplImage* imRe = cvCloneImage(imO);
// vizualizăm imaginea citită
cvShowImage("Fereastra",imRe); cvWaitKey();

IplConvKernel* b;
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<11; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_RECT);
cvErode(imO,imRe,b,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<11; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_RECT);
cvDilate(imO,imRe,b,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// o clonăm imaginea pentru versiunea mâzgâlită
IplImage* imX = cvCloneImage(imO);
cvCopy(imO,imX);
// să determinăm numărul liniilor în funcția de mărime a imaginii
for (int i=0; i<cvRound(sqrt(imO->width*imO->height)); ++i)
{
// punctele de terminare a liniei random
CvPoint p1 = cvPoint(rand() % imO->width,rand() % imO->height);
CvPoint p2 = cvPoint(rand() % imO->width,rand() % imO->height);
// o desenăm linia neagră de la p1 la p2
cvLine(imX,p1,p2,cvScalar(0,0,0,0));
}
4
cvShowImage("Fereastră",imX); cvWaitKey();
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<11; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_RECT);
// expansiune
cvDilate(imX,imRe,b,1);
cvShowImage("Ablak",imRe); cvWaitKey();
}
// o copiem înapoi imaginea originală în imX
cvCopy(imO,imX);
// să determinăm numărul liniilor în funcția de mărime a imaginii
for (int i=0; i<cvRound(sqrt(imO->width*imO->height)); ++i)
{
// punctele de terminare a liniei random
CvPoint p1 = cvPoint(rand() % imO->width,rand() % imO->height);
CvPoint p2 = cvPoint(rand() % imO->width,rand() % imO->height);
// o desenăm linia albă de la p1 la p2
cvLine(imX,p1,p2,cvScalar(255,255,255,0));
}
cvShowImage("Fereastra",imX); cvWaitKey();
// elementul de structurare va deveni din ce în ce mai mare
for (int i=2; i<11; ++i)
{
b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_RECT);
// contracție
cvErode(imX,imRe,b,1);
cvShowImage("Fereastra",imRe); cvWaitKey();
}
// eliberăm memoria
cvReleaseImage(&imO);
cvReleaseImage(&imRe);
cvReleaseImage(&imX);
}

Rezultate

Imaginea originală Imaginea după contracție (7x7) Imaginea după expansiune (7x7)

5
Imaginea mâzgâlită Imaginea după expansiune (3x3) Imaginea după expansiune (7x7)

Imaginea mâzgâlită Imaginea după contracție (3x3) Imaginea după contracție (7x7)

Problema D: Să încercăm gradientul morfologic cu un element structurant din ce în ce mai mare într-o imagine color.

O soluție posibilă
void labor7d()
{
// încărcarea imaginii color
IplImage* imO = cvLoadImage("canga.jpg",1);
// o clonăm imaginea pentru ieșire
IplImage* imRe = cvCloneImage(imO);
// vizualizăm imaginea citită
cvShowImage("Fereastra",imRe); cvWaitKey();

// elementul de structurare va deveni din ce în ce mai mare


for (int i=2; i<10; ++i)
{
IplConvKernel* b = cvCreateStructuringElementEx(i,i,i/2,i/2,CV_SHAPE_RECT);
// calculăm gradient morfologic
cvMorphologyEx(imO,imRe,NULL,b,CV_MOP_GRADIENT);
cvShowImage("Gradient morfologic",imRe); cvWaitKey();
}

6
// eliberăm memoria
cvReleaseImage(&imO);
cvReleaseImage(&imRe);
}

Rezultatul

Imaginea originală Element de structurare 2x2

Element de structurare 5x5 Element de structurare 9x9

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