2012-02-21 21 views
12

Empecé a jugar con OpenCV para un proyecto en el que estoy trabajando.
Para este proyecto estoy cultivando plantas en macetas. Las imágenes estáticas de diferentes etapas de desarrollo se toman desde arriba (vea la figura a continuación).Enfoque óptimo para detectar formas similares a hojas en opencv

Original picture

La meta es detectar y medir en última instancia (es decir, tamaño) de las hojas de las plantas en crecimiento durante las diferentes etapas de desarrollo.
Intenté un enfoque ingenuo de usar Detección de bordes Canny, sin embargo, no funcionó tan bien (ver la figura a continuación) porque también detecta pequeños bordes en el suelo (no importa qué tipo de umbral utilicé).

Canny edge detection

creo que el mejor enfoque consiste en primer segmento de la imagen por el color y luego usar algún algoritmo de detección de bordes para detectar las hojas.
¿Hay una mejor manera de hacerlo?

La estructura de la hoja se conoce de antemano. ¿Podría usar el algoritmo de aprendizaje/clasificación de máquinas para obtener resultados aún mejores?

¿También no he pensado en cómo medir el tamaño de las hojas? ¿Hay algún patrón común para medir el tamaño y otros descriptores? (¿Tal vez tenga un objeto de referencia con un tamaño conocido en la imagen?).

Finalmente, también tengo que ocuparme de la oclusión en cierta medida. Esto no es visible en las imágenes, pero en etapas de desarrollo posteriores podría tener que lidiar con hojas superpuestas. ¿Hay algún enfoque para lidiar con eso?

no puedo sesgo de la imagen en mi favor (es decir, negando el acceso a la tierra, etc.) ya que puede haber miles de plantas que tienen que ser procesados.

Para resumir mis preguntas:

  • Cuál es el mejor método para detectar hojas en un suelo (ver figuras)?
  • ¿Puede el algoritmo de aprendizaje automático mejorar la detección?
  • ¿Cómo puedo medir el tamaño de las hojas?
  • ¿Cómo tratar las hojas de oclusión/superposición?

Estaría muy agradecido por algunos consejos o ideas.

actualización (basado en los comentarios Jeff7):

me encontré por primera vez la segmentación media de cambio de color junto con un algoritmo de FloodFill y terminó con esta imagen:

mean shift color segmentation

Cuando ahora ejecuta la detección de borde astuto + findcontours en esa imagen los resultados son mucho mejores:

Contours

Respuesta

3

Dado que tiene un gran control sobre las condiciones en las que toma imágenes, el sesgo importa a su favor. Haga una máscara de la tarjeta negra para colocarla alrededor de la raíz de la planta cuando desee capturar una imagen. Su problema se reduce a uno de detectar píxeles verdes sobre un fondo negro. Como también controla la posición de la cámara con respecto a la posición de la planta, debe poder organizar las cuestiones de modo que la relación píxel/mm sea constante en toda su serie de imágenes. El área de la hoja es entonces una simple cuestión de contar píxeles.

Esto aún no se ocupa del problema de la oclusión. Probablemente puedas averiguar algo tomando 2 imágenes adicionales, elevaciones de la planta en 2 planos ortogonales (otra vez usando el fondo negro) para tener una idea de la forma de la planta.

Edición después comentario ...

Bueno, tu pregunta incluye la declaración 'Para este proyecto que estoy creciendo una planta específica en una olla' y ahora desea procesar miles de esas malditas cosas. Seguiría buscando las posibilidades de sesgar la imagen a tu favor. Por ejemplo, si la imagen que publicó no tiene plástico verde en el fondo, entonces probablemente tenga una imagen que podría separarse, con un buen grado de precisión, mediante un umbral simple en el canal verde de su (s) imagen (es) . Así que deshágase del fondo verde y riegue la tierra antes de tomar imágenes para aumentar su negrura.

En cuanto al problema de la oclusión, vas a necesitar algo más inteligente que mi sugerencia original para tratar con miles de plantas. Tal vez podrías sacrificar algunas plantas en cada etapa, medir el "área foliar observada directamente desde arriba", luego arrancar las hojas, disponerlas por separado en una ficha negra y obtener una relación empírica entre el área total y el área observable.

posterior edición

OK, por lo que no puede sesgo de la escena en su favor. ¿Has pensado en utilizar un filtro en la cámara para admitir solo luz verde? ¿O iluminación que hace que los objetos verdes sean más brillantes que los objetos no verdes? Estoy fuera de las ideas en este caso ...

edición final

me he quedado sin ideas. Creo que su enfoque original, el uso del color para discriminar entre las hojas y el fondo, es bueno. Como conoce la estructura de las hojas, puede probar la coincidencia de plantillas, pero puede estimar tanto las áreas como las longitudes (o las diferencias en el área y la longitud) simplemente contando los píxeles. Es posible que desee investigar las operaciones morfológicas (por ejemplo, esqueletización) para obtener medidas de forma de las imágenes. Puede encontrar material en la literatura sobre teledetección de follaje (etc.) que ayude.

Me da la impresión de que se ha comprometido mentalmente con el objetivo de implementar un sistema de visión por computadora, donde su objetivo es supervisar el desarrollo de las plantas y algunas de sus ideas (por ejemplo, detección de bordes, aprendizaje automático) no contribuyas a alcanzar tu objetivo adecuado

+0

gracias por los comentarios. Tienes razón, tengo control sobre las condiciones y también pensé en "ennegrecer" el suelo. Lamentablemente, no es posible ya que tengo que ocuparme no solo de una planta, sino también de que miles de veces y el ennegrecer el suelo consumen demasiado tiempo. Para medir el tamaño de la hoja, tiene razón. Esto puedo controlar de hecho ya que la imagen está tomando siempre desde la misma posición y las macetas tienen el mismo tamaño. –

+0

Perdón por la confusión. Actualicé las preguntas originales para aclararlo un poco.Solo estaba mostrando una planta como ejemplo, sin embargo, normalmente tengo 36 de esas ollas en una bandeja. –

+0

No, no he pensado en eso, pero estas son buenas sugerencias. Gracias. Lo investigaré. ¿Puede recomendar algún algoritmo o enfoque que funcione mejor en esa configuración (donde no puedo polarizar la imagen y tener este tipo de distribución de color)? –

3

Eche un vistazo a la segmentación del color del cambio medio (hay un ejemplo incluido con OpenCV en el directorio de ejemplos). Puede usar esto para separar su imagen en 2 clases (planta y suelo) y usarla para procesar sus datos.

En cuanto a la medición, es posible que desee ignorar inicialmente los efectos de oclusión y la calibración de la cámara y simplemente observe la parte del área en la imagen que es la clase de planta.

Si desea comenzar a medir hojas individuales, puede utilizar un enfoque de "seguimiento" donde utilice la información temporal así como la información espacial en la imagen. La información temporal puede ser la ubicación y el tamaño de la hoja en la imagen anterior. Probablemente hay muchas técnicas que podrías aplicar, pero comenzaría simple si fuera tú y verías qué tan lejos te alcanza.

+0

Gracias por los comentarios. Actualicé mi respuesta en función de su opinión. Parece que funciona duro. Tuve que jugar un poco con los parámetros de segmentación de cambios medios para obtener buenos resultados (tuve que aumentar el radio de la ventana espacial en una cantidad justa que hace que el algoritmo funcione bastante lento) –

0

PlantCV señala que cuanto más controles tu configuración, menos trabajo tendrás que hacer en el software.
Si controla su posición de siembra (en lugar de simplemente esparcirlos sobre la bandeja), puede enmascararse alrededor de las plantas de semillero y deshacerse del desorden de fondo. Esto también es una ayuda significativa para trabajar con plantas individuales y encontrar la misma planta en diferentes imágenes. La superposición de plantas supondrá una situación imposible, ya sea cuando se esparzan las semillas y los brotes uno al lado del otro, o cuando exceden el tamaño de los espaciamientos. Debe decidir si está plantando para obtener las mejores observaciones o un crecimiento óptimo. Los dos no son mutuamente compatibles. En mi experiencia, es correcto utilizar el color (cv2.inRange) como paso principal, luego pasar a la detección de bordes Canny. A partir de ahí, puedes obtener contornos. Supongo que está usando Arabadopsis, por lo que podría buscar un patrón circular para contar las hojas (no funciona con la lechuga). Una vez que haya separado sus plantas y tenga contornos (exteriores), puede usar cv2.contourArea y cv2.minAreaRectangle para obtener algunas métricas básicas. Esta es la ruta en la que estoy trabajando.

0

Este es un área activa de investigación. Recomiendo los siguientes documentos:

  • Scharr et al. 2016: segmentación de la hoja de la planta de fenotipificación: un estudio de colación (pdf)

  • Bell y Dee 2016: ver crecer las plantas, un documento de posición sobre la visión por ordenador y thaliana de Arabidopsis . http://doi.org/10.1049/iet-cvi.2016.0127

PlantCV tiene algunas instalaciones para la segmentación de las hojas con transformaciones distancia y las cuencas hidrográficas, y me gustaría añadir más. Vea nuestro preprint, una versión revisada de la cual se publicará pronto en PeerJ.

Cuestiones relacionadas