In attività di segmentazione se si dispone di entrambe le
- buoni marcatori; e
- bordi forti intorno all'oggetto di interesse
poi viene direttamente risolti mediante un Watershed Transform. Il problema, naturalmente, è ottenere questi marcatori, oltre a migliorare i bordi rilevanti secondo necessità. Ottenere questi potrebbe coinvolgere conoscenza specifica del problema, che non ho per il tuo problema.
Tuttavia, ci sono alcuni metodi generali che potrebbero essere utili. Ad esempio, gli operatori collegati da Matematica Morfologica servono come un modo per unire ed estendere le zone piatte. Quindi, forse può darci dei marcatori relativamente buoni per il problema. Nell'immagine seguente una ricostruzione morfologica mediante apertura (una sorta di operatore connesso) è stata eseguita nella versione in scala di grigi dell'immagine originale (immagine a sinistra) e il restante massimo regionale è mostrato a destra.
Ora, siamo in grado di ottenere il gradiente morfologico della immagine a sinistra sopra. Possiamo anche eseguire il riempimento dei fori e una dilatazione con un piccolo disco nell'immagine a destra sopra per ottenere contorni più lisci - questo definisce la nostra immagine marker. Poi, l'applicazione di un Watershed Transform nell'immagine gradiente utilizzando la nostra immagine marcatore, e quindi in espansione (erodere o dilatarsi, dipende da come si vede) le linee spartiacque, otteniamo la seguente immagine:
I sospetto che sia possibile scartare facilmente regioni troppo grandi e troppo piccole. Quindi, se si dispone di alcune dimensioni approssimative previste per gli artigli, nonché per il palmo, è possibile eliminare le regioni irrilevanti. A questo punto è solo questione di dilatare le aree per formare un singolo componente e mostra contorno risultante nell'immagine originale:
Codice di esempio per l'esecuzione di ciascun passaggio (i passaggi rilevanti sono anche mostrati in commentato codice Matlab):
f = Import["http://imageshack.us/a/img407/4636/p1060993g.jpg"]
g = ColorConvert[f, "Grayscale"] (* g = rgb2gray(f); *)
(* First image shown: *)
geo = GeodesicOpening[g, DiskMatrix[5]] (* geo = imreconstruct(imerode(g, ... *)
(* strel('disk', 6)), g); *)
(* Second image shown: *)
marker = MaxDetect[geo] (* marker = imregionalmax(geo); *)
(* Watershed on gradient with markers. *)
mgrad = ImageSubtract[Dilation[geo, 1], Erosion[geo, 1]]; (* mgrad = ... *)
(* imdilate(geo,strel('square',3)) - imerode(geo,strel('square',3)); *)
ws = Image[ (* ws = watershed(imimposemin(mgrad, bwmorph(imfill(... *)
WatershedComponents[mgrad, (* imregionalmax(geo),'holes'),'dilate')))); *)
Dilation[FillingTransform[marker], DiskMatrix[1]]]]
(* Third image shown: *)
wsthick = Erosion[ws // ImageAdjust, DiskMatrix[5]]
(* Connected component selection based on some supposed sizes. *)
ccs = SelectComponents[wsthick, "Count", 1000 < # < 3000 || 6000 < # < 10000 &]
(* Final image (thick border on binarized filled dilated ccs) *)
res = ImageAdd[f, Dilation[MorphologicalPerimeter[FillingTransform[
MorphologicalPerimeter[Dilation[ccs, DiskMatrix[9]]]]], 2]]
Il problema è probabilmente più difficile di quanto si pensi. Può essere d'aiuto se approfondisci l'ulteriore utilizzo di quel confine, cioè di quale precisione hai bisogno? Se vuoi solo rilevare il pugmark, o conoscerne la direzione, non è necessario un confine preciso. –
sei condannato. : - (..... Questo è un compito di elaborazione delle immagini estremamente difficile – Shai
@RomanShapovalov Vorrei dirti perché, in particolare, ho bisogno di segnare i confini e scartare la regione irrilevante. Devo analizzare il pugmark e basato su alcune caratteristiche selezionate come area del pad, area delle dita, angolo tra le dita 2 e 3, lunghezza del segnaposto, larghezza, ecc. e poi dopo aver confrontato l'immagine analizzata con il set di allenamento devo essere in grado di distinguere quale pugmark della tigre è – Suvidha