@Plant

Алгоритм поиска точки, максимально удалённой от границ фигуры на изображении?

Дано бинарное изображение.
На картинке нарисована произвольная фигура.
Нужно найти точку принадлежащую этой фигуре, максимально удалённую от границ фигуры или границ изображения.

Т.е. задача заключается в том, чтобы найти такую точку принадлежащую фигуре, из которой можно построить круг с максимальным радиусом, все точки которого не будут выходить за границы фигуры или изображения.

Примером фигуры может быть круг на картинке, центр круга и будет нужной мне точкой.

Как лучше решить эту задачу и какой алгоритм применить?
  • Вопрос задан
  • 2462 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Alexander1705
Если фигура выпуклая, можно взять произвольную точку внутри, которую будем считать центром вписанной окружности, принять радиус равным нулю и применить следующий алгоритм:

1. Увеличить радиус на 1 условную единицу (пиксель).
2. Если окружность не пересекает фигуру, перейти к шагу 1.
3. Если возможно сдвинуть центр окружности на 1 условную единицу так, что окружность не будет пересекать фигуру, сдвинуть центр и перейти к шагу 1.

Если фигура не выпуклая, разбить её на выпуклые под-фигуры и выбрать произвольную точку в каждой из них. После чего повторить приведённый алгоритм для каждой выбранной точки и выбрать максимальный результат.

Алгоритм будет работать довольно медленно, но других вариантов я не знаю.

P.S. По сути, это всё равно, что надувать воздушный шарик внутри коробки. Сначала мы можем разместить его где угодно, но потом, надуваясь, он сам займёт верное положение.

P.P.S. Как альтернативный вариант, можно создать матрицу, в элемент M[i][j] которой записать расстояние от точки с координатами (i, j) до ближайшей точки фигуры. Потом просто найти максимальное в матрице.
Ответ написан
Комментировать
agent10
@agent10
Software Engineer
Я правильно понял, вам нужно:
"Вписать произвольную фигуру в окружность минимального радиуса"
?
Если да, то я бы попробовал бы для начала так:
1) Находим две точки фигуры, максимально удалённые друг от друга
2) Ваша искомая точка - центр этой прямой, соединяющая точки из 1 шага
Ответ написан
@localghost
Ну погодите, а нельзя сделать в лоб?
Для простоты положим, что фигура односвязная.
Для каждой внутренней точки ищем расстояние до границы (то есть находим ближайшую точку границы). Та внутренняя точка, для которой это расстояние максимально - искомая.
Что плохо, кроме того, что долго?
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Рассматриваем фигуру как граф: у каждой точки соседями считаются точки из небольшой окрестности (например, 7*7), а длиной ребра - евклидовы расстояния между точками. Тогда расстояние между двумя точками фигуры с хорошей точностью равно кратчайшему пути на этом графе. Осталось найти точку, самую далёкую от границы. Считается за O(S*log(S)), где S - площадь фигуры.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы