Contando il numero di oggetti intersecati dal bordo dell'immagine in MATLAB


9

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 bwlabelper contare quanti segni ci sono nell'immagine, e usare imclearborderper sbarazzarmi di quelli nel bordo, e usare di bwlabelnuovo per ottenere la differenza tra il due.

Il mio approccio è stato quello di utilizzare bwmorph, Dilateper dilatare gli oggetti e quindi provare a riempirli imfill, holes. Ma il problema è che se li dilatassi in una piccola quantità [Fig. 4], il imfillnon 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 :

fig 5 http://dl.dropbox.com/u/5272012/5.png


La mia domanda è cosa ti dice esattamente che quel segno è rotto? Come vuoi davvero mettere l'output? Voglio dire, vuoi solo colorare tutti i segni che sono tagliati? o vuoi davvero elencare ogni segno e classificare il taglio / pieno?
Dipan Mehta,

Risposte:


3

A mio avviso, l'erosione da dilatazione è uno strumento fondamentale. Hai una base di informazioni molto solida e un'immagine di input abbastanza decente per prendere tali decisioni.

Ecco il mio punto di vista:

  1. Dato un successo ragionevole che hai dimostrato di passare dalla Figura 1 alla 3, puoi identificare e segmentare i singoli segni.

  2. Supponendo di avere già conosciuto segni prima, è possibile applicare algoritmi veloci decenti per eseguire la corrispondenza dei modelli. Nel caso in cui non siano noti i motivi esatti, puoi semplicemente identificare la forma esterna del motivo.

  3. In base alla classificazione, è sempre possibile definire il centroide di ciascun modello abbinato e la rispettiva larghezza e altezza. Se il centroide X, la posizione Y è troppo vicina al bordo - ovvero o è esterna al bordo, allo stesso modo è possibile applicare anche per l'asse Y.centroid(x)<0centroid(x)>imagewidthshapewidth

  4. Dato che ti preoccupi solo di ciò che cade sul bordo - dovresti iniziare solo con ogni bordo e iniziare la corrispondenza del modello lì. Inizia corrisponde al modello / forma parziale e se il modello / forma parziale corriponda quell'oggetto IS viene tagliato sul bordo.

Ecco alcuni riferimenti che potrebbero aiutarti a formulare bene il problema.

Questo documento è molto utile per comprendere molte nozioni di base sui segni / token con cui hai a che fare.

Anil K. Jain e Aditya Vailaya Recupero basato sulla forma: un caso di studio con database di immagini di marchi Riconoscimento di modelli 1998, vol. 31, n. 9, pagg. 1369-1390

Ci sono molti elementi di ricerca che si occupano della corrispondenza parziale / occulta di forme / motivi.

Eli Sabre, Yaowu Xu, A. Murat Tekalp Riconoscimento parziale della forma mediante corrispondenza della sotto-matrice per la corrispondenza parziale etichettata immagine guidata Pattern Recognition 38 (2005) 1560-1573

Espanderà questa risposta per domande più specifiche se segui questo approccio.


Hey! Non riesco a usare la corrispondenza dei modelli perché ci vorrà molto tempo e troppo lavoro computazionale. Anche la scala degli oggetti (segni) può essere variabile (il professore ci fornisce immagini casuali in cui la scala dei segni può andare da + 30% a -30%, quindi una corrispondenza del modello è inutile. Ho bisogno di un approccio più veloce in per risolverlo.
Rui Trovisco,

@RuiTrovisco Lo capisco. Questo è il motivo per cui ho scritto: migliorerei la risposta in base al tuo feedback. Ho inserito alcuni commenti sulla tua domanda. Per favore, torna lì.
Dipan Mehta,

1

Ecco una piccola ispirazione che mostra l'opposto di ciò che stai cercando.

Inizia con fig3.

% Find background
labels = bwlabel(~fig3);
[n,idx] = hist(labels(:),0:max(labels(:)));
[bgrSize bgrLableIdx] = max(n);
bgr = (labels == idx(bgrLableIdx));
bgr = imopen(bgr,strel('disk',3));

% Remove border objects and cleanup
borderCleared = imclearborder(~bgr);
borderCleared = imopen(borderCleared,strel('disk',3));

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.