Generiranje Gaussovog filtra u C++

Gaussovo filtriranje široko se koristi u području obrade slike. Koristi se za smanjenje šuma slike. U ovom ćemo članku generirati a 2D Gaussova jezgra. 2D Gaussova jezgra slijedi dolje danu Gaussovu distribuciju. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Gdje je y udaljenost duž okomite osi od ishodišta x je udaljenost duž vodoravne osi od ishodišta i ? je standardna devijacija.

Što je Gaussovo filtriranje?

Gaussovo filtriranje je tehnika koja se koristi u obradi slike za izglađivanje slika i smanjenje šuma. Djeluje primjenom efekta zamućenja pomoću matematičke funkcije koja se zove Gaussova funkcija koja daje veću težinu središnjim pikselima, a manju okolnim pikselima. To rezultira zamućenjem prirodnog izgleda koje pomaže u uklanjanju neželjenih detalja poput zrnatosti ili malih artefakata. Gaussovo filtriranje naširoko se koristi kao korak pretprocesiranja u zadacima kao što je prepoznavanje objekata za otkrivanje rubova i poboljšanje slike što olakšava algoritmima da se usredotoče na važne značajke.

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

Izlaz: 

 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 

Primjena Gaussovog filtriranja u stvarnom svijetu

Gaussovi filtri koriste se u mnogim svakodnevnim tehnologijama za poboljšati kvalitetu slike i izvući korisne informacije :

  • Računalni vid : Pomaže u otkrivanju rubova i oblika smanjenjem šuma prije primjene algoritama za otkrivanje.
  • Medicinska slika : Koristi se za glačanje MRI ili CT skeniranja što olakšava prepoznavanje tkiva i abnormalnosti.
  • Detekcija objekata : Priprema slike uklanjanjem smetnji omogućujući modelima da se usredotoče na ključne značajke.
  • Alati za uređivanje fotografija : Obično se koristi za primjenu efekti zamućenja omekšati slike ili smanjiti zrnatost za čišći izgled.

Usporedba s drugim filtrima

Evo kako Gaussov filter izdvaja se od ostalih uobičajenih filtara:

  • Filtar okvira (filtar prosjeka) : Zamućuje sliku davanjem jednake težine na sve okolne piksele. Gaussov filter je bolji jer daje veća težina središnjih piksela stvarajući glatkije prirodnije zamućenje.
  • Srednji filtar : Zamjenjuje svaki piksel s medijan obližnjih vrijednosti što je odlično za uklanjanje buka soli i papra . Za razliku od Gaussova, ne zamućuje toliko sliku, ali može iskriviti rubove.
  • Bilateralni filter : Kao Gaussov, ali također uzima u obzir intenzitet piksela očuvanje razlika rubovi dok se glača. Napredniji je, ali i više računski težak .

2D vs 1D Gaussovo filtriranje

A 2D Gaussov filter može se rastaviti na dva 1D filtera — jedan vodoravni i jedan okomiti. Ovo se zove odvojivost a to znači da ne trebamo primijeniti puni 2D kernel odjednom.

Zašto je to važno:

Umjesto teških izračuna s velikom 2D jezgrom (npr. 5×5), primjenjujemo 1D kernel vodoravno zatim istu jezgru okomito . Ovo skraćuje vrijeme računanja i daje isti rezultat .

Razmatranja izvedbe

Generiranje i primjena a Gaussova jezgra može biti računski skupo posebno za velike slike ili kernele.

  • Vremenska složenost :
    • Za jezgru veličine k × k primijenjeno na an n × n slika vremenska složenost je O(n² × k²) .
    • To je zato što svaka operacija piksela uključuje petlju preko cijele jezgre.
  • Optimizacija – odvojivi filtri :
    Gaussove jezgre su odvojiv što znači da se 2D filter može provaliti dva 1D filtera : jedan vodoravni i jedan okomiti.
    • Ovo smanjuje vremensku složenost na O(n² × k) čineći ga puno brže za veća jezgra.

Korištenje odvojivih filtara uobičajen je trik u sustavima stvarnog svijeta za ubrzavanje Gaussovog filtriranja bez gubitka kvalitete.

Obavezno pročitati

  • Primijenite Gaussov filter na sliku pomoću Pythona
  • Kako generirati 2-D Gaussov niz koristeći NumPy?
  • Integracija Gaussovih funkcija

Zaključak

Gaussovo filtriranje je jednostavna, ali moćna tehnika za smanjenje šuma i zamućenja slike koristeći glatki ponderirani prosjek temeljen na Gaussovoj funkciji. U ovom smo članku generirali a 2D Gaussova jezgra i istražio njegovu ulogu u raznim aplikacije iz stvarnog svijeta poput medicinskog snimanja računalnog vida i uređivanja fotografija. Također smo ga usporedili s drugim filtrima i razgovarali o načinima kako to učiniti optimizirati performanse pomoću odvojivih filtara. Sveukupno Gaussovo filtriranje je a temeljni alat u obradi slike pomaže u poboljšanju kvalitete slike i olakšava algoritmima da se usredotoče na važne vizualne detalje.