Gaussin suodattimen luominen C++:ssa

Gaussin suodatus käytetään laajalti kuvankäsittelyn alalla. Sitä käytetään vähentämään kuvan kohinaa. Tässä artikkelissa luomme a 2D Gaussin ydin. 2D Gaussin ydin noudattaa alla annettua Gaussin jakaumaa. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Missä y on pystyakselin etäisyys origosta x on etäisyys vaaka-akselia pitkin origosta ja ? on keskihajonta.

Mikä on Gaussin suodatus?

Gaussin suodatus on tekniikka, jota käytetään kuvankäsittelyssä kuvien tasoittamiseen ja kohinan vähentämiseen. Se toimii käyttämällä sumennustehostetta käyttämällä matemaattista funktiota nimeltä Gauss-funktio, joka antaa enemmän painoa keskeisille pikseleille ja vähemmän ympäröiville. Tämä johtaa luonnollisen näköiseen epätarkkuuteen, joka auttaa poistamaan ei-toivottuja yksityiskohtia, kuten rakeita tai pieniä esineitä. Gauss-suodatusta käytetään laajalti esikäsittelyvaiheena tehtävissä, kuten reunantunnistusobjektin tunnistuksessa ja kuvan parantamisessa, mikä helpottaa algoritmien keskittymistä tärkeisiin ominaisuuksiin.

Toteutus C++:ssa  

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  ;      }   }   

Lähtö: 

 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 

Gaussin suodatuksen todelliset sovellukset

Gaussin suodattimia käytetään monissa jokapäiväisissä teknologioissa parantaa kuvanlaatua ja poimi hyödyllistä tietoa :

  • Tietokonenäkö : Auttaa havaitsemaan reunat ja muodot vähentämällä kohinaa ennen tunnistusalgoritmien käyttöä.
  • Lääketieteellinen kuvantaminen : Käytetään MRI- tai CT-skannausten tasoittamiseen, mikä helpottaa kudosten ja poikkeavuuksien tunnistamista.
  • Objektin tunnistus : Valmistelee kuvia poistamalla häiriötekijöitä, jolloin mallit voivat keskittyä tärkeimpiin ominaisuuksiin.
  • Valokuvien muokkaustyökalut : Käytetään yleisesti soveltamiseen hämärtää tehosteita pehmentää kuvia tai vähentää rakeisuutta puhtaamman ilmeen saamiseksi.

Vertailu muihin suodattimiin

Näin Gaussin suodatin erottuu muista yleisistä suodattimista:

  • Laatikkosuodatin (keskimääräinen suodatin) : Sumentaa kuvaa antamalla samanlainen paino kaikille ympäröiville pikseleille. Gauss-suodatin on parempi, koska se antaa enemmän painoa keskipisteisiin luo tasaisemman ja luonnollisemman sumennuksen.
  • Mediaanisuodatin : Korvaa jokaisen pikselin mediaani lähellä olevista arvoista, joka on hyvä poistaa suolan ja pippurin ääni . Toisin kuin Gaussin, se ei sumenna kuvaa niin paljon, mutta saattaa vääristää reunoja.
  • Kaksipuolinen suodatin : Kuten Gaussin, mutta myös harkitsee pikselin intensiteetti erot säilyttäen reunat tasoittamisen aikana. Se on edistyneempi, mutta myös enemmän laskennallisesti raskasta .

2D vs 1D Gaussin suodatus

A 2D Gaussin suodatin voidaan jakaa kaksi 1D-suodatinta — yksi vaaka- ja yksi pystysuora. Tätä kutsutaan erotettavuus ja se tarkoittaa, että meidän ei tarvitse käyttää täyttä 2D-ydintä kerralla.

Miksi sillä on merkitystä:

Sen sijaan, että tekisimme raskaita laskelmia suurella 2D-ytimellä (esim. 5×5), käytämme 1D-ydin vaakasuunnassa sitten sama ydin pystysuoraan . Tämä lyhentää laskenta-aikaa ja antaa sama tulos .

Suorituskykynäkökohdat

Luominen ja soveltaminen a Gaussin ydin voi olla laskennallisesti kallista erityisesti suurille kuville tai ytimille.

  • Aika monimutkaisuus :
    • Kokoiselle ytimelle k × k sovelletaan an n × n kuva aika monimutkaisuus on O(n² × k²) .
    • Tämä johtuu siitä, että jokainen pikselitoiminto sisältää silmukan koko ytimen yli.
  • Optimointi – erotettavat suodattimet :
    Gaussin ytimet ovat erotettavissa eli 2D-suodatin voidaan murtaa kaksi 1D-suodatinta : yksi vaaka- ja yksi pystysuora.
    • Tämä vähentää ajan monimutkaisuutta O(n² × k) sen tekeminen paljon nopeammin suurempia ytimiä varten.

Erotettavien suodattimien käyttö on yleinen temppu reaalimaailman järjestelmissä Gaussin suodatuksen nopeuttamiseksi laadun heikkenemättä.

Täytyy lukea

  • Käytä Gauss-suodatinta kuvaan Pythonilla
  • Kuinka luoda 2-D Gaussian-taulukko NumPyllä?
  • Gaussin funktioiden integrointi

Johtopäätös

Gaussin suodatus on yksinkertainen mutta tehokas tekniikka vähentää kuvan kohinaa ja epäterävyyttä käyttämällä tasaista painotettua keskiarvoa Gaussin funktion perusteella. Tässä artikkelissa loimme a 2D Gaussin ydin ja tutki sen roolia erilaisissa todellisia sovelluksia kuten tietokonenäön lääketieteellinen kuvantaminen ja valokuvien muokkaus. Vertasimme sitä myös muihin suodattimiin ja keskustelimme tavoista optimoida suorituskykyä käyttämällä erotettavia suodattimia. Kokonais Gaussin suodatus on a kuvankäsittelyn perustyökalu auttaa parantamaan kuvan laatua ja helpottaa algoritmien keskittymistä tärkeisiin visuaalisiin yksityiskohtiin.