Не полный ответ на вашу проблему, но идея, которую я придумал.Вы можете проверить все точки границы на предмет их «близости» к границе изображения, а затем найти минимальные / максимальные значения (x, y)
, которые описывают те «концы», которые вас интересуют.
B = bwboundaries(img);
% Threshold for "closeness" to an image border.
thrNear = 5;
for k = 1:numel(B)
b = B{k};
nearTop = b(:, 1) < thrNear;
nearBottom = b(:, 1) > (size(img, 1) - thrNear);
nearLeft = b(:, 2) < thrNear;
nearRight = b(:, 2) > (size(img, 2) - thrNear);
closeToTop = b(nearTop, :)
closeToBottom = b(nearBottom, :)
closeToLeft = b(nearLeft, :)
closeToRight = b(nearRight, :)
end
Например, для правильной фигуры в исходном изображении вы получите:
closeToTop = [](0x2)
closeToBottom = [](0x2)
closeToLeft = [](0x2)
closeToRight =
79 283
79 284
79 285
79 286
79 287
80 287
81 287
81 286
81 285
81 284
81 283
215 283
215 284
215 285
215 286
215 287
216 287
217 287
217 286
217 285
217 284
217 283
Теперь перейдите к максимальным значениям x
(287) и найдите подходящее (не соседствующее)) y
значения (79-81 против 215-217).Повторите это для каждой границы изображения.
Надеюсь, вы поняли мою идею.Если честно, я не хочу реализовывать это полностью, но не стесняйтесь спрашивать, не является ли мое описание недостаточно точным.