Trasformazioni Morfologiche
Il risultato della selezioni dei grani di riso nell'immagine
può essere migliorato attraverso le trasformazioni morfologiche.
Con le trasformazioni morfologiche si modificano regioni di
un immagine attraverso elementi strutturanti
, matrici
binarie che guidano l'operazione di trasformazione
Una delle applicazioni principali di queste trasformazioni
è l'eliminazione di piccole caratteristiche spurie presenti in
un'immagine binaria attraverso un processo chiamato erosione
(shrinking), seguito da un processo complementare chiamato
dilatazione
(growing)
L'elemento strutturante è un fattore critico per determinare gli effetti
dell'operazione
e la logica della sua applicazione è del tutto analoga a quella
dei filtri lineari. Infatti l'elemento strutturante ha un
hot-spot
che è il punto di riferimento della matrice. La
sua applicazione avviene tramite l'operazione booleana di AND
tra i risultati di tutte le moltiplicazioni tra gli elementi della matrice
dell'elemento strutturante e l'immagine binaria. Il risultato di ciascuna
di queste operazioni è il valore del pixel dell'immagine binaria
risultante nella stessa posizione dell'hot-spot, analogamente a quanto
avviene per i filtri lineari.
% prendiamo una matrice 4x4 binaria come immagine di prova % lo scopo di questo test è quello di constatare il funzionamento di base % dell'operazione di 'erosione' mat=[0 0 0 0; 0 1 1 0; 0 0 1 0; 0 0 0 0] mat = 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 % definiamo questo elemento strutturante (l'hot spot è l'elemento centrale) stel=[0 1 1] stel = 0 1 1 % l'operazione di erosione elimina i pixel che non sono conformi % alla maschera dell'elemento strutturante eroded=imerode(mat,stel) eroded = 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Cambiate la matrice e/o l'elemento strutturante, chiamate ancora
imerode
e decifrate la logica con qui viene trasformata
la matrice
Dilatazione
Il processo complementare è la dilatazione . La dilatazione aggiunge nuovi pixel all'imagine binaria. Quando l'hot spot dell'elemento strutturante si sovrappone ad un pixel acceso (valore 1) allora tutti i pixel corrispondenti agli 1 della sua matrice vengono anch'essi posti ad 1
% procediamo con l'operazione di dilatazione sull'immagine appena erosa tramite l'elemento % strutturante contenuto nell'array 'stel' imdilate(eroded,stel) ans = 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
Il risultato è che la seconda linea viene ripristinata, esistendo un pixel acceso, mentre la terza linea, essendo stata azzerata, rimane tale e il dettaglio contenuto in essa viene perso nella nuova immagine. Questo, in termini assai elementari, il meccanismo di funzionamento del processo di eliminazione di dettagli di oggetti individuati in un'immagine binaria. Tranne che per casi particolari è improbabile che un'operazione (o più operazioni in successione) di erosione seguita da un'operazione di dilatazione (o più dilatazioni) ottenga esattamente l'oggetto originario privato delle parti non desiderate, ma se l'elemento strutturante è ben scelto il risultato può essere ottenuto nella sostanza.
La funzione
imopen
del package Image di
Octave
esegue l'operazione di erosione seguita da quella di dilatazione. La funzione
ammette come elemento strutturante sia una matrice binaria che un oggetto specifico
creato dalla funzione
strel
che contiene sia la matrice che altre informazioni. Un oggetto creato da strel
è necessario per applicare la funzione imopen
ad immagini non binarie.
reconstr
calcolata nell'esempio del
thresholding
. Questa immagine
mostrava con chiarezza le regioni corrispondenti ai grani di riso, ma c'erano vari
difetti legati a dettagli spuri. L'operazione di "opening" può in parte migliorare le cose
% creiamo un elemento strutturante a forma di disco con raggio 3, quindi isotropo % (a differenza dell'esempio precedente agisce cioè in modo identico in ogni % direzione) disk=strel('disk',3) disk = Flat STREL object with 29 neighbors Neighborhood: 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 % procediamo a mostrare direttamente l'output della funzione 'imopen' % usando l'elemento strutturante appena creato imshow(imopen(reconstr , disk))