Как определить, является ли наиболее очевидный объект на изображении формой? - PullRequest
4 голосов
/ 13 апреля 2011

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

  • Выберите точку в списке контуров, сгенерировав ограничивающий прямоугольник и выбрав ближайшую точку слева вверху (точка p).
  • Создайтеновый объект Shape и добавьте p к контуру фигуры.
  • Если на основном изображении больше нет точек, доступных для тестирования, мы просто возвращаем объект shape.
  • Получаем ближайшую точку из pи сохраните его в ближайшем.
  • , пока расстояние от ближайшей
    точки до точки p меньше или
    равно десяти
  • ---- Добавьте его в контур
  • ---- Удалить его из списка мастер-точек
  • ---- Установить p на ближайшую
  • ---- Получить другую ближайшую точку от ближайшей
  • ---- Повтор
  • Если фигура имеет десять или менее точек на контуре, верните нулевой объект (игнорируйте все маленькие фигуры)
  • В противном случае верните объект формы.

Я повторяю этот процесс, пока список основных пунктов не станет пустым.Это означает, что мы извлекли все фигуры.

Теперь я делаю комбинированные фигуры несколько раз.Это делает это так, если у меня есть |, --- и |рядом друг с другом он будет объединяться для создания прямоугольника.Вы понимаете, что я имею в виду?Допустим, у меня есть круг, приведенный выше извлекающий код иногда говорит, что половина круга - это одна фигура, а другая половина - другая фигура.Поэтому, когда я объединяю фигуры, это становится одним кружком.

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

enter image description here

Изображение слева - это начальное изображение, а справа - контуры.Теперь я нажимаю кнопку определения формы.Он определяет форму наиболее доминирующей фигуры на изображении (объект формы, который содержит наибольшее количество точек на контуре).

enter image description here

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

Таким образом, проверяется вся единичная фигура (черный контур справа на втором рисунке).Не только часть «прямоугольник», но и все на этой картинке проверено.Не могли бы вы, ребята, придумать какой-нибудь способ убрать эту вещь и извлечь просто прямоугольную часть вместо того, чтобы включать пальцы?Я думал о некоторой вариации A * для этого, но в случае, подобном этой картине, он не создает петли.Итак, что мне делать, когда A * посещает каждую точку (поскольку она не может вернуться к начальной точке).Что мне тогда делать?

Может кто-нибудь помочь мне попытаться выяснить это, пожалуйста?

1 Ответ

1 голос
/ 13 апреля 2011

Я думаю, что следующая часть вашего кода не так мудра:

    int iSelected = selected.ToArgb();
    int iNextRight = nextRight.ToArgb();
    if (Math.Abs(iSelected - iNextRight) > alpha)

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

Если вы хотите добиться лучших результатов, вы можете использовать Canny Edge Detector или хотя бы взглянуть на этапы его обработки.

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

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

Я желаю вам удачи.

...