Подтвердить что ты не робот

Оптимальный подход для обнаружения листовидных форм в opencv

Я начал играть с OpenCV для проекта, над которым я работаю.
Для этого проекта я выращиваю растения в горшках. Статические снимки различных этапов развития взяты сверху (см. Рисунок ниже).

Original picture

Цель состоит в том, чтобы обнаружить и в конечном счете измерить (то есть размер) листья растущих растений на разных стадиях развития.
Я попробовал наивный подход к обнаружению края Canny, но он не работает так хорошо (см. Рисунок ниже), потому что он также обнаруживает небольшие края в почве (независимо от того, какой порог я использовал).

Canny edge detection

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

Структура листьев известна заранее. Могу ли я использовать алгоритм машинного обучения/классификации, чтобы получить еще лучшие результаты?

Я также не думал о том, как измерить размер листьев? Существуют ли общие шаблоны для измерения размера и других дескрипторов? (может быть, есть ссылочный объект с известным размером на картинке?).

Наконец, мне также приходится иметь дело с окклюзией в некоторой степени. Это не видно на снимках, но на последующих этапах разработки мне, возможно, придется иметь дело с перекрывающимися листьями. Существуют ли какие-либо подходы к решению этого вопроса?

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

Обобщение моих вопросов:

  • Какой лучший подход к обнаружению листьев в почве (см. рисунки)?
  • Может ли алгоритм машинного обучения улучшать обнаружение?
  • Как измерить размер листьев?
  • Как бороться с окклюзией/перекрывающимися листьями?

Я был бы очень благодарен за некоторые указатели или идеи.

Обновить (на основе комментариев Jeff7):

Сначала я запускал сегрегацию среднего сдвига вместе с алгоритмом наводнения и заканчивал этим изображением:

mean shift color segmentation

Когда я теперь запускаю обнаружение canny edge + findcontours на этом снимке, результаты намного лучше:

Contours

4b9b3361

Ответ 1

Поскольку у вас есть большой контроль над условиями, в которых вы принимаете изображения, смещение имеет значение в вашу пользу. Сделайте маску из черной карты, чтобы разместить вокруг корня растения, когда вы хотите захватить изображение. Ваша проблема сводится к одному из пятен зеленых пикселей на черном фоне. Поскольку вы также контролируете положение камеры по отношению к положению растения, вы должны иметь возможность упорядочивать такие вещи, чтобы соотношение пикселей/мм было постоянным в вашей серии изображений. Область листа - это просто вопрос подсчета пикселей.

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

ИЗМЕНИТЬ после комментария...

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

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

ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ

ОК, поэтому вы не можете смещать сцену в свою пользу. Вы думали использовать фильтр на камере, чтобы признать только зеленый свет? Или освещение, которое делает зеленые объекты ярче, чем не-зеленые объекты? У меня нет идей об этом...

ЗАКЛЮЧИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ

У меня закончились идеи. Я думаю, что ваш оригинальный подход, используя цвет, чтобы различать листья и фон, хорош. Поскольку вы знаете структуру листьев, вы можете попробовать сопоставить шаблоны, но вы можете оценить как области, так и длину (или различия по площади и длине), просто подсчитав пиксели. Возможно, вам захочется исследовать морфологические операции (например, скелетонирование) для получения формальных мер из изображений. Вы можете найти материал в литературе по дистанционному зондированию листвы (и т.д.), Который помогает.

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

Ответ 2

Взгляните на сегментацию сегмента с переменным сдвигом (там пример включен в OpenCV в каталоге samples). Вы можете использовать это, чтобы разделить изображение на 2 класса (растение и почву) и использовать их для дальнейшей обработки ваших данных.

Что касается измерения, вы можете сначала проигнорировать эффекты окклюзии и калибровку камеры и просто посмотреть на часть области в изображении, которая является классом растения.

Если вы хотите перейти к измерению отдельных листьев, вы можете использовать подход "отслеживания", в котором вы используете временную информацию, а также пространственную информацию на изображении. Временной информацией может быть местоположение и размер листа на предыдущем изображении. Там, вероятно, много методов, которые вы могли бы применить, но я бы начал просто, если бы был вами, и посмотреть, как далеко он вас доставит.

Ответ 3

PlantCV указывает, что чем больше вы контролируете свою установку, тем меньше работы вы должны делать в программном обеспечении.
Если вы управляете своим местом высева (а не просто разбрасываете их по лотку), вы можете маскировать вокруг саженцев и избавляться от фонового беспорядка. Это также значительная помощь для работы с отдельными растениями и нахождения того же растения в разных изображениях. Перекрывающиеся растения сделают невозможную ситуацию, когда вы разбросаете семена и прорастаете рядом друг с другом или когда они превышают размер вашего интервала. Вы должны решить, устанавливаете ли вы наилучшие наблюдения или оптимальный рост. Эти два не совместимы друг с другом. По моему опыту, вы правильно используете цвет (cv2.inRange) в качестве основного шага, а затем переходите к обнаружению края Canny. Оттуда вы можете получить контуры. Я предполагаю, что вы используете Arabadopsis, так что вы можете искать круговой рисунок для подсчета листьев (не работает с салатом). Как только вы отделите свои растения и имеете (внешние) контуры, вы можете использовать cv2.contourArea и cv2.minAreaRectangle, чтобы получить некоторые основные показатели. Это маршрут, в котором я работаю.

Ответ 4

Это активная область исследований. Я рекомендую следующие документы:

  • Scharr et al. 2016: Сегментация листьев в фенотипировании растений: исследование сопоставлений (pdf)

  • Bell and Dee 2016: Наблюдение за растениями - позиционная работа по компьютерному видению и Arabidopsis thaliana. http://doi.org/10.1049/iet-cvi.2016.0127

PlantCV имеет некоторые возможности для сегментирования листьев с дистанционными преобразованиями и водоразделами, и я хотел бы добавить больше. См. Наш preprint, пересмотренная версия которого скоро будет опубликована в PeerJ.