logo

Gaussisk filtergenerering i C++

Gaussisk filtrering er meget udbredt inden for billedbehandling. Det bruges til at reducere støjen i et billede. I denne artikel vil vi generere en 2D Gaussisk kerne. 2D Gauss-kernen følger nedenstående Gauss-fordeling. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Hvor y er afstanden langs den lodrette akse fra origo x er afstanden langs den vandrette akse fra origo og ? er standardafvigelsen.

Hvad er Gaussisk filtrering?

Gaussisk filtrering er en teknik, der bruges i billedbehandling til at udjævne billeder og reducere støj. Det virker ved at anvende en sløringseffekt ved hjælp af en matematisk funktion kaldet Gauss-funktionen, som giver mere vægt til de centrale pixels og mindre til de omkringliggende. Dette resulterer i en naturligt udseende sløring, der hjælper med at fjerne uønskede detaljer som korn eller små artefakter. Gaussisk filtrering bruges i vid udstrækning som et forbehandlingstrin i opgaver som kantgenkendelse af objektgenkendelse og billedforbedring, hvilket gør det lettere for algoritmer at fokusere på vigtige funktioner.



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

Produktion: 

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 applikationer af Gaussisk filtrering

Gaussiske filtre bruges i mange dagligdags teknologier til forbedre billedkvaliteten og udtrække nyttig information :

  • Computer Vision : Hjælper med at registrere kanter og former ved at reducere støj, før du anvender detektionsalgoritmer.
  • Medicinsk billeddannelse : Bruges til at udglatte MR- eller CT-scanninger, hvilket gør det lettere at identificere væv og abnormiteter.
  • Objektdetektion : Forbereder billeder ved at fjerne distraktioner, så modeller kan fokusere på nøglefunktioner.
  • Fotoredigeringsværktøjer : Almindelig brugt til at anvende sløringseffekter blødgør billeder eller reducerer kornethed for et renere udseende.

Sammenligning med andre filtre

Sådan gør du Gaussisk filter skiller sig ud fra andre almindelige filtre:



  • Boksfilter (gennemsnitligt filter) : Slører billedet ved at give lige vægt til alle omgivende pixels. Gaussisk filter er bedre, fordi det giver mere vægt til at centrere pixels skabe en glattere mere naturlig sløring.
  • Median filter : Erstatter hver pixel med median af nærliggende værdier, som er fantastisk til at fjerne salt- og peberstøj . I modsætning til Gaussisk slører det ikke billedet så meget, men kan forvrænge kanterne.
  • Bilateralt filter : Ligesom Gauss, men overvejer også pixel intensitet forskelle bevare kanter mens du glatter. Det er mere avanceret, men også mere beregningsmæssigt tung .

2D vs 1D Gaussisk filtrering

EN 2D Gaussisk filter kan opdeles i to 1D-filtre — en vandret og en lodret. Dette kaldes adskillelighed og det betyder, at vi ikke behøver at anvende en fuld 2D-kerne på én gang.

Hvorfor er det vigtigt:

I stedet for at lave tunge beregninger med en stor 2D-kerne (f.eks. 5×5) anvender vi en 1D kerne vandret derefter samme kerne lodret . Dette skærer ned på beregningstiden og giver samme resultat .

unordered_map c++

Ydelsesovervejelser

Generering og anvendelse af en Gaussisk kerne kan være beregningsmæssigt dyrt især til store billeder eller kerner.



  • Tidskompleksitet :
    • For en kerne af størrelse k × k anvendt på en n × n billede af tidskompleksiteten er O(n² × k²) .
    • Dette skyldes, at hver pixeloperation involverer looping over hele kernen.
  • Optimering – Separerbare filtre :
    Gaussiske kerner er adskillelig hvilket betyder, at et 2D-filter kan opdeles to 1D-filtre : en vandret og en lodret.
    • Dette reducerer tidskompleksiteten til O(n² × k) laver det meget hurtigere til større kerner.

Brug af separerbare filtre er et almindeligt trick i virkelige systemer til at fremskynde Gaussisk filtrering uden at miste kvalitet.

Skal læses

  • Anvend et Gauss-filter på et billede med Python
  • Hvordan genereres 2-D Gaussian array ved hjælp af NumPy?
  • Integration af Gaussiske funktioner

Konklusion

Gaussisk filtrering er en enkel, men kraftfuld teknik til reducere billedstøj og sløring ved at bruge et jævnt vægtet gennemsnit baseret på Gauss-funktionen. I denne artikel genererede vi en 2D Gaussisk kerne og udforsket dens rolle i forskellige applikationer fra den virkelige verden som computersyn medicinsk billedbehandling og fotoredigering. Vi sammenlignede det også med andre filtre og diskuterede måder at optimere ydeevnen ved hjælp af adskillelige filtre. Overordnet Gaussisk filtrering er en grundlæggende værktøj i billedbehandling hjælper med at forbedre billedkvaliteten og gør det nemmere for algoritmer at fokusere på vigtige visuelle detaljer.