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.

Creiamo una matrice come elemento strutturante e osserviamo il suo effetto su una matrice binaria di prova.
% 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.

Riprendete la matrice 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))
Provate a cambiare la dimensione dell'elemento strutturante e/o cambiare la sua forma. (La pagina di manuale di strel elenca le forme che possono essere generate)