Existem mais cantos nas bordas do seu "objeto pontudo"; portanto, uma abordagem seria ajustar um detector de cantos para isso.
Por exemplo, calculei o determinante do tensor da estrutura (código do Mathematica abaixo) de uma imagem transformada à distância:
Binarizar com histerese produz essa imagem, que deve ser um bom ponto de partida para o algoritmo de segmentação de sua escolha:
Código do Mathematica ( src
é a imagem de origem que você postou)
Inicialmente, calculo uma transformação de distância da imagem de entrada. Isso cria contrastes em toda a área do objeto (em vez de apenas na borda), para que todo o objeto possa ser detectado.
dist = ImageData[DistanceTransform[src]];
Em seguida, preparo os componentes do tensor da estrutura . O tamanho do filtro para as derivadas gaussianas, se 5, o tamanho da janela é 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];
Para calcular o filtro de canto em cada pixel, basta inseri-los no determinante simbólico do tensor da estrutura:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Que é basicamente o mesmo que:
corners = gx2 * gy2 - gxy * gxy;
Convertendo isso em uma imagem e redimensionando-o para o intervalo 0..1, obtém-se a imagem do detector de canto acima.
Finalmente, a binarização com os limites corretos fornece a imagem binária final:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]