На кордонах вашого "колючого предмета" є більше кутів, тому одним із підходів було б налаштувати для цього кутовий детектор .
Наприклад, я обчислив визначник тензору структури (код 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}]