Box oskärpa
En boxoskärpa (även känd som ett linjärt boxfilter) är ett linjärt filter för rumslig domän där varje pixel i den resulterande bilden har ett värde lika med medelvärdet för dess närliggande pixlar i inmatningsbilden. Det är en form av lågpassfilter ("blurring"). En oskärpa på 3 gånger 3 ("radie 1") kan skrivas som matris
På grund av dess egenskap att använda lika vikter, kan den implementeras med en mycket enklare ackumuleringsalgoritm, som är betydligt snabbare än att använda en skjutfönsteralgoritm.
Boxoskärpa används ofta för att uppskatta en Gaussisk oskärpa . Genom den centrala gränssatsen kommer upprepad applicering av en boxoskärpa att approximera en Gaussoskärpa.
I frekvensdomänen har en boxoskärpa nollor och negativa komponenter. Det vill säga, en sinusvåg med en period som är lika med rutans storlek kommer att suddas ut helt och hållet, och våglängder som är kortare än rutans storlek kan fasomvändas, vilket kan ses när två bokeh-cirklar berörs för att bilda en ljus punkt där det skulle finnas en mörk fläck mellan två ljusa fläckar i originalbilden.
Tillägg
- Gwosdek, et al. har utökat Box oskärpa för att ta en bråkdel radie: kanterna på 1-D-filtret expanderas med en bråkdel. Det gör något bättre gaussisk approximation möjlig på grund av elimineringen av heltalsavrundningsfel.
- Mario Klingemann har en "stack-oskärpa" som försöker efterlikna Gaussians utseende bättre i ett steg genom att stapla vikter: Det triangulära impulssvaret som det bildar sönderfaller till två omgångar av boxoskärpa.
- Stacked Integral Image av Bhatia et al. tar det viktade medelvärdet av några rutasuddar för att passa den gaussiska svarskurvan.
Genomförande
Följande pseudokod implementerar en 3x3 boxoskärpa.
Box blur (image) { set newImage to image; För x /*rad*/, y/*kolumn*/ på newImage gör: { // Kernel would not fit! Om x < 1 eller y < 1 eller x + 1 == bredd eller y + 1 == höjd då: Fortsätt; // Ställ in P till medelvärdet av 9 pixlar: XXX XPX XXX // Beräkna medelvärde. Summa = bild[x - 1, y + 1] + // Bild överst till vänster [x + 0, y + 1] + // Bild överst i mitten[ x + 1, y + 1] + // Bild överst till höger [x - 1, y + 0] + // Mitt vänster bild[x + 0, y + 0] + // Aktuell pixelbild [x + 1, y + 0] + // Mitt höger bild[x - 1, y - 1] + // Låg vänster bild[x + 0, y - 1] + // Låg mittbild [x + 1, y - 1]; // Low right newImage[x, y] = Summa / 9; } Returnera nybild; }
Exemplet hanterar inte kanterna på bilden, som inte skulle passa inuti kärnan, så att dessa områden förblir oskarpa. I praktiken hanteras frågan bättre av:
- Introduktion av en alfakanal för att representera frånvaron av färger;
- Utvidga gränsen genom att fylla i värden, rangordnade efter kvalitet:
- Fyll i en spegelbild vid kanten
- Fyll i en konstant färg som sträcker sig från den sista pixeln
- Pad i fast färg
Ett antal optimeringar kan tillämpas när du implementerar boxoskärpan med en radie r och N pixlar:
- Boxoskärpan är ett separerbart filter , så att endast två 1D-passningar på i genomsnitt 2 r + 1 pixlar behövs, en horisontell och en vertikal, för varje pixel. Detta sänker komplexiteten från O( Nr 2 ) till O( Nr ) . I digital signalbehandlingsterminologi är varje pass ett filter för glidande medelvärde .
- Ackumulation. Istället för att förkasta summan för varje pixel, återanvänder algoritmen den tidigare summan och uppdaterar den genom att subtrahera bort den gamla pixeln och lägga till den nya pixeln i oskärpa. En summerad areatabell kan användas på liknande sätt. Detta sänker komplexiteten från O( Nr ) till O( N ) .
- När den används i flera omgångar för att approximera en Gaussisk oskärpa, tillåter den kaskadformade integrator-kamfilterkonstruktionen att utföra motsvarande operation i en enda passage.
Se även