5.15. Morfologiska operationer¶
Morfologiska operationer arbetar på binära bilder – maskerna som kommer ut ur tröskling och kantdetektering. Varje operation går igenom samma sorts glidande grannskap som utjämningsfiltren använder, men frågan den ställer vid varje position är ja/nej: är varje pixel i grannskapet på, är någon pixel i grannskapet på, hur ser på/av-mönstret ut? Svaren får områden att växa, krymper dem och skär om deras gränser på sätt som ett medelvärdesfilter inte kan.
Morfologi är det som kommer mellan en ursprunglig binär mask – utdatan från tröskling, kantdetektering eller någon annan klassificerare – och den rena binära mask som resten av pipelinen kan använda. En rå tröskelutdata har vanligtvis isolerade bruspixlar utspridda genom verkliga förgrundsområden, små hål instansade i annars solida områden, och taggiga gränser där tröskeln skar nära ett objekts kant. Morfologi tar bort dessa defekter.
5.15.1. De fyra klassiska operationerna¶
Två primitiva operationer, och två sammansättningar av dem, utgör den morfologiska verktygslådan:
dilate() får varje förgrundsområde att växa. Regeln är: vilken pixel som helst som har minst en förgrundsgranne i sitt (2 * size + 1)-fönster blir förgrund. Den synliga effekten är att förgrundsområden blir större med size pixlar i alla riktningar, och hål inuti dem krymper (eller försvinner) med samma mängd.
erode() gör det omvända. Vilken pixel som helst som inte har varje granne i sitt fönster i förgrunden blir bakgrund. Förgrundsområden blir mindre med size pixlar i alla riktningar, isolerade förgrundspixlar (som inte har några förgrundsgrannar) försvinner helt, och små förbindelser mellan större områden skärs av.
De fyra klassiska morfologiska operationerna tillämpade på ett brusigt binärt område. Erode krymper; dilate växer; open är erode följt av dilate (tar bort brus); close är dilate följt av erode (fyller hål).¶
open() är erode följt av dilate. Den eroderade bilden har fått varje isolerad bruspixel borttagen, men den har också krympts med size pixlar i alla riktningar. Att följa erode med en dilate av samma storlek återställer de genuina förgrundsområdena till ungefär deras ursprungliga gränser samtidigt som bruset förblir borta. Sammansättningen är vad som gör open till standardoperationen för att ”ta bort brus” inom klassisk morfologi: isolerade förgrundspixlar försvinner, verkliga områden kommer tillbaka oskadda.
close() är spegelbilden – dilate följt av erode. Dilate fyller små hål inuti förgrundsområden och förbinder områden som skiljs åt av små mellanrum; erode krymper resultatet tillbaka till dess ursprungliga yttre gräns samtidigt som det utfyllda inre förblir solitt. close är standardoperationen för att ”fylla små mellanrum”.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
size-parametern har samma betydelse som i ljusstyrkefiltren: size=1 betyder ett 3-gånger-3-grannskap, size=2 betyder 5-gånger-5, och så vidare. Större storlekar innebär mer aggressiv uppstädning – och en längre kostnad per pixel.
5.15.2. Top-hat och black-hat¶
Två ytterligare sammansättningar är värda att känna till eftersom de extraherar exakt de särdrag som open och close tar bort:
top_hat() returnerar skillnaden mellan originalbilden och dess öppnade version – förgrundspixlarna som open skulle ha tagit bort. Det är bokstavligen en mask av bruspixlarna, de isolerade små förgrundsområdena, de tunna förgrundsstrukturerna som open-operationen inte kunde bevara. Användbart för att extrahera små förgrundssärdrag när dessa särdrag är det tillämpningen bryr sig om, snarare än att ta bort dem.
black_hat() returnerar skillnaden mellan den stängda versionen av bilden och originalet – bakgrundspixlarna som close skulle ha fyllt i. Det är en mask av de små hålen inuti förgrundsområden, de smala mellanrummen mellan områden som close-operationen skulle ha överbryggat.
Båda tas till mer sällan än de fyra grundläggande operationerna, men mönstret är värt att komma ihåg – när en tillämpning behöver extrahera små eller tunna särdrag som standarduppstädningen tar bort, är top-hat och black-hat det naturliga sättet att få tillbaka dem.
5.15.3. Trösklingsläge¶
De fyra grundläggande morfologiska operationerna accepterar alla ett heltals-threshold-nyckelord som mjukar upp på/av-testet vid varje position. Utan det beter sig operationerna som beskrivningarna ovan angav: erode() kräver att varje granne är på, dilate() kräver minst en. Med threshold satt tolererar varje operation så många grannar som röstar åt andra hållet. För erode är threshold antalet bakgrundsgrannar en pixel får ha och ändå överleva: threshold=4 behåller varje pixel med minst fyra av sina åtta grannar på (i ett 3-gånger-3-fönster har mittpixeln åtta grannar), så den eroderar inte lika aggressivt. För dilate är threshold antalet förgrundsgrannar en bakgrundspixel måste ha fler av innan den slås på: threshold=2 kräver minst tre förgrundsgrannar i stället för en, så den växer mindre aggressivt.
Tröskelformen är användbar för att finjustera hur aggressiv en morfologisk omgång är utan att ändra fönstrets storlek, vilket också skulle ändra skalan på de särdrag den verkar på. De flesta tillämpningar håller sig till standardbeteendet; tröskelformen finns där för de fall där standardvärdet är precis lite för mycket eller för lite.