Я начал играть с OpenCV для проекта, над которым я работаю.
Для этого проекта я выращиваю растения в горшках. Статические снимки различных этапов развития взяты сверху (см. Рисунок ниже).
Цель состоит в том, чтобы обнаружить и в конечном счете измерить (то есть размер) листья растущих растений на разных стадиях развития.
Я попробовал наивный подход к обнаружению края Canny, но он не работает так хорошо (см. Рисунок ниже), потому что он также обнаруживает небольшие края в почве (независимо от того, какой порог я использовал).
Я думаю, что лучший подход состоит в том, чтобы сначала сегментировать изображение по цвету, а затем использовать алгоритм обнаружения края, чтобы обнаружить листья.
Есть ли лучший способ сделать это?
Структура листьев известна заранее. Могу ли я использовать алгоритм машинного обучения/классификации, чтобы получить еще лучшие результаты?
Я также не думал о том, как измерить размер листьев? Существуют ли общие шаблоны для измерения размера и других дескрипторов? (может быть, есть ссылочный объект с известным размером на картинке?).
Наконец, мне также приходится иметь дело с окклюзией в некоторой степени. Это не видно на снимках, но на последующих этапах разработки мне, возможно, придется иметь дело с перекрывающимися листьями. Существуют ли какие-либо подходы к решению этого вопроса?
Я не могу уклониться от картины в мою пользу (т.е. затемнение почвы и т.д.), поскольку там могут быть тысячи растений, которые необходимо обработать.
Обобщение моих вопросов:
- Какой лучший подход к обнаружению листьев в почве (см. рисунки)?
- Может ли алгоритм машинного обучения улучшать обнаружение?
- Как измерить размер листьев?
- Как бороться с окклюзией/перекрывающимися листьями?
Я был бы очень благодарен за некоторые указатели или идеи.
Обновить (на основе комментариев Jeff7):
Сначала я запускал сегрегацию среднего сдвига вместе с алгоритмом наводнения и заканчивал этим изображением:
Когда я теперь запускаю обнаружение canny edge + findcontours на этом снимке, результаты намного лучше: