Как определить, является ли наиболее очевидный объект на изображении формой?
Хорошо, ребята, я думаю, что сделал все, что мог, кроме одной важной вещи: извлечение формы. Я уже делаю это довольно простым способом, но в некоторых случаях это действительно портит. Я делаю это так:
- Выберите точку в списке контуров, создав ограничивающий прямоугольник и выбрав ближайшую точку слева вверху (точка p).
- Создайте новый объект Shape и добавьте p в контур фигуры.
- Если на главном изображении больше нет точек, доступных для тестирования, мы просто возвращаем объект формы.
- Получите ближайшую точку от p и сохраните ее в ближайшей.
- в то время как расстояние от ближайшего
точка к точке р меньше или
равно десяти - ---- добавить его в схему
- ---- Удалить его из списка мастер-точек
- ---- Установите p на ближайший
- ---- Получить еще один ближайший пункт от ближайшего
- ----Повторение
- Если фигура имеет десять или менее точек на контуре, вернуть нулевой объект (игнорировать все маленькие фигуры)
- В противном случае верните объект формы.
Я повторяю этот процесс, пока список основных пунктов не станет пустым. Это означает, что мы извлекли все формы.
Сейчас я делаю комбинированные фигуры несколько раз. Это делает это так, если у меня есть |, --- и | рядом друг с другом он будет объединяться для создания прямоугольника. Вы понимаете, что я имею в виду? Допустим, у меня есть круг, приведенный выше извлекающий код иногда говорит, что половина круга - это одна фигура, а другая половина - другая фигура. Поэтому, когда я объединяю формы, это становится одним кругом.
Вздох, я тоже не могу публиковать фотографии, и я не могу загрузить это нигде, кроме сайта загрузки. Это имеет некоторые проблемы. Посмотрите на следующее:
Картинка слева - это начальная картинка, а справа - точки контура. Теперь я нажимаю кнопку определения формы. Он определяет форму наиболее доминирующей фигуры на изображении (объект формы, который содержит наибольшее количество точек на контуре).
Теперь, это правильно говорит, что это четырехугольник, но по неправильным причинам. Из-за моих комбинированных форм (которые нужно было сделать, чтобы получить даже прямоугольную форму, иначе это будет маленькая линия для одной формы и другая маленькая линия для другой формы), он добавил контур тестирования к тестированию.
Таким образом, проверяется вся единичная фигура (черный контур справа на втором рисунке). Не только часть "прямоугольник", но и все на этой картинке проверено. Не могли бы вы, ребята, придумать какой-нибудь способ убрать эту вещь и извлечь просто прямоугольную часть вместо того, чтобы включать пальцы? Я думал о некоторой вариации A* для этого, но в случае, подобном этой картине, он не создает петли. Итак, что мне делать, когда A* посещает каждую точку (поскольку она не может вернуться к начальной точке). Что мне тогда делать?
Кто-нибудь может помочь мне попытаться выяснить это, пожалуйста?
1 ответ
Я думаю, что следующая часть вашего кода не так мудра:
int iSelected = selected.ToArgb();
int iNextRight = nextRight.ToArgb();
if (Math.Abs(iSelected - iNextRight) > alpha)
потому что в результате вы сравниваете почти только с красным цветом (остальные хранятся в менее значительных фрагментах), предполагая, что вы не используете альфа в изображениях.
Если вы хотите добиться лучших результатов, вы можете использовать Canny Edge Detector или, по крайней мере, взглянуть на этапы его обработки.
Другой вариант - использовать функцию, подобную волшебной палочке, чтобы отделить основной объект от фона, а затем извлечь его края. Для этого, например, можно использовать модель Поттса.
Если вы хотите что-то более простое, вы можете определить края так, как вы это делаете, но используйте сумму различий всех цветовых каналов. Затем предположим, что точка в середине является частью искомого объекта и закрасьте фигуру между ближайшими краями, как кисть. Если вы выберете правильный порог, вы устраните эти пальцы.
Я желаю вам удачи.