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.00296902Primjena 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.