Analisi delle Regioni

Questo esercizio verte sulle funzioni bwlabel e soprattutto sulla funzione regionprops . La seconda chiama internamente bwlabel ed estrae informazioni dalle regioni selezionate in un'immagine binaria (cioè le regioni marcate con un 1)

La prima funzione individua regioni di pixel adiacenti posti ad uno e le marca con un indice progressivo. La seconda è in grado di calcolare varie proprietà di queste regioni e ritorna un array di strutture, entità composite che possono avere più campi aventi rappresentazioni diverse, ma che insieme costituiscono la descrizione di un entità (oggetto). La pagina di manuale di regionprops elenca i parametri ammessi nelle opzioni e il loro significato.

Nell'esercizio seguente viene usata l'immagine binaria derivata dall'immagine dei grani di riso, calcolata con il metodo della massima entropia. Questa appare la migliore approssimazione del risultato desiderato, eccetto che per alcuni grani in basso non ben identificati. Il numero di queste cattive identificazioni non è considerevole rispetto ai grani ben delineati e potrebbero quindi essere considerate nell'errore statistico.

Peggiore la performance nella parte medio alta, dove un gran numero di regioni spurie vengono marcate. Nell'esercizio si usa l'area delle regioni come criterio discriminante per selezionare solo quelle che presumibilmente appartengono agli oggetti che vogliamo identificare

%
% -- aree.m
%
% uso della funzione regionprops che calcola
% le proprietà delle regioni marcate in una immagine
% binaria
%

img = imread('grani-riso.png');

% L'immagine dovrebbe essere NxMx3, quindi in RGB

size(img)

% La convertiamo in una immagine a scala di grigi

img = rgb2gray(img);

% partiamo dall'immagine binaria calcolata con il metodo
% della massima entropia (con Octave) oppure dopo aver 
% determinato la soglia con il metodo iterativo (sia con
% Matlab che con Octave)
%

max_entropy = graythresh(img,'MaxEntropy');
bwimg = im2bw(img,max_entropy);

% la funzione bwlabel ritorna una nuova matrice dove
% le regioni di bwimg sono numerate con un indice progressivo.
% Le proprietà di queste regioni sono determinate
% dalla funzione regionprops. Provate a digitare
% il nome della variabile 'bwarea' per vedere com'è
% strutturata

bwarea = bwlabel(bwimg);

% dovrebbero essere riconoscibili nella matrice le regioni
% dei grani di riso raffigurati nell'immine originaria

% il comando regionprops calcola le proprietà delle
% regioni di un'immagine binaria, un immagine quindi
% dove il 'foreground' di un'immagine elaborata è 
% marcato con un 1 e il background con 0

propert = regionprops(bwimg);

% osserviamo la dimensione e la classe dell'array area

size(propert)
class(propert)

% area è un array di strutture, ciascuna delle quali
% è un descrittore di una delle regioni individuate
% nella matrice binaria. I campi di questa struttura
% possono essere letti digitando 

propert(1)

% i campi presenti dovrebbero essere
%
% - Area: superficie in pixel della regione etichettata con 1
% - BoundingBox: coordinate rettangolo che contiene la regione
% - Centroid: stima del centro della regione
%
% Le aree delle regioni possono essere raccolte in un unico array
% con la notazione

aree = [propert.Area];

% L'istogramma della distribuzione delle aree può essere tracciato
% con il comando 'hist'

if (exist('OCTAVE_VERSION', 'builtin') ~= 0)
	hist(aree,100);
else
	histogram(aree,100);
end

% i valori possono essere estratti nelle variabili counts e vals
% nello stesso modo dell'istogramma delle immagini

[counts,vals]=hist(aree,100);

% l'istogramma mostra un forte sbilaciamento verso i valori
% molto piccoli, che sono quelle micro regioni disperse
% soprattutto nella parte alta dell'immagine. Proviamo ad eliminarle
% e ricostruire l'immagine binaria con le sole regioni che
% soddisfano la condizione sull'area. 

% Per esempio gli indici alle regioni che hanno area > 10
% sono

grains=find(aree > 50);

reconstr=zeros(size(bwimg));

for g=grains 

    reconstr = or(reconstr,bwarea == g);

end

% confrontate l'immagine binaria originaria e quella ricostruita.
% Se la selezione appare soddisfacente questi possono essere gli indici
% alle regioni da considerare per conteggi o altre estrazioni di dati

subplot(1,2,1)
imshow(bwimg)
subplot(1,2,2)
imshow(reconstr)

% -- aree.m