logo

Generació de filtres gaussians en C++

Filtrat gaussià s'utilitza àmpliament en el camp del processament d'imatges. S'utilitza per reduir el soroll d'una imatge. En aquest article generarem un Nucli gaussià 2D. El nucli gaussià 2D segueix la següent distribució gaussiana. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
On y és la distància al llarg de l'eix vertical des de l'origen x és la distància al llarg de l'eix horitzontal des de l'origen i? és la desviació estàndard.

Què és el filtratge gaussià?

El filtratge gaussià és una tècnica utilitzada en el processament d'imatges per suavitzar les imatges i reduir el soroll. Funciona aplicant un efecte de desenfocament mitjançant una funció matemàtica anomenada funció gaussiana que dóna més pes als píxels centrals i menys als que l'envolten. Això es tradueix en un desenfocament d'aspecte natural que ajuda a eliminar detalls no desitjats com ara gra o petits artefactes. El filtratge gaussià s'utilitza àmpliament com a pas de preprocessament en tasques com el reconeixement d'objectes de detecció de vores i la millora de la imatge, facilitant que els algorismes es concentrin en funcions importants.



Implementació en 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;  } } 

Sortida: 

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 

Aplicacions del món real del filtratge gaussià

Els filtres gaussians s'utilitzen en moltes tecnologies quotidianes per millorar la qualitat de la imatge i extreure informació útil :

  • Visió per ordinador : ajuda a detectar vores i formes reduint el soroll abans d'aplicar algorismes de detecció.
  • Imatge mèdica : S'utilitza per suavitzar les exploracions de ressonància magnètica o TC facilitant la identificació de teixits i anomalies.
  • Detecció d'objectes : prepara imatges eliminant les distraccions que permeten als models centrar-se en les funcions clau.
  • Eines d'edició de fotografies : S'utilitza habitualment per aplicar efectes de desenfocament suavitza les imatges o redueix la granulat per a un aspecte més net.

Comparació amb altres filtres

Heus aquí com Filtre gaussià es diferencia d'altres filtres comuns:



  • Filtre de caixa (filtre mitjà) : difumina la imatge donant igual pes a tots els píxels del voltant. El filtre gaussià és millor perquè dóna més pes als píxels centrals creant un difuminat més suau i natural.
  • Filtre mitjà : Substitueix cada píxel amb el mitjana de valors propers que és ideal per eliminar soroll de sal i pebre . A diferència del gaussià, no difumina tant la imatge, però pot distorsionar les vores.
  • Filtre bilateral : Com gaussià però també considera intensitat de píxels preservació de les diferències vores mentre es suavitza. És més avançat però també més pesada computacionalment .

Filtre gaussià 2D vs 1D

A Filtre gaussià 2D es pot desglossar en dos filtres 1D - un horitzontal i un altre vertical. Això es diu separabilitat i vol dir que no necessitem aplicar un nucli 2D complet alhora.

Per què importa:

En lloc de fer càlculs pesats amb un gran nucli 2D (per exemple, 5×5), apliquem un Nucli 1D horitzontalment després el mateix nucli verticalment . Això redueix el temps de càlcul i dóna el mateix resultat .

cadena a la matriu java

Consideracions de rendiment

Generar i aplicar a Nucli gaussià pot ser computacionalment costosa especialment per a imatges grans o nuclis.



  • Complexitat temporal :
    • Per a un nucli de mida k × k aplicat a un n × n imatge de la complexitat del temps O(n² × k²) .
    • Això es deu al fet que cada operació de píxels implica un bucle per tot el nucli.
  • Optimització: filtres separables :
    Els nuclis gaussians són separables el que significa que es pot trencar un filtre 2D dos filtres 1D : un horitzontal i un altre vertical.
    • Això redueix la complexitat del temps a O(n² × k) fent-ho molt més ràpid per a nuclis més grans.

L'ús de filtres separables és un truc comú en sistemes del món real per accelerar el filtratge gaussià sense perdre qualitat.

Cal llegir

  • Apliqueu un filtre Gauss a una imatge amb Python
  • Com generar una matriu gaussiana en 2D mitjançant NumPy?
  • Integració de Funcions Gaussianes

Conclusió

El filtratge gaussià és una tècnica senzilla però potent reduint el soroll i el desenfocament de la imatge utilitzant una mitjana ponderada suau basada en la funció gaussiana. En aquest article hem generat un Nucli gaussià 2D i va explorar el seu paper en diversos aplicacions del món real com ara imatges mèdiques de visió per ordinador i edició de fotografies. També ho vam comparar amb altres filtres i vam discutir maneres de fer-ho optimitzar el rendiment utilitzant filtres separables. El filtrat gaussià global és a eina fonamental en el tractament d'imatges ajudant a millorar la qualitat de la imatge i facilitant als algorismes centrar-se en detalls visuals importants.