Gaussiaanse filtering wordt veel gebruikt op het gebied van beeldverwerking. Het wordt gebruikt om de ruis van een afbeelding te verminderen. In dit artikel zullen we een 2D Gaussische kernel. De 2D Gauss-kernel volgt de hieronder gegeven Gauss-verdeling.
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}
Waar y de afstand is langs de verticale as vanaf de oorsprong, x is de afstand langs de horizontale as vanaf de oorsprong en ? is de standaarddeviatie.
Wat is Gaussiaanse filtering?
Gaussiaanse filtering is een techniek die wordt gebruikt bij beeldverwerking om beelden vloeiender te maken en ruis te verminderen. Het werkt door een vervagingseffect toe te passen met behulp van een wiskundige functie genaamd de Gauss-functie, die meer gewicht toekent aan de centrale pixels en minder aan de omringende pixels. Dit resulteert in een natuurlijk ogende vervaging die ongewenste details zoals korreligheid of kleine artefacten helpt verwijderen. Gaussiaanse filtering wordt veel gebruikt als voorbewerkingsstap bij taken zoals objectherkenning van randdetectie en beeldverbetering, waardoor het voor algoritmen gemakkelijker wordt om zich op belangrijke functies te concentreren.
Implementatie in 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; } }
Uitgang:
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 toepassingen van Gaussiaanse filtering
Gaussiaanse filters worden in veel alledaagse technologieën gebruikt beeldkwaliteit verbeteren En nuttige informatie eruit halen :
- Computervisie : Helpt randen en vormen te detecteren door ruis te verminderen voordat detectiealgoritmen worden toegepast.
- Medische beeldvorming : Wordt gebruikt om MRI- of CT-scans glad te strijken, waardoor weefsels en afwijkingen gemakkelijker kunnen worden geïdentificeerd.
- Objectdetectie : bereidt afbeeldingen voor door afleiding te verwijderen, zodat modellen zich kunnen concentreren op de belangrijkste kenmerken.
- Hulpmiddelen voor fotobewerking : Vaak gebruikt om toe te passen vervagingseffecten verzacht afbeeldingen of verminder korreligheid voor een schoner uiterlijk.
Vergelijking met andere filters
Hier is hoe Gaussiaans filter onderscheidt zich van andere veel voorkomende filters:
- Boxfilter (gemiddeld filter) : Vervaagt het beeld door te geven gelijk gewicht naar alle omliggende pixels. Gaussiaans filter is beter omdat het geeft meer gewicht om pixels te centreren waardoor een vloeiendere en natuurlijkere onscherpte ontstaat.
- Mediaanfilter : Vervangt elke pixel door de mediaan van nabijgelegen waarden, wat geweldig is om te verwijderen peper-en-zout-geluid . In tegenstelling tot Gaussiaans vervaagt het beeld niet zo veel, maar kunnen de randen wel vervormd raken.
- Bilateraal filter : Zoals Gaussiaans, maar houdt ook rekening met pixelintensiteit verschillen behouden randen tijdens het gladstrijken. Het is geavanceerder, maar ook meer rekenkundig zwaar .
2D versus 1D Gaussiaanse filtering
A 2D Gaussiaans filter kan worden opgesplitst in twee 1D-filters — één horizontaal en één verticaal. Dit wordt genoemd scheidbaarheid en het betekent dat we niet in één keer een volledige 2D-kernel hoeven toe te passen.
Waarom het belangrijk is:
In plaats van zware berekeningen uit te voeren met een grote 2D-kernel (bijvoorbeeld 5×5) passen we a 1D-kernel horizontaal dan de dezelfde kernel verticaal . Dit vermindert de rekentijd en geeft de hetzelfde resultaat .
python verminderen
Prestatieoverwegingen
Het genereren en toepassen van een Gaussische kern kan zijn rekenkundig duur vooral voor grote afbeeldingen of kernels.
- Tijdcomplexiteit :
- Voor een kernel van formaat k × k toegepast op een n × n beeld de tijdscomplexiteit in O(n² × k²) .
- Dit komt omdat elke pixelbewerking een looping over de hele kernel inhoudt.
- Optimalisatie – scheidbare filters :
Gaussische kernels zijn dat wel scheidbaar wat betekent dat er in een 2D-filter kan worden ingebroken twee 1D-filters : één horizontaal en één verticaal.- Dit vermindert de tijdscomplexiteit tot O(n² × k) het maken ervan veel sneller voor grotere korrels.
Het gebruik van scheidbare filters is een veel voorkomende truc in echte systemen om Gaussiaanse filtering te versnellen zonder kwaliteitsverlies.
Moet lezen
- Pas een Gauss-filter toe op een afbeelding met Python
- Hoe genereer ik een 2D Gauss-array met NumPy?
- Integratie van Gaussische functies
Conclusie
Gaussiaanse filtering is een eenvoudige maar krachtige techniek voor het verminderen van beeldruis en onscherpte met behulp van een vloeiend gewogen gemiddelde op basis van de Gauss-functie. In dit artikel hebben we een 2D Gaussische kernel en onderzocht de rol ervan in verschillende toepassingen uit de echte wereld zoals medische beeldvorming met computervisie en fotobewerking. We hebben het ook vergeleken met andere filters en manieren besproken om dit te doen prestaties optimaliseren gebruik van scheidbare filters. Over het algemeen is Gaussiaanse filtering a fundamenteel hulpmiddel bij beeldverwerking helpt de beeldkwaliteit te verbeteren en maakt het voor algoritmen gemakkelijker om zich op belangrijke visuele details te concentreren.