5.15. Morfologické operace¶
Morfologické operace pracují na binárních obrazech – maskách, které vycházejí z prahování a detekce hran. Každá operace prochází stejným druhem klouzajícího okolí, jaké používají vyhlazovací filtry, ale otázka, kterou na každé pozici klade, je ano/ne: je každý pixel v okolí zapnutý, je nějaký pixel v okolí zapnutý, jak vypadá vzor zapnuto/vypnuto? Odpovědi rozšiřují oblasti, zmenšují je a překrajují jejich hranice způsoby, které průměrovací filtr nedokáže.
Morfologie je to, co stojí mezi počáteční binární maskou – výstupem prahování, detekce hran nebo jiného klasifikátoru – a čistou binární maskou, kterou může použít zbytek řetězce. Surový výstup prahu má obvykle izolované pixely šumu rozeseté skrz skutečné oblasti popředí, malé díry vyražené do jinak souvislých oblastí a roztřepené hranice tam, kde práh řízl blízko hrany objektu. Morfologie tyto vady odstraňuje.
5.15.1. Čtyři klasické operace¶
Morfologickou sadu nástrojů tvoří dvě primitivní operace a dvě jejich kompozice:
dilate() rozšiřuje každou oblast popředí. Pravidlo zní: každý pixel, který má ve svém okně (2 * size + 1) alespoň jednoho souseda v popředí, se stane popředím. Viditelným efektem je, že oblasti popředí se zvětší o size pixelů v každém směru a díry uvnitř nich se o stejnou míru zmenší (nebo zmizí).
erode() dělá opak. Každý pixel, který nemá každého souseda ve svém okně v popředí, se stane pozadím. Oblasti popředí se zmenší o size pixelů v každém směru, izolované pixely popředí (které nemají žádné sousedy v popředí) zcela zmizí a malá spojení mezi většími oblastmi se přeruší.
Čtyři klasické morfologické operace aplikované na zašuměnou binární oblast. Erode zmenšuje; dilate rozšiřuje; open je erode a poté dilate (odstraňuje šum); close je dilate a poté erode (vyplňuje díry).¶
open() je erode následované dilate. Erodovaný obraz má odstraněn každý izolovaný pixel šumu, ale byl také zmenšen o size pixelů v každém směru. Následování erode operací dilate stejné velikosti obnoví skutečné oblasti popředí přibližně na jejich původní hranice, přičemž šum zůstane pryč. Tato kompozice je tím, co dělá z open standardní operaci „odstraň šum“ v klasické morfologii: izolované pixely popředí zmizí, skutečné oblasti se vrátí nepoškozené.
close() je zrcadlový obraz – dilate následované erode. Dilate vyplňuje malé díry uvnitř oblastí popředí a propojuje oblasti oddělené malými mezerami; erode zmenší výsledek zpět na jeho původní vnější hranici, přičemž vyplněný vnitřek zůstane souvislý. close je standardní operace „vyplň malé mezery“.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
Parametr size má stejný význam jako u jasových filtrů: size=1 znamená okolí 3 na 3, size=2 znamená 5 na 5 a tak dále. Větší velikosti znamenají agresivnější čištění – a delší náklady na pixel.
5.15.2. Top-hat a black-hat¶
Dvě další kompozice stojí za to znát, protože extrahují přesně ty příznaky, které open a close odstraňují:
top_hat() vrací rozdíl mezi původním obrazem a jeho otevřenou verzí – pixely popředí, které by open odstranil. To je doslova maska pixelů šumu, izolovaných malých oblastí popředí, tenkých struktur popředí, které operace open nedokázala zachovat. Užitečné pro extrakci malých příznaků popředí, když jsou tyto příznaky tím, na čem aplikaci záleží, spíše než pro jejich odstranění.
black_hat() vrací rozdíl mezi uzavřenou verzí obrazu a originálem – pixely pozadí, které by close vyplnil. To je maska malých děr uvnitř oblastí popředí, úzkých mezer mezi oblastmi, které by operace close přemostila.
Po obou se sahá méně často než po čtyřech základních operacích, ale tento vzor stojí za zapamatování – když aplikace potřebuje extrahovat malé nebo tenké příznaky, které standardní čisticí průchod odstraňuje, top-hat a black-hat jsou přirozeným způsobem, jak je získat zpět.
5.15.3. Režim prahování¶
Čtyři základní morfologické operace všechny přijímají celočíselné klíčové slovo threshold, které změkčuje test zapnuto/vypnuto na každé pozici. Bez něj se operace chovají tak, jak uvedly popisy výše: erode() vyžaduje, aby byl zapnutý každý soused, dilate() vyžaduje alespoň jednoho. S nastaveným threshold každá operace toleruje, že tolik sousedů hlasuje opačně. U erode je threshold počet sousedů v pozadí, které pixel může mít a přesto přežít: threshold=4 zachová každý pixel s alespoň čtyřmi z jeho osmi sousedů zapnutými (v okně 3 na 3 má středový pixel osm sousedů), takže neeroduje tak agresivně. U dilate je threshold počet sousedů v popředí, kterých musí mít pixel pozadí více, než se zapne: threshold=2 vyžaduje alespoň tři sousedy v popředí místo jednoho, takže roste méně agresivně.
Prahová forma je užitečná pro ladění agresivity morfologického průchodu beze změny velikosti jeho okna, která by také změnila měřítko příznaků, na které působí. Většina aplikací se drží výchozího chování; prahová forma je tu pro případy, kdy je výchozí nastavení jen o trochu příliš velké nebo příliš malé.