Как распознать сложный геометрический объект близкий к овалу?

Имеется сложная геометрическая фигура.
5aaf87107f817041108210.jpeg

Необходимо её залить красным цветом.
Известны критерии следующие
1. Это по идее единственная замкнутая область на изображении. (может быть еще одна).
2. Она не касается границ изображения.
3. Она отдаленно овальная, может быть в форме пережатого овала (простите за термины).

Пробовал преобразование Хафа(пример с поиском окружностей), вариант не сработал.
Тут получается 2 вопроса:
1. Можно ли использовать под данную задачу нейронные сети, если можно то какой конкретный тип? Примеров наберу максимум штук 20 разных.
2. Есть ли алгоритмы или методы которые позволяют понять замкнутость (кроме жука) и примерно овальную форму?

P.S пишу на Python и C++. В гугле кидает только на статьи с жуком и Хафом. Прошу помощи.
  • Вопрос задан
  • 1154 просмотра
Пригласить эксперта
Ответы на вопрос 5
longclaps
@longclaps
Примеров наберу максимум штук 20 разных
Для обучения нейронки нужно намного больше. Пишите эвристику.
Раз область не касается края - залейте изображение из точки на границе, и ваша область окажется незалитой.
Если замкнутых областей несколько, а надо выбрать одну - нужен критерий овальности. Придумайте какой-нибудь. Например: поверх области рисуем эллипс равной площади, минимизируя площадь выступающих за эллипс "мысов" и "полуостровов". Это - простая задача на поиск минимума, параметры - ну ясно какие у эллипса параметры ) Ну и смотрим, какая область менее корявая.
Ответ написан
LaRN
@LaRN
Senior Developer
Замкнутость контура можно определить только пройдя по всему контуру, так что тут Жук или Чучундра не важно.
А вот определение похожести на овал по идее можно совместить с обходом контура.
В СОПРОМАТе есть формулы для определения главных осей инерции, в случае эллипса они совпадают с осями эллипса, там же есть формула для определения центра масс.
Например вот:
www.toehelp.ru/theory/sopromat/18.html
Там все на интегралах, но в нашем случае можно просто суммами заменить.
Алгоритм такой: находим замкнутый контур, находим центр масс(из координат точек найденного контура), находим главные оси инерции (аналогично из координат), находим площадь контура (тут можно просуммировать площадь треугольников образованных центром масс(инерции) и двумя следующими друг за другом точками контура).
Далее, имея центр масс и направление осей инерции находи полуоси эллипса (это можно сделать выпустив лучи из центра масс в направлении главных осей инерции до пересечения с контуром), а зная полуоси находим площадь эллипса.

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

Тут конечно много операций, но это сильно проще и по ресурсам не так затратно как нейронные сети.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
5aafcadc58920983802658.png
1. Проворачиваем луч из угла изображения и сохраняем все пересечения с контуром.
2. Ищем близкие группы из 4-х точек
3. Проверяем, что диагонали неправильного 4-х угольника НЕ дают пересечения с контуром.
4. Смотрим отношение расстояний группы этих точек к друг другу.
Ответ написан
ZeroDX
@ZeroDX
Бездельник
а нельзя тыркаться по картинке, пока не попадём в чёрный пиксель? Затем можно было бы перебирать соседей, пока они не закончатся, ну или пока не дойдём до того пикселя, с которого начали. Если дошли - фигура замкнутая. А потом можно было бы для каждой х-координаты находить максимум и минимум по у-координате, а всё, что между ними и не чёрное, закрашивать в красный.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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