На границах вашего «остроконечного объекта» больше углов, поэтому один из подходов - настроить детектор углов для этого.
Например, я вычислил определитель тензора структуры (код Mathematica ниже) изображения с преобразованием расстояния:
Бинаризация с гистерезисом дает это изображение, которое должно стать хорошей отправной точкой для алгоритма сегментации по вашему выбору:
Код Mathematica ( src
исходное изображение, которое вы разместили)
Сначала я вычисляю преобразование расстояния входного изображения. Это создает контрасты по всей области объекта (а не только по границе), поэтому весь объект может быть обнаружен.
dist = ImageData[DistanceTransform[src]];
Далее я готовлю компоненты структуры тензора . Размер фильтра для гауссовых производных, если 5, размер окна равен 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];
Чтобы вычислить угловой фильтр для каждого пикселя, я просто подключаю их к символическому определителю тензора структуры:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Что в основном так же, как:
corners = gx2 * gy2 - gxy * gxy;
Преобразование этого в изображение и масштабирование его до диапазона 0..1 дает изображение детектора угла выше.
Наконец, бинаризация с правильными порогами дает окончательное двоичное изображение:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]