logo

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 .

mikä on jquery

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.