Documente Academic
Documente Profesional
Documente Cultură
Filtre de convoluție
Scopul exercițiului: cunoașterea filtrelor de convoluție și a ceea ce pot realiza acestea la prelucrarea imaginilor.
Pentru a utiliza această mască pentru filtrarea prin convoluție, sunt necesare trei instrucțiuni:
1. În primul rând, introducem secvențial numerele din mască într-un vector float:
float numere[9] = {0.11, -0.08, 0.19, -0.13, 0.91, 0.31, -0.18, 0.02, -0.12};
2. În al doilea rând, creăm masca sub forma unei matrice OpenCV:
Primele două argumente stabilesc dimensiunea matricei. Al treilea argument specifică tipul de matrice, care
în acest caz este pe 32 de biți, în virgulă mobilă și cu un singur canal.
3. Executăm filtrarea:
Să se execute următoarele:
1. Aplicați un filtru care deplasează imaginea cu un pixel într-o direcție. Încărcați o imagine și filtrați-o din nou
cu acest filtru. După fiecare filtrare, afișați imaginea într-o fereastră. Filtrați întotdeauna din nou imaginea
filtrată. Ar trebui să vedeți că imaginea se deplasează treptat în direcția dorită.
2. Construiți un filtru trece-jos cu o mască de 0,2 în mijloc și 8 valori de 0,1 în jurul acesteia. Încărcați o imagine
și filtrați-o din nou cu acest filtru. După fiecare filtrare, afișați imaginea într-o fereastră. Filtrați întotdeauna
din nou imaginea filtrată. Ar trebui să vedeți că imaginea devine ușor mai neclară cu fiecare filtrare.
3. Construiți un filtru de trecere superioară (filtru trece-sus) cu o mască de 1+k în mijloc, 4 -k/4 și 4 zerouri în
jurul ei. Încărcați o imagine și filtrați-o din nou cu acest filtru, folosind valori k crescătoare. După fiecare
filtrare, afișați imaginea într-o fereastră. Filtrați întotdeauna imaginea originală folosind noua mască. Ar
trebui să vedeți că imaginea devine din ce în ce mai clară, dar și cu mai mult zgomot.
1
2. Filtre Blur de tip Gaussian
Aceste filtre sunt utilizate pentru cazuri speciale de măști trece-jos. Ambele au o mască impară x impară cu originea
în mijloc. Masca Blur este distribuită uniform, astfel încât, de exemplu, o mască Blur de 7x5 are valori de 1/35.
Numerele dintr-o mască gaussiană urmează o distribuție în formă de clopot gaussian, astfel încât centrul are cea mai
mare valoare, iar cu cât o valoare este mai departe de origine, cu atât devine mai mică.
Primele două argumente sunt imaginea de intrare și de ieșire, al treilea argument stabilește dimensiunea măștii.
Ambele filtre estompează imaginea de intrare. Cu cât masca utilizată este mai mare, cu atât mai puternică este
estomparea. Pentru aceeași dimensiune a măștii, filtrul Blur estompează mai mult decât filtrul Gaussian.
Să se execute următoarele:
Încărcați o imagine și filtrați-o în mod repetat cu un filtru blur sau gaussian, folosind valori k crescătoare. După
fiecare filtrare, afișați imaginea într-o fereastră. Filtrați întotdeauna imaginea originală folosind noua mască. Ar
trebui să vedeți că, cu cât masca este mai mare, cu atât mai puternică este estomparea. Pentru aceeași dimensiune a
măștii, filtrul Blur va estompa mai mult decât filtrul Gaussian.
3. Filtrul median
Filtrul median nu este un filtru de convoluție, dar efectul său este similar cu cel al unui filtru trece-jos. OpenCV poate
fi utilizat după cum urmează:
Primele două argumente sunt imaginea de intrare și cea de ieșire, iar ultimul argument stabilește dimensiunea
vecinătății cu care va lucra filtrul. Vecinătatea este întotdeauna pătrată, iar dimensiunea este specificată ca un
număr impar. Cu cât dimensiunea este mai mare, cu atât mai puternic va fi efectul filtrului.
Să se execute următoarele:
4. Încărcați o imagine și trasați pe ea linii negre de diferite grosimi. Filtrați în mod repetat imaginea mâzgălită
cu un filtru median, folosind dimensiuni din ce în ce mai mari ale vecinătăților. După fiecare filtrare, afișați
imaginea într-o fereastră. Filtrați întotdeauna imaginea originală folosind noua dimensiune a vecinătății. Ar
trebui să vedeți că, cu cât vecinătatea este mai mare, cu atât zgomotul este mai gros, dar și mai neclar.
5. Desenați o imagine bicoloră: de exemplu, o amibă albă pe un fundal negru. Filtrați această imagine cu un
filtru median mare (de exemplu, 21x21) de sute de ori. După fiecare filtrare, afișați imaginea într-o fereastră.
2
Filtrați întotdeauna din nou imaginea filtrată. Ar trebui să vedeți că amoeba devine din ce în ce mai
regulată, iar când devine complet convexă, începe să se micșoreze rapid până când dispare.
------------------------------------------------------------------------------------------------------------------------------------------------
Rezolvări:
1. Problema 1 are trei rezolvări. Prima o folosește o funcție auxiliară pentru copierea unei imagini RGB,
considerând că fiecare pixel o ocupă 24 biți (3 octeți). Versiunea a doua o execută doi pași într-un ciclu, dar
nu o folosește copierea imaginii, deci poate fi folosită pentru orice fel de imagine (soluție mai generală).
Versiunea a treia este cea preferabilă, deoarece copierea imaginii se execută prin utilizarea unei metode
standard.
void lab03_1()
{
Mat imIn = imread("Imaginea_aleasa.jpg", 1);
if (imIn.empty())
{
printf(" Error opening image\n");
return;
}
Mat imOut;
waitKey(0);
waitKey(0);
}
void lab03_1a()
{
Mat imIn = imread("Imaginea_aleasa.jpg", 1);
if (imIn.empty())
{
printf(" Error opening image\n");
return;
}
Mat imOut;
waitKey(0);
waitKey(0);
}
void lab03_1b()
{
Mat imIn = imread("Imaginea_aleasa.jpg", 1);
if (imIn.empty())
{
4
printf(" Error opening image\n");
return;
}
Mat imOut;
waitKey(0);
imIn = imOut.clone();
waitKey(50);
}
waitKey(0);
}
-----------------------------------------------------------------------------
-- programele următoare nu funcționează, vor fi modificate pentru OpenCV 4.7
void lab03_2()
{
IplImage* imIn = cvLoadImage("Imaginea_aleasa.jpg", 1);
cvNamedWindow("Trece jos", CV_WINDOW_AUTOSIZE);
cvShowImage("Trece jos", imIn);
cvWaitKey(0);
5
for (int q = 0; q < 20; ++q)
{
cvFilter2D(imIn, imIn, &masca);
cvShowImage("Trece jos", imIn);
cvWaitKey(50);
}
}
6x 10x 20x
void lab02_3()
{
IplImage* imIn = cvLoadImage("Imaginea_aleasa.jpg", 1);
IplImage* imOut = cvCloneImage(imIn);
void lab02_5()
{
IplImage* imIn = cvLoadImage("amoba.png", 1);
cvNamedWindow("Amoba", CV_WINDOW_AUTOSIZE);
cvShowImage("Amoba", imIn);
cvWaitKey(0);
7
Amoba originală După 10 filtrări de tip median După 30 filtrări de tip median
După 50 filtrări de tip median După 100 filtrări de tip median După 666 filtrări de tip median