5.15. Operații morfologice¶
Operațiile morfologice lucrează pe imagini binare – măștile care rezultă din prag și din detectarea muchiilor. Fiecare operație parcurge același tip de vecinătate alunecătoare pe care o folosesc filtrele de netezire, dar întrebarea pe care o pune la fiecare poziție este da/nu: este fiecare pixel din vecinătate activ, este vreun pixel din vecinătate activ, cum arată tiparul activat/dezactivat? Răspunsurile măresc regiunile, le micșorează și le retaie limitele în moduri în care un filtru de mediere nu poate.
Morfologia este ceea ce vine între o mască binară inițială – rezultatul prelucrării prin prag, al detectării muchiilor sau al altui clasificator – și masca binară curată pe care o poate folosi restul fluxului de prelucrare. O ieșire brută a unui prag are de obicei pixeli izolați de zgomot împrăștiați prin zonele de prim-plan adevărat, mici găuri perforate în regiuni altfel compacte și limite zimțate acolo unde pragul a tăiat aproape de muchia unui obiect. Morfologia elimină aceste defecte.
5.15.1. Cele patru operații clasice¶
Două operații primitive și două compoziții ale lor alcătuiesc trusa de instrumente morfologice:
dilate() mărește fiecare regiune de prim-plan. Regula este: orice pixel care are cel puțin un vecin de prim-plan în fereastra sa (2 * size + 1) devine prim-plan. Efectul vizibil este că regiunile de prim-plan se măresc cu size pixeli în fiecare direcție, iar găurile din interiorul lor se micșorează (sau dispar) cu aceeași cantitate.
erode() face inversul. Orice pixel care nu are fiecare vecin din fereastra sa în prim-plan devine fundal. Regiunile de prim-plan se micșorează cu size pixeli în fiecare direcție, pixelii de prim-plan izolați (care nu au vecini de prim-plan) dispar complet, iar conexiunile mici dintre regiuni mai mari sunt tăiate.
Cele patru operații morfologice clasice aplicate unei regiuni binare cu zgomot. Erode micșorează; dilate mărește; open este erode urmat de dilate (elimină zgomotul); close este dilate urmat de erode (umple găurile).¶
open() este erode urmat de dilate. Imaginea erodată a avut fiecare pixel de zgomot izolat eliminat, dar a fost și micșorată cu size pixeli în fiecare direcție. Urmărirea operației erode cu un dilate de aceeași dimensiune readuce regiunile de prim-plan autentice aproximativ la limitele lor originale, lăsând zgomotul eliminat. Compoziția este cea care face din open operația standard de „eliminare a zgomotului” din morfologia clasică: pixelii de prim-plan izolați dispar, iar regiunile reale revin nevătămate.
close() este imaginea în oglindă – dilate urmat de erode. Operația dilate umple găurile mici din interiorul regiunilor de prim-plan și conectează regiunile separate de spații mici; operația erode micșorează rezultatul înapoi la limita sa exterioară originală, lăsând interiorul umplut compact. close este operația standard de „umplere a spațiilor mici”.
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
Parametrul size are aceeași semnificație ca în filtrele de luminozitate: size=1 înseamnă o vecinătate de 3 pe 3, size=2 înseamnă 5 pe 5 și așa mai departe. Dimensiunile mai mari înseamnă o curățare mai agresivă – și un cost mai mare per pixel.
5.15.2. Top-hat și black-hat¶
Mai merită cunoscute încă două compoziții, deoarece ele extrag exact caracteristicile pe care open și close le elimină:
top_hat() returnează diferența dintre imaginea originală și versiunea ei deschisă – pixelii de prim-plan pe care open i-ar fi eliminat. Aceasta este literalmente o mască a pixelilor de zgomot, a regiunilor mici izolate de prim-plan, a structurilor subțiri de prim-plan pe care operația open nu le-a putut păstra. Utilă pentru extragerea caracteristicilor mici de prim-plan atunci când aceste caracteristici sunt ceea ce contează pentru aplicație, mai degrabă decât pentru eliminarea lor.
black_hat() returnează diferența dintre versiunea închisă a imaginii și original – pixelii de fundal pe care close i-ar fi umplut. Aceasta este o mască a găurilor mici din interiorul regiunilor de prim-plan, a spațiilor înguste dintre regiuni pe care operația close le-ar fi punte.
Ambele sunt mai rar folosite decât cele patru operații de bază, dar tiparul merită reținut – când o aplicație are nevoie să extragă caracteristici mici sau subțiri pe care trecerea standard de curățare le elimină, top-hat și black-hat sunt modalitatea naturală de a le recupera.
5.15.3. Modul de prag¶
Cele patru operații morfologice de bază acceptă toate un cuvânt-cheie threshold întreg care relaxează testul activat/dezactivat la fiecare poziție. Fără el, operațiile se comportă așa cum spuneau descrierile de mai sus: erode() cere ca fiecare vecin să fie activ, dilate() cere cel puțin unul. Cu threshold setat, fiecare operație tolerează ca atâția vecini să voteze în sens contrar. Pentru erode, threshold este numărul de vecini de fundal pe care un pixel îi poate avea și totuși să supraviețuiască: threshold=4 păstrează orice pixel cu cel puțin patru dintre cei opt vecini ai săi activi (într-o fereastră de 3 pe 3 pixelul central are opt vecini), așa că nu erodează la fel de agresiv. Pentru dilate, threshold este numărul de vecini de prim-plan pe care un pixel de fundal trebuie să-i aibă în plus înainte de a se activa: threshold=2 cere cel puțin trei vecini de prim-plan în loc de unul, așa că se mărește mai puțin agresiv.
Forma cu prag este utilă pentru reglarea agresivității unei treceri morfologice fără a schimba dimensiunea ferestrei sale, ceea ce ar schimba și scara caracteristicilor asupra cărora acționează. Majoritatea aplicațiilor rămân la comportamentul implicit; forma cu prag există pentru cazurile în care valoarea implicită este doar puțin prea mare sau prea mică.