/Haut

Primary LanguagePython

Определение формы фигуры

Задача

Условия

  • вход - np.array, 2d картинка - темный фон, светлые фигуры
  • фигуры могут быть квадратами, кругами и треугольниками
  • выход - rgb картинка, на которой квадраты раскрашены в свой цвет, круги - в свой, треугольники - в свой

Ограничения

  • Фигуры не пересекаются
  • Фигуры могут быть повернутыми
  • Фигуры могут иметь разный размер
  • Треугольники могут быть любыми - прямоугольными, тупоугольными, разносторонними, с разными углами

Дополнительные плюсики

  • тесты
  • оформить в псевдорепозиторий
  • докстринги и адекватное написание
  • несколько вариантов и переключение способов

Решение

Как собрать

  1. Установите зависимости из requirements.txt
python -m pip install -r requirements.txt
  1. Установите пакет
python -m pip install -e .

Запуск тестов

python -m pytest -vv

Запуск в демо-режиме

python main.py --src_fpath <путь до входного файла> --dst_fpath <путь до выходного файла>

Алгоритм решения

  1. Находим на картинке все индивидуальные фигуры как связанные компоненты
  2. Каждую из них заключаем в bounding box с небольшим паддингом и рескейлим с сохранением соотношения сторон так, чтобы меньшая сторона имела размер 101 - не хотим тратить много времени на большие фигуры
  3. Ищем центр - двумерную медиану - внутри фигуры
  4. Находим пиксели, относящиеся к границе фигуры (вычитаем из фигуры фигуро после эрозии)
  5. Находим матрицу дистанций между центром фигуры и пикселями на границе
  6. ПРОВЕРКА НА КРУГЛОСТЬ
  • Если отношение стандартного отклонения расстояний от центра до границы к среднему расстоянию меньше 0.05 - это круг
  1. Пробуем вписать в фигуру окружность
  • Находим минимальное расстояние от центра до границы
  • Рисуем окружность с центром в найденном на шаге 3 центре и радиусом, равному минимальному расстоянию от центра до границы + 5
  1. Вычитаем из фигуры вписанную в нее окружность
  2. Ищем связанные компоненты, фильтруем по площади 10 px.
  3. ПРОВЕРКА НА КВАДРАТНОСТЬ
  • Если количество связанных компонент равно 4, это квадрат
  1. ПРОВЕРКА НА ТРЕУГОЛЬНОСТЬ
  • Если дошли до этого шага, фигура - треугольник*.

* Найденный центр не является центром описанной окружности для треугольника и не делит его на связные компоненты, каждая из которых относится к определенному углу.