Ho un'immagine RGB con vari segni. Il mio obiettivo principale è contare i segni che sono in contatto con i bordi dell'immagine.
Approccio e problema
Ho iniziato caricando l'immagine [Fig. 1], quindi convertito in scala di grigi e applicato un filtro mediano per eliminare alcuni rumori [Fig. 2]. Quindi l'ho binarizzato con una soglia di 0,2, che ha portato alla Figura 3. In questo momento ho ottenuto la mia immagine binarizzata, ma il problema è che alcune parti che appartengono allo stesso segno stanno comparendo in varie regioni, anziché solo una. Ora il mio obiettivo è quello di unire le regioni che appartengono allo stesso oggetto, quindi quindi potrei usare bwlabel
per contare quanti segni ci sono nell'immagine, e usare imclearborder
per sbarazzarmi di quelli nel bordo, e usare di bwlabel
nuovo per ottenere la differenza tra il due.
Il mio approccio è stato quello di utilizzare bwmorph
, Dilate
per dilatare gli oggetti e quindi provare a riempirli imfill
, holes
. Ma il problema è che se li dilatassi in una piccola quantità [Fig. 4], il imfill
non sembra riempirli, se li dilatassi di una grande quantità [Fig 5] tutti gli oggetti iniziano a fondersi :(
Codice
img=im2double(imread('image.png')); figure, imshow(img)
img_gray=rgb2gray(img); imshow(img_gray);
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)
figure
Fig 1 :
Fig 1 http://dl.dropbox.com/u/5272012/1.png
Fig 2 :
fig 2 http://dl.dropbox.com/u/5272012/2.png
Fig 3 :
fig 3 http://dl.dropbox.com/u/5272012/3.png
Fig 4 :
fig 4 http://dl.dropbox.com/u/5272012/4.png
Fig 5 :