Gaussisk filtrering används i stor utsträckning inom bildbehandlingsområdet. Den används för att minska bruset i en bild. I den här artikeln kommer vi att generera en 2D Gaussisk kärna. Den 2D Gaussiska kärnan följer nedan givna Gaussisk distribution.
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}
Där y är avståndet längs den vertikala axeln från origo x är avståndet längs den horisontella axeln från origo och ? är standardavvikelsen.
Vad är Gaussisk filtrering?
Gaussisk filtrering är en teknik som används vid bildbehandling för att jämna ut bilder och minska brus. Det fungerar genom att applicera en oskärpa effekt med hjälp av en matematisk funktion som kallas Gauss-funktionen som ger mer vikt åt de centrala pixlarna och mindre till de omgivande. Detta resulterar i en naturlig oskärpa som hjälper till att ta bort oönskade detaljer som korn eller små artefakter. Gaussisk filtrering används i stor utsträckning som ett förbearbetningssteg i uppgifter som kantdetektering av objektigenkänning och bildförbättring, vilket gör det lättare för algoritmer att fokusera på viktiga 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
Verkliga tillämpningar av Gaussisk filtrering
Gaussiska filter används i många vardagliga tekniker för att förbättra bildkvaliteten och hämta användbar information :
- Datorseende : Hjälper till att upptäcka kanter och former genom att minska brus innan detekteringsalgoritmer används.
- Medicinsk bildbehandling : Används för att jämna ut MRI- eller CT-skanningar som gör det lättare att identifiera vävnader och avvikelser.
- Objektdetektion : Förbereder bilder genom att ta bort distraktioner så att modeller kan fokusera på viktiga funktioner.
- Fotoredigeringsverktyg : Används vanligtvis för att applicera oskärpa effekter mjuka upp bilder eller minska kornighet för ett renare utseende.
Jämförelse med andra filter
Så här gör du Gaussiskt filter skiljer sig från andra vanliga filter:
- Boxfilter (genomsnittligt filter) : Gör bilden suddig genom att ge lika vikt till alla omgivande pixlar. Gaussiskt filter är bättre eftersom det ger mer vikt för att centrera pixlar skapar en mjukare mer naturlig oskärpa.
- Medianfilter : Ersätter varje pixel med median av närliggande värden som är bra att ta bort salt- och pepparljud . Till skillnad från Gaussisk gör den inte bilden lika suddig men kan förvränga kanterna.
- Bilateralt filter : Gillar Gauss men anser också pixelintensitet skillnader bevara kanter medan du slätar ut. Det är mer avancerat men också mer beräkningstung .
2D vs 1D Gaussisk filtrering
A 2D Gaussiskt filter kan delas upp i två 1D-filter — en horisontell och en vertikal. Detta kallas separerbarhet och det betyder att vi inte behöver använda en fullständig 2D-kärna på en gång.
Varför det är viktigt:
Istället för att göra tunga beräkningar med en stor 2D-kärna (t.ex. 5×5) tillämpar vi en 1D kärna horisontellt sedan samma kärna vertikalt . Detta minskar beräkningstiden och ger samma resultat .
grep kommando i linux
Prestandaöverväganden
Generera och tillämpa en Gaussisk kärna kan vara beräkningsmässigt dyrt speciellt för stora bilder eller kärnor.
- Tidskomplexitet :
- För en kärna av storlek k × k tillämpas på en n × n bild tidskomplexiteten är O(n² × k²) .
- Detta beror på att varje pixeloperation innebär looping över hela kärnan.
- Optimering – Separerbara filter :
Gaussiska kärnor är separerbar vilket innebär att ett 2D-filter kan delas in två 1D-filter : en horisontell och en vertikal.- Detta minskar tidskomplexiteten till O(n² × k) gör det mycket snabbare för större kärnor.
Att använda separerbara filter är ett vanligt trick i verkliga system för att påskynda gaussisk filtrering utan att förlora kvalitet.
Måste läsa
- Använd ett Gauss-filter på en bild med Python
- Hur genererar man 2D Gaussian array med NumPy?
- Integration av Gaussiska funktioner
Slutsats
Gaussisk filtrering är en enkel men kraftfull teknik för minskar bildbrus och suddighet med ett jämnt viktat medelvärde baserat på Gauss-funktionen. I den här artikeln skapade vi en 2D Gaussisk kärna och utforskade dess roll i olika verkliga applikationer som medicinsk bildbehandling med datorseende och fotoredigering. Vi jämförde det också med andra filter och diskuterade sätt att optimera prestanda med hjälp av separerbara filter. Övergripande Gaussisk filtrering är en grundläggande verktyg för bildbehandling hjälper till att förbättra bildkvaliteten och gör det lättare för algoritmer att fokusera på viktiga visuella detaljer.