Filtrarea Gaussiană este utilizat pe scară largă în domeniul procesării imaginilor. Este folosit pentru a reduce zgomotul unei imagini. În acest articol vom genera un Kernel gaussian 2D. Nucleul Gaussian 2D urmează distribuția Gaussiană dată de mai jos.
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}
Unde y este distanța de-a lungul axei verticale de la origine x este distanța de-a lungul axei orizontale de la origine și? este abaterea standard.
Ce este filtrarea gaussiană?
Filtrarea Gaussiană este o tehnică utilizată în procesarea imaginilor pentru a netezi imaginile și a reduce zgomotul. Funcționează prin aplicarea unui efect de estompare folosind o funcție matematică numită funcție Gaussiană care conferă mai multă greutate pixelilor centrali și mai puțină celor din jur. Acest lucru are ca rezultat o estompare cu aspect natural care ajută la eliminarea detaliilor nedorite, cum ar fi granulele sau artefactele mici. Filtrarea gaussiană este utilizată pe scară largă ca pas de preprocesare în sarcini precum recunoașterea obiectelor de detectare a marginilor și îmbunătățirea imaginii, ceea ce face mai ușor pentru algoritmi să se concentreze asupra caracteristicilor importante.
Implementare în C++
C++// C++ program to generate Gaussian filter #include #include #include using namespace std; // Function to create Gaussian filter void FilterCreation(double GKernel[][5]) { // initialising standard deviation to 1.0 double sigma = 1.0; double r s = 2.0 * sigma * sigma; // sum is for normalization double sum = 0.0; // generating 5x5 kernel for (int x = -2; x <= 2; x++) { for (int y = -2; y <= 2; y++) { r = sqrt(x * x + y * y); GKernel[x + 2][y + 2] = (exp(-(r * r) / s)) / (M_PI * s); sum += GKernel[x + 2][y + 2]; } } // normalising the Kernel for (int i = 0; i < 5; ++i) for (int j = 0; j < 5; ++j) GKernel[i][j] /= sum; } // Driver program to test above function int main() { double GKernel[5][5]; FilterCreation(GKernel); for (int i = 0; i < 5; ++i) { for (int j = 0; j < 5; ++j) cout << GKernel[i][j] << 't'; cout << endl; } }
Ieșire:
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.162103 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902
Aplicații reale ale filtrării gaussiene
Filtrele gaussiene sunt folosite în multe tehnologii de zi cu zi pentru îmbunătăți calitatea imaginii şi extrage informatii utile :
- Viziune pe computer : Ajută la detectarea marginilor și a formelor prin reducerea zgomotului înainte de aplicarea algoritmilor de detectare.
- Imagistica medicală : Folosit pentru a netezi scanările RMN sau CT, facilitând identificarea țesuturilor și a anomaliilor.
- Detectarea obiectelor : Pregătește imaginile eliminând distragerile, permițând modelelor să se concentreze asupra caracteristicilor cheie.
- Instrumente de editare a fotografiilor : Folosit în mod obișnuit pentru aplicare efecte de estompare înmuiați imaginile sau reduceți granularea pentru un aspect mai curat.
Comparație cu alte filtre
Iată cum filtru gaussian se distinge de alte filtre comune:
- Box Filter (filtru mediu) : estompează imaginea dând greutate egală la toți pixelii din jur. Filtrul gaussian este mai bun pentru că dă mai multă greutate pentru centrarea pixelilor creând o estompare mai fină și mai naturală.
- Filtru median : Înlocuiește fiecare pixel cu median de valori din apropiere, ceea ce este excelent pentru eliminare zgomot de sare și piper . Spre deosebire de Gaussian, nu estompează atât de mult imaginea, dar poate distorsiona marginile.
- Filtru bilateral : Ca Gaussian dar, de asemenea, consideră intensitatea pixelilor păstrarea diferențelor marginile în timp ce netezește. Este mai avansat, dar și mai mult grele din punct de vedere computațional .
Filtrare gaussiană 2D vs 1D
O filtru gaussian 2D poate fi descompus în două filtre 1D — unul orizontal și unul vertical. Aceasta se numește separabilitate și înseamnă că nu trebuie să aplicăm simultan un nucleu 2D complet.
De ce contează:
În loc să facem calcule grele cu un nucleu 2D mare (de exemplu, 5×5), aplicăm un Nuezul 1D pe orizontală apoi cel același nucleu pe verticală . Acest lucru reduce timpul de calcul și dă acelasi rezultat .
heapify sort
Considerații de performanță
Generarea și aplicarea a Miez gaussian poate fi costisitoare din punct de vedere al calculului mai ales pentru imagini mari sau nuclee.
- Complexitatea timpului :
- Pentru un sâmbure de dimensiune k × k aplicat unui n × n imaginează complexitatea timpului O(n² × k²) .
- Acest lucru se datorează faptului că fiecare operație de pixeli implică o buclă peste întregul nucleu.
- Optimizare – Filtre separabile :
Nuezele gaussiene sunt separabil ceea ce înseamnă că un filtru 2D poate fi spart două filtre 1D : unul orizontal si unul vertical.- Acest lucru reduce complexitatea timpului la O(n² × k) făcându-l mult mai repede pentru boabe mai mari.
Utilizarea filtrelor separabile este un truc obișnuit în sistemele din lumea reală pentru a accelera filtrarea gaussiană fără a pierde calitatea.
Trebuie citit
- Aplicați un filtru Gauss unei imagini cu Python
- Cum se generează o matrice gaussiană 2-D folosind NumPy?
- Integrarea Funcțiilor Gaussiene
Concluzie
Filtrarea gaussiană este o tehnică simplă, dar puternică pentru reducerea zgomotului și neclarității imaginii folosind o medie ponderată netedă bazată pe funcția Gaussiană. În acest articol am generat un Nuezul gaussian 2D și și-a explorat rolul în diverse aplicații din lumea reală precum imagistica medicală cu vederea computerizată și editarea fotografiilor. De asemenea, l-am comparat cu alte filtre și am discutat despre modalități optimiza performanța folosind filtre separabile. Filtrarea Gaussiană generală este a instrument de bază în procesarea imaginilor ajutând la îmbunătățirea calității imaginii și facilitând concentrarea algoritmilor asupra detaliilor vizuale importante.