5.15. Morfologische bewerkingen¶
Morfologische bewerkingen werken op binaire afbeeldingen – de maskers die voortkomen uit drempelwaarde-bepaling en randdetectie. Elke bewerking doorloopt hetzelfde soort schuivende omgeving als de gladstrijkfilters gebruiken, maar de vraag die deze op elke positie stelt is ja/nee: staat elke pixel in de omgeving aan, staat een pixel in de omgeving aan, hoe ziet het aan/uit-patroon eruit? De antwoorden laten regio’s groeien, krimpen ze, en hersnijden hun grenzen op manieren die een gemiddeldefilter niet kan.
Morfologie is wat tussen een initieel binair masker komt – de uitvoer van drempelwaarde-bepaling, randdetectie of een andere classificator – en het schone binaire masker dat de rest van de pipeline kan gebruiken. Een ruwe drempeluitvoer heeft meestal geïsoleerde ruispixels verspreid door echte voorgrondgebieden, kleine gaten geponst in verder massieve regio’s, en gekartelde grenzen waar de drempel dicht langs de rand van een object sneed. Morfologie verwijdert die defecten.
5.15.1. De vier klassieke bewerkingen¶
Twee primitieve bewerkingen, en twee samenstellingen daarvan, vormen de morfologische gereedschapskist:
dilate() laat elke voorgrondregio groeien. De regel is: elke pixel die ten minste één voorgrondbuur in zijn (2 * size + 1)-venster heeft, wordt voorgrond. Het zichtbare effect is dat voorgrondregio’s met size pixels in elke richting groter worden, en dat gaten erbinnen met dezelfde hoeveelheid krimpen (of verdwijnen).
erode() doet het omgekeerde. Elke pixel die niet elke buur in zijn venster in de voorgrond heeft, wordt achtergrond. Voorgrondregio’s worden met size pixels in elke richting kleiner, geïsoleerde voorgrondpixels (die geen voorgrondburen hebben) verdwijnen volledig, en kleine verbindingen tussen grotere regio’s worden doorgesneden.
De vier klassieke morfologische bewerkingen toegepast op een ruisachtige binaire regio. Erode krimpt; dilate laat groeien; open is erode gevolgd door dilate (verwijdert ruis); close is dilate gevolgd door erode (vult gaten).¶
open() is erode gevolgd door dilate. Uit de geërodeerde afbeelding is elke geïsoleerde ruispixel verwijderd, maar deze is ook met size pixels in elke richting gekrompen. Door de erode te laten volgen door een dilate van dezelfde grootte worden de echte voorgrondregio’s hersteld tot ongeveer hun oorspronkelijke grenzen, terwijl de ruis verdwenen blijft. De samenstelling is wat open tot de standaardbewerking voor “ruis verwijderen” in de klassieke morfologie maakt: geïsoleerde voorgrondpixels verdwijnen, echte regio’s komen ongeschonden terug.
close() is het spiegelbeeld – dilate gevolgd door erode. De dilate vult kleine gaten binnen voorgrondregio’s en verbindt regio’s die door kleine openingen gescheiden zijn; de erode krimpt het resultaat terug naar zijn oorspronkelijke buitengrens terwijl de opgevulde binnenkant massief blijft. close is de standaardbewerking voor “kleine openingen vullen”.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
De parameter size heeft dezelfde betekenis als in de helderheidsfilters: size=1 betekent een omgeving van 3 bij 3, size=2 betekent 5 bij 5, enzovoort. Grotere afmetingen betekenen agressievere opschoning – en een langere kostprijs per pixel.
5.15.2. Top-hat en black-hat¶
Twee verdere samenstellingen zijn het kennen waard omdat ze precies de kenmerken extraheren die open en close verwijderen:
top_hat() retourneert het verschil tussen de oorspronkelijke afbeelding en de geopende versie ervan – de voorgrondpixels die open zou hebben verwijderd. Dat is letterlijk een masker van de ruispixels, de geïsoleerde kleine voorgrondregio’s, de dunne voorgrondstructuren die de open-bewerking niet kon behouden. Nuttig voor het extraheren van kleine voorgrondkenmerken wanneer die kenmerken zijn waar de toepassing om geeft, in plaats van ze te verwijderen.
black_hat() retourneert het verschil tussen de gesloten versie van de afbeelding en het origineel – de achtergrondpixels die close zou hebben opgevuld. Dat is een masker van de kleine gaten binnen voorgrondregio’s, de smalle openingen tussen regio’s die de close-bewerking zou hebben overbrugd.
Beide worden minder vaak gebruikt dan de vier basisbewerkingen, maar het patroon is het onthouden waard – wanneer een toepassing kleine of dunne kenmerken moet extraheren die de standaard opschoonstap verwijdert, zijn de top-hat en black-hat de natuurlijke manier om ze terug te krijgen.
5.15.3. Drempelwaardemodus¶
De vier basismorfologische bewerkingen accepteren allemaal een geheel getal als threshold-trefwoord dat de aan/uit-test op elke positie verzacht. Zonder dit gedragen de bewerkingen zich zoals de bovenstaande beschrijvingen aangaven: erode() vereist dat elke buur aanstaat, dilate() vereist ten minste één. Met threshold ingesteld tolereert elke bewerking dat zoveel buren de andere kant op stemmen. Voor erode is threshold het aantal achtergrondburen dat een pixel mag hebben en toch overleeft: threshold=4 houdt elke pixel met ten minste vier van zijn acht buren aan (in een venster van 3 bij 3 heeft de centrumpixel acht buren), zodat deze minder agressief erodeert. Voor dilate is threshold het aantal voorgrondburen dat een achtergrondpixel meer moet hebben voordat deze aangaat: threshold=2 vereist ten minste drie voorgrondburen in plaats van één, zodat deze minder agressief groeit.
De drempelvorm is nuttig om de agressiviteit van een morfologische stap af te stemmen zonder de grootte van het venster te wijzigen, wat ook de schaal zou veranderen van de kenmerken waarop deze inwerkt. De meeste toepassingen houden zich aan het standaardgedrag; de drempelvorm is er voor de gevallen waarin de standaard net iets te veel of te weinig is.