logo

Gaussisk filtergenerering i C++

Gaussisk filtrering er mye brukt innen bildebehandling. Den brukes til å redusere støyen i et bilde. I denne artikkelen vil vi generere en 2D Gaussisk kjerne. Den 2D gaussiske kjernen følger den nedenfor gitte gaussiske distribusjonen. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Hvor y er avstanden langs den vertikale aksen fra origo x er avstanden langs den horisontale aksen fra origo og ? er standardavviket.

Hva er Gaussisk filtrering?

Gaussisk filtrering er en teknikk som brukes i bildebehandling for å jevne ut bilder og redusere støy. Det fungerer ved å bruke en uskarphet-effekt ved å bruke en matematisk funksjon kalt Gauss-funksjonen som gir mer vekt til de sentrale pikslene og mindre til de omkringliggende. Dette resulterer i en naturlig uskarphet som hjelper til med å fjerne uønskede detaljer som korn eller små gjenstander. Gaussisk filtrering er mye brukt som et forbehandlingstrinn i oppgaver som gjenkjenning av kantgjenkjenning og bildeforbedring, noe som gjør det lettere for algoritmer å fokusere på viktige funksjoner.



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

Produksjon: 

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 

Real-world-applikasjoner av Gaussisk filtrering

Gaussiske filtre brukes i mange dagligdagse teknologier for å forbedre bildekvaliteten og hente ut nyttig informasjon :

  • Datasyn : Hjelper med å oppdage kanter og former ved å redusere støy før du bruker deteksjonsalgoritmer.
  • Medisinsk bildebehandling : Brukes til å glatte MR- eller CT-skanninger som gjør det lettere å identifisere vev og abnormiteter.
  • Objektdeteksjon : Forbereder bilder ved å fjerne distraksjoner slik at modeller kan fokusere på nøkkelfunksjoner.
  • Verktøy for bilderedigering : Vanligvis brukt til å påføre uskarphet effekter myk opp bilder eller reduser kornethet for et renere utseende.

Sammenligning med andre filtre

Slik gjør du det Gaussisk filter skiller seg ut fra andre vanlige filtre:



  • Boksfilter (gjennomsnittlig filter) : Gjør bildet uskarpt ved å gi lik vekt til alle omkringliggende piksler. Gaussisk filter er bedre fordi det gir mer vekt for å sentrere piksler skaper en jevnere mer naturlig uskarphet.
  • Medianfilter : Erstatter hver piksel med median av nærliggende verdier som er flott å fjerne salt- og pepperstøy . I motsetning til Gaussisk gjør den ikke bildet så uskarpt, men kan forvrenge kanter.
  • Bilateralt filter : Liker gaussisk men vurderer også pikselintensitet forskjeller bevare kanter mens du glatter. Det er mer avansert, men også mer regnemessig tung .

2D vs 1D Gaussisk filtrering

EN 2D Gaussisk filter kan deles inn i to 1D-filtre — en horisontal og en vertikal. Dette kalles separerbarhet og det betyr at vi ikke trenger å bruke en full 2D-kjerne på en gang.

Hvorfor det er viktig:

I stedet for å gjøre tunge beregninger med en stor 2D-kjerne (f.eks. 5×5), bruker vi en 1D kjerne horisontalt deretter samme kjerne vertikalt . Dette kutter ned beregningstiden og gir samme resultat .

unordered_map c++

Ytelseshensyn

Generering og bruk av en Gaussisk kjerne kan være beregningsmessig dyrt spesielt for store bilder eller kjerner.



  • Tidskompleksitet :
    • For en kjerne av størrelse k × k brukt på en n × n bilde tidskompleksiteten er O(n² × k²) .
    • Dette er fordi hver pikseloperasjon involverer looping over hele kjernen.
  • Optimalisering – Separerbare filtre :
    Gaussiske kjerner er separerbar noe som betyr at et 2D-filter kan brytes inn to 1D-filtre : en horisontal og en vertikal.
    • Dette reduserer tidskompleksiteten til O(n² × k) gjør det mye raskere for større kjerner.

Å bruke separerbare filtre er et vanlig triks i virkelige systemer for å øke hastigheten på gaussisk filtrering uten å miste kvalitet.

Må leses

  • Bruk et Gauss-filter på et bilde med Python
  • Hvordan generere 2-D Gaussian array ved hjelp av NumPy?
  • Integrasjon av Gaussiske funksjoner

Konklusjon

Gaussisk filtrering er en enkel, men kraftig teknikk for reduserer bildestøy og uskarphet ved å bruke et jevnt vektet gjennomsnitt basert på Gauss-funksjonen. I denne artikkelen genererte vi en 2D Gaussisk kjerne og utforsket dens rolle i ulike virkelige applikasjoner som medisinsk bildebehandling ved datamaskinsyn og bilderedigering. Vi sammenlignet det også med andre filtre og diskuterte måter å optimalisere ytelsen ved hjelp av separerbare filtre. Samlet Gaussisk filtrering er en grunnleggende verktøy i bildebehandling bidrar til å forbedre bildekvaliteten og gjør det enklere for algoritmer å fokusere på viktige visuelle detaljer.