Il y a plus de coins sur les bords de votre "objet hérissé", donc une approche serait de régler un détecteur de coin pour cela.
Par exemple, j'ai calculé le déterminant du tenseur de structure (code Mathematica ci-dessous) d'une image transformée en distance:
La binarisation avec hystérésis donne cette image, qui devrait être un bon point de départ pour l'algorithme de segmentation de votre choix:
Code Mathematica ( src
est l'image source que vous avez publiée)
Dans un premier temps, je calcule une transformation de distance de l'image d'entrée. Cela crée des contrastes sur toute la zone de l'objet (au lieu de simplement la bordure), de sorte que l'objet entier peut être détecté.
dist = ImageData[DistanceTransform[src]];
Je prépare ensuite les composants du tenseur de structure . La taille du filtre pour les dérivées gaussiennes si 5, la taille de la fenêtre est 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];
Pour calculer le filtre d'angle à chaque pixel, je les branche simplement au déterminant symbolique du tenseur de structure:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Ce qui est essentiellement le même que:
corners = gx2 * gy2 - gxy * gxy;
La conversion en une image et sa mise à l'échelle dans une plage de 0..1 donne l'image du détecteur de coin ci-dessus.
Enfin, la binariser avec les bons seuils donne l'image binaire finale:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]