Ci sono più angoli ai bordi del tuo "oggetto appuntito", quindi un approccio sarebbe quello di mettere a punto un rilevatore d'angolo per questo.
Ad esempio, ho calcolato il determinante del tensore di struttura (codice Mathematica di seguito) di un'immagine trasformata a distanza:
La binarizzazione con l'isteresi produce questa immagine, che dovrebbe essere un buon punto di partenza per l'algoritmo di segmentazione di tua scelta:
Codice Mathematica ( src
è l'immagine sorgente che hai pubblicato)
Inizialmente, calcolo una trasformazione di distanza dell'immagine di input. Ciò crea contrasti sull'intera area dell'oggetto (anziché solo sul bordo), in modo che l'intero oggetto possa essere rilevato.
dist = ImageData[DistanceTransform[src]];
Quindi preparo i componenti del tensore della struttura . La dimensione del filtro per i derivati gaussiani se 5, la dimensione della finestra è 20.
gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];
Per calcolare il filtro d'angolo su ciascun pixel, li inserisco semplicemente nel determinante simbolico del tensore della struttura:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Che è sostanzialmente lo stesso di:
corners = gx2 * gy2 - gxy * gxy;
La conversione in un'immagine e il ridimensionamento a 0..1 produce l'immagine del rivelatore d'angolo sopra.
Infine, binarizzandolo con le soglie giuste si ottiene l'immagine binaria finale:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]