Оптимальный подход для обнаружения листообразных форм в opencv - PullRequest
12 голосов
/ 21 февраля 2012

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

Original picture

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

Canny edge detection

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

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

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

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

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

Подводя итог моим вопросам:

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

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

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

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

mean shift color segmentation

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

Contours

Ответы [ 4 ]

3 голосов
/ 21 февраля 2012

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

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

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

3 голосов
/ 21 февраля 2012

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

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

РЕДАКТИРОВАТЬ после комментария ...

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

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

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

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

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

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

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

0 голосов
/ 13 ноября 2017

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

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

  • Белл и Ди 2016: наблюдение за ростом растений - документ с изложением позиции по компьютерному зрению и Arabidopsis thaliana .http://doi.org/10.1049/iet-cvi.2016.0127

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

0 голосов
/ 13 ноября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...