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