Avance - Tecnológico de Monterrey

Anuncio
Instituto Tecnológico y de Estudios Superiores de Monterrey
Campus Cuernavaca
Avance de Proyecto
Reconocimiento de Hojas de Plantas
Deny L. Hernández Rabadán
1125746
Francisco R. Uribe Cornejo
375673
Visión Computacional
Dr. Julián Guerrero
Cuernavaca, Mor., a 7 de octubre de 2009
Índice
ÍNDICE _______________________________________________________________________ 2
INTRODUCCIÓN ______________________________________________________________ 3
PROBLEMÁTICA ________________________________________________________________ 3
JUSTIFICACIÓN _________________________________________________________________ 4
OBJETIVO ____________________________________________________________________ 5
OBJETIVOS ESPECÍFICOS _________________________________________________________ 5
METODOLOGÍA ______________________________________________________________ 6
PROCESAMIENTO DE LA IMAGEN ____________________________________________________ 6
SEGMENTACIÓN _________________________________________________________________ 7
EXTRACCIÓN DE CARACTERÍSTICAS__________________________________________________ 7
RECONOCIMIENTO _______________________________________________________________ 8
ANTECEDENTES ______________________________________________________________ 9
CALENDARIZACIÓN _________________________________________________________ 11
AVANCES ___________________________________________________________________ 12
ESTADO DEL ARTE _____________________________________________________________ 12
TÉCNICAS ____________________________________________________________________ 15
PROCESAMIENTO DE IMAGEN______________________________________________________ 15
SEGMENTACIÓN ________________________________________________________________ 18
EXTRACCIÓN DE CARACTERÍSTICAS ________________________________________________ 19
RESULTADOS __________________________________________________________________ 20
ANEXO I – CÓDIGO __________________________________________________________ 23
REFERENCIAS _______________________________________________________________ 31
2
Introducción
Entre los desafíos más importantes que enfrenta la agricultura y el sector rural en el siglo
XXI destacan: a) el abastecimiento o seguridad alimentaria, b) la agricultura como motor en
la reducción de la pobreza y, c) el uso actual y el deterioro de los recursos naturales. En
cuanto al primero, el reto consiste en producir comida suficiente para alimentar a una
población mundial que alcanzará 8 mil millones de habitantes en el año 2025 o 2030 y 10
mil millones antes del 2050 según El País [1], incremento que tendrá lugar sobre todo en los
países en desarrollo.
El sector rural mexicano de la primera década del siglo XXI alcanza 198 millones de
hectáreas de las cuales 16 % son tierras agrícolas, 61 % de agostadero y 23 % de bosques y
selvas de acuerdo al INEGI [2].
El Plan Nacional de Desarrollo 2007-2012 plantea como premisa básica la búsqueda del
Desarrollo Humano Sustentable, correspondiendo a esto el Programa Especial Concurrente
para el Desarrollo Rural Sustentable 2007-2012 (PEC 2007-2012) establece un conjunto de
estrategias y alternativas para reactivar el agro mexicano entre las que podemos resaltar la
protección al país de plagas y enfermedades y mejorar la situación sanitaria. Así como
garantizar la aplicación de la normatividad vigente en materia de sanidad e inocuidad
agroalimentaria y mejorarla permanentemente para mantener el reconocimiento a nuestros
estatus sanitario por parte de los mercados globales.
Respecto a los cultivos, lo más importante para el control y el manejo de sus plagas y
enfermedades es el diagnóstico oportuno de los agentes causales de los padecimientos. En
muchos casos, el diagnóstico puede tomar una hora [3]. En otros, la identificación puede
tardar de 5 a 7 días. Si la situación es muy alarmante, en casos donde toda la siembra se ve
afectada entonces es inminente un sistema que pueda hacer las evaluaciones directamente
en los predios y lo antes posible.
Problemática
Las pérdidas que ocasionan las plagas y enfermedades en los cultivos de los países
desarrollados se ubican entre 10 y 20 por ciento de la producción [4], convirtiéndose en uno
de los principales inconvenientes para los productores. Por ello, el diagnóstico y control de
enfermedades es uno de los retos más importantes en los sistemas de producción de plantas
cultivadas en el país.
Justificación
Las propiedades ópticas de las plantas no sólo varían en el tiempo en función del estado de
la planta, también varían en función de factores externos e internos [5]. Por lo tanto,
imágenes de las plantas pueden ser una fuente muy valiosa de información respecto a
cambios en el crecimiento del cultivo, estado nutricional, incidencia de enfermedades y
plagas, rendimiento y propiedades del suelo [6].
Los métodos usados en el diagnóstico de enfermedades idealmente deben de ser sencillos,
baratos, flexibles, preciso y exactos. Actualmente, los utilizados para prescripción mediante
síntomas son cualitativos o semi cuantitativos, y en su mayoría se basan en la evaluación
visual por algún experto. Mientras que muchas de estas técnicas han sido exitosamente
empleadas en el análisis y valoración de afecciones, existen estudios donde se demuestra la
arbitrariedad del ojo humano para la determinación de los síntomas [7].
Un sistema de visión computacional para diagnóstico de enfermedades en plantas de
invernaderos se está desarrollando en esta institución. Uno de los problemas principales a
los que se enfrenta este proyecto es trabajar en un ambiente real. En términos generales el
sistema debe realizar las siguientes acciones: a) obtener imágenes de la planta, b) reconocer
la hoja y, c) diagnosticarla, ver Figura 1.
Saludable
Enfermedad 1
Enfermedad 2
Figura 1. Proceso general del sistema de visión para diagnóstico de enfermedades en plantas
Tan sólo el proceso de reconocer la hoja involucra un gran problema ya que, en el
ambiente real, es muy difícil encontrar una hoja que se encuentre en las condiciones
óptimas que permitan obtener un alto porcentaje de reconocimiento, es decir, normalmente
nos encontraremos con ciertas limitantes como por ejemplo: hojas que están deformes,
que les hace falta una parte de sus orillas o se encuentren ocluidas por otra hoja.
Este proyecto pretende enfrentar este primer problema aplicando una metodología que
realice el reconocimiento de la hoja de la planta independientemente de las limitantes que
se mencionaron anteriormente.
Objetivo
Reconocer la forma geométrica de una hoja de una especie de planta para identificar
alteraciones en la misma, bajo un ambiente controlado de iluminación y fondo. Se
considerarán algunas limitantes presentes en el ambiente real (deformidades naturales y no
naturales de la hoja).
Cabe mencionar que en este proyecto no se pretende realizar clasificación de especies ni
detección de enfermedades de la planta, el último es nuestro trabajo futuro, por lo que
nuestro interés con este proyecto es perfeccionar el reconocimiento de la hoja para que sea
adaptable a situaciones que se presentan en el ambiente real.
Objetivos específicos
•
Adquirir imágenes de hojas de una especie de planta en un ambiente controlado de
iluminación y fondo.
•
Filtrar la imagen para mejorar la segmentación.
•
Identificar características geométricas relevantes para el reconocimiento de la forma
de la hoja.
•
Analizar la imagen para obtener las características geométricas relevantes para
caracterizar la observación.
•
Generar una base de conocimiento respecto a distintas observaciones de las hojas de
una especie de planta para comparar distintas escenas.
•
Entrenar una red neuronal y un sistema basado en modelos ocultos de Markov con
la base de conocimiento de las diversas observaciones a distintas hojas de una
especie de planta.
•
Implementar un sistema que entienda la imagen de una hoja de una especie de
planta y describa si pertenece o no a la especie de planta aprendida u observada.
• Evaluación del sistema bajo diferentes características de la hoja (con deformidades
naturales y no naturales). Así como con hojas de especies diferentes a la entrenada o
conocida.
Metodología
La metodología que se pretende seguir en el desarrollo de este proyecto se muestra a
continuación en el siguiente diagrama.
Suavizado
Ecualización
Procesamiento
Operaciones Morfológicas
Otsu
Segmentación
Canny
Extracción de
Características
Códigos de cadena
Contornos de Momento
Redes Neuronales
Reconocimiento
Modelos Ocultos de
Markov
Figura 2. Metodología
Procesamiento de la imagen
El procesamiento de la imagen es primordial en el desarrollo de este proyecto para mejorar
la calidad de las imágenes, un buen tratamiento de la imagen nos facilitará la obtención de
las características que nos permitan realizar el reconocimiento de la hoja.
En este proyecto se propone la aplicación de un filtro gaussiano [8], para la eliminación del
ruido de la imagen, y la aplicación de un realzado mediante histograma. El histograma de
una imagen es una función discreta que representa el número de pixeles en la imagen en
función de los niveles de intensidad.
El histograma es de gran utilidad en el tratamiento de imágenes ya que su manipulación
sirve para variar el aspecto de las imágenes y por tanto se puede utilizar para mejorar la
calidad de la imagen.
Segmentación
La segmentación es el proceso por el cual se extrae de la imagen cierta información
subyacente para su posterior uso. La segmentación está basada en dos principios
fundamentales: discontinuidad (orientada a bordes) y similitud (orientada a regiones).
En este proyecto nos interesa realizar una segmentación orientada a bordes y el algoritmo
que aplicaremos es el de Canny [9]. El algoritmo de Canny se fundamenta en la teoría de
operadores primera derivada y resulta particularmente interesante porque extrae bordes y
cierra los contornos evitando posibles rupturas de los mismos durante su extracción.
Extracción de características
Cuando las personas tratan de reconocer una planta ellas normalmente observan sus hojas,
sus flores, su fruto y su tallo, para poder extraer características discriminantes. Estas
características pueden ser directamente obtenidas con tan sólo observar las hojas, ya que
éstas contienen suficiente información para poder identificar a que especie de planta
pertenecen [10].
La asimetría, redondez, irregularidad del borde, diámetro e índice de alargamiento
(anisotropía) de la hoja son algunas características que distinguen a una especie de planta
de otra. Estas características pueden obtenerse de la imagen de una hoja a través de su
contorno.
En este proyecto se propone la utilización de dos descriptores de contorno, son los
siguientes:
a) Códigos de cadena. Se usan para representar una frontera como un conjunto de
segmentos con longitud y dirección especificadas.
b) Momentos: La forma de una representación unidimensional de un contorno a
través de función real, g(x), se puede escribir utilizando momentos estadísticos,
como la media, la varianza o momentos de orden superior. Dicha función puede ser
la signatura del contorno. En el caso de contornos abiertos, se puede utilizar la
función que se obtiene de las distancias de los puntos del contorno al segmento que
une los dos puntos extremos de dicho contorno.
Se eligieron estos descriptores porque son sencillos de implementar, obtienen buena
caracterización del contorno de la hoja y son utilizados en algunos de los trabajos revisados
brindándoles buenos resultados [11] [12] [13][14].
Reconocimiento
Red Neuronal
Es un grupo interconectado de neuronas artificiales que simulan el proceso de pensamiento
de un cerebro humano. Uno puede considerar una red neuronal como una caja negra
entrenada para obtener procesos inteligentes a través de la entrada y salida del flujo de
información. La ventaja de la utilización de una red neuronal aplicada en el reconocimiento
de formas es que el entrenamiento de la red es muy rápido y fácil.
HMM
Un modelo oculto de Markov (Hidden Markov Model HMM) es un proceso estocástico que
consta de un proceso de Markov no observado (oculto) q={qt} tєN y proceso observado
O={ot} tєN cuyos estados son dependientes estocásticamente de los estados ocultos, es decir,
es un proceso bivariado (q,o). Los HMM se pueden considerar también como sistemas
generativos estocásticos, los cuales se emplean en la modelación de series de tiempo
[15],[16].
Antecedentes
El reconocimiento de hojas de plantas ha sido objeto de estudio por muchos investigadores,
en la mayoría de los casos, con el fin principal de distinguir entre especies diferentes de
plantas; en seguida hablaremos un poco de los trabajos revisados que consideramos más
relevantes.
En [17] presentan un enfoque para extracción de las venas de una hoja, consideran que las
venas brindan información importante y discriminante en el reconocimiento de especies
de plantas.
El enfoque que proponen se basa en dos etapas, en la primer etapa realizan la
segmentación utilizando un histograma de intensidad de la imagen de la hoja para estimar
las regiones de pixeles que pertenecen a las venas; enseguida, la segunda etapa consiste en
reforzar la detección de la vena mediante el entrenamiento de una red neuronal que lleva a
cabo la clasificación de los pixeles en dos clases: venas y fondo.
Otro trabajo que realiza extracción de venas es presentado por [18] ellos proponen un
método de segmentación que combina la técnica snake con redes neuronales celulares, su
método tiene la ventaja de aplicar conocimiento a priori para mejorar la precisión y
robustez de la segmentación.
En [19] proponen un método de reconocimiento de hojas de plantas utilizando una red
neuronal que clasifica las hojas en 32 especies diferentes; el método primeramente procesa
las imágenes y extrae de ellas 12 características morfológicas las cuales, posteriormente,
son ortogonalizadas utilizando la técnica de Análisis de Componentes Principales (PCA de
sus siglas en inglés).
PCA es utilizado con la finalidad de reducir la dimensión del vector de entrada de la red
neuronal. Su algoritmo es rápido en ejecución, eficiente en reconocimiento y fácil de
implementar.
En [20] proponen un método que realiza el reconocimiento de hojas que se encuentran
parcialmente ocluidas utilizando el algoritmo de Watershed modificado. La idea básica del
algoritmo Watershed es que una imagen digital es considerada como una superficie
topográfica y el valor de cada pixel representa la elevación en ese punto.
Los bordes de los objetos son definidos como elevaciones altas y las regiones dentro del
objeto como elevaciones bajas. El objetivo principal de su trabajo es obtener un mejor
reconocimiento de las hojas en escenas naturales donde éstas, normalmente, se encuentra
ocluidas.
Un método de identificación de especies de plantas basado en una técnica de matching de
forma es propuesto por [21], proponen un algoritmo de programación dinámica modificado
(MDP) para realizar el matching de las formas y obtener el reconocimiento de las hojas de
las plantas, la ventaja de su algoritmo es su robustez ya que el reconocimiento es apropiado
no solo con hojas intactas sino también con aquellas que están distorsionadas o que son
parcialmente ocluidas.
El reconocimiento de hojas se ha abordado en la mayor parte de los trabajos utilizando
redes neuronales. En este proyecto proponemos utilizar, además de las redes neuronales, los
Modelos Ocultos de Markov (HMM) para llevar a cabo el reconocimiento y reforzar las
observaciones para el entrenamiento del modelo utilizando los siguientes métodos para
extracción de características: Momento de contornos y códigos de cadena.
Según [11] la clave en el reconocimiento de hojas es la obtención de características estables
que puedan distinguir las hojas como únicas; es por esto que creemos que las
características geométricas elegidas que son únicas de cada especie de hoja nos brindarán
un alto porcentaje de reconocimiento.
Calendarización
31-Ago-09
07-Sep-09
14-Sep-09
21-Sep-09
28-Sep-09 05-Oct-09
Propuesta
Análisis de Técnicas
Implementación de
Técnicas de
Procesamiento
Implementación de
Técnicas de Análisis
[Extracción]
Implementación de
Técnicas de Análisis
[Reconocimiento]
Integración
Verificación
Entrenamiento
12-Oct-09
Implementación de
Técnicas de
Análisis
[Extracción]
Implementación de
Técnicas de
Análisis
[Reconocimiento]
Integración
Verificación
Entrenamiento
Reconocimiento
Validación
Entrega
19-Oct-09
26-Oct-09
02-Nov-09
09-Nov-09
23-Nov-09
Avances
Siguiendo la calendarización presentada al inicio, este primer avance del proyecto abarca
hasta la implementación de las técnicas para procesamiento de la imagen; sin embargo,
decidimos adelantarnos en tiempos ya que el objetivo final, el reconocimiento del objeto,
nos tomará más tiempo del que habíamos planeado, por lo que incluimos en este avance
algunas de las técnicas para extracción de características que ya hemos implementado.
De acuerdo a la metodología planteada, las técnicas a implementar para detección de
contorno son: códigos de cadena de Freeman, Momentos y Descriptores de Fourier. Los
descriptores de Fourier ya no se implementarán en este proyecto ya que los dos métodos
restantes nos han dado buenos resultados en la descripción de la forma y nos son más útiles
en la obtención de las características discriminativas de las hojas, características que serán
entrada de nuestros dos métodos de reconocimiento planteados en la metodología.
La presentación del avance se estructura de la siguiente manera:
c) Estado del arte, revisión de otros trabajos para solución del problema en cuestión.
d) Descripción de técnicas implementadas para procesamiento y extracción de
características de la imagen.
e) Presentación de resultados
Estado del Arte
En la mayoría de los trabajos revisados se enfocan en la extracción de características
geométricas discriminantes de la hoja que permitan llevar a cabo un buen reconocimiento
de la misma, la hoja les brinda información importante para reconocimiento, clasificación y
detección de enfermedades de la planta.
El objetivo a largo plazo de este proyecto es llevar a cabo la detección de enfermedades de
una planta y es primordial, al igual que en otros trabajos, obtener características de la hoja
que permitan reconocerla y diagnosticarla independientemente de cómo se encuentre en el
ambiente.
Los trabajos que se han revisado desde la entrega del primer avance a la fecha se describen
a continuación.
Qingfeng Wu y otros [11] creen que el problema clave de reconocimiento de hojas, que
involucra a su vez el reconocimiento de plantas, es la extracción de características que sean
estables y puedan distinguir hojas individuales. Ellos extraen características de forma,
márgenes, dientes y venas para representar la hoja, estas características son la entrada de
una red neuronal que como salida obtiene el reconocimiento de la planta a la que pertenece.
Ellos extrajeron características visuales relacionadas al dominio de la hoja considerando
tres aspectos de la misma: la forma, los dientes y las venas.
De la forma de la hoja obtuvieron las siguientes características: delgadez, redondez y
solidez. El uso de momentos invariantes les ayudo en la obtención de las dos primeras
características. Del margen de la hoja y la forma de los dientes obtuvieron: tosquedad (del
margen de la hoja); tamaño, ángulo y nitidez (que tan afilado) del diente. De las venas de la
hoja obtuvieron las siguientes características: número de ramificaciones y el grado de
curvatura de la vena principal.
Con estas características entrenaron su red neuronal y obtuvieron muy buenos porcentajes
de reconocimiento para las pruebas realizadas con seis especies diferentes de plantas.
Z. Wang y otros [12], proponen un método de dos etapas para recuperar la imagen de la
hoja usando características de forma simple que incluyen: curva de distancia al centroide
del contorno (CCD), excentricidad e histograma de código de ángulos (ACH). En la primer
etapa, las imágenes que son disimilares con la imagen de búsqueda serán filtradas usando
excentricidad para reducir el espacio de búsqueda, en la segunda etapa la recuperación se
refinará al usar el grupo de las tres características antes mencionadas en el espacio de
búsqueda reducido.
El CCD sigue la misma idea que los códigos de cadena, es éstos el trazado del contorno se
realiza en una sola dirección tomando un punto de inicio fijo, la secuencia de puntos del
contorno se determina calculando la distancia R que existe del punto P al centroide C del
contorno y su ángulo.
Para el mismo punto de inicio, el contorno del objeto puede ser reconstruido usando una
curva CCD de esta forma un objeto de dos dimensiones puede ser representado por una
curva de una dimensión.
Las ondas en las hojas son una característica local importante para identificación de
especies de plantas por los humanos. En este trabajo utilizan un código de ángulos, en su
método cada contorno cerrado es representado por una secuencia de segmentos de línea
con dos segmentos de línea sucesivos formando un ángulo.
Con el fin de discretizar los ángulos construyen un histograma, de esta forma es más
sencillo el realizar un matching entre diferentes contornos.
Este trabajo realizó pruebas con 1400 imágenes de hojas y según lo publicado obtuvieron
resultados razonablemente buenos.
En Du [13], obtienen características geométricas de una gran base de datos de hojas de
plantas con el fin de reconocer la planta utilizando un clasificador hiperesfera MMC
(Move Median Center). El método que ellos proponen es más robusto que los basados en
características de contorno.
Las características geométricas que utilizan son:
rectangularidad, perímetro, área, esfericidad, circularidad, excentricidad, factor de forma y
momentos invariantes de la hoja.
La idea del clasificador hiperesfera que ellos proponen es que cada clase de patrones son
considerados como una serie de hiperesferas las cuales son tratadas como un grupo de
puntos en los métodos convencionales.
El algoritmo trabaja, en breves palabras, de la siguiente manera: calcula la mediana
multidimensional de la clase, encuentra el radio que puede abarcar los puntos de la clase,
realiza un número determinado de iteraciones para eliminar el centro de la hiperesfera con
el fin de ampliarla y abarcar tantos puntos como sea posible.
Una vez que el algoritmo encuentra la hiperesfera más grande, los puntos dentro de ésta son
eliminados y el procedimiento completo es repetido para los puntos restantes de la clase. El
paso final es remover las hiperesferas redundantes, las cuales son abarcadas por una
hiperesfera más grande.
Zagrouba y otros [14] presentan un método para reconocimiento de melanomas, extraen
características discriminantes de imágenes de lesiones de piel para diferenciar entre una
lesión benigna de una maligna (melanoma), las características que ellos extraen son las
siguientes: Asimetría, irregularidad del borde, variación del color, diámetro e índice de
alargamiento (anisotropía).
Las características antes mencionadas son entrada a una red neuronal con arquitectura
perceptrón monocapa . Este trabajo, aunque no trata el problema de reconocimiento de
hojas, nos fue útil porque algunas de las características discriminativas de una lesión de piel
también se presentan en las hojas, como son: la asimetría, el alargamiento (dependiendo de
la especie de plantas unas están más largas que otras), la compacidad y la irregularidad del
borde.
Técnicas
Procesamiento de Imagen
Suavizado
Aún cuando el ambiente es controlado, existen pequeños disturbios por lo que se empleo un
suavizado. A diferencia de Matlab, OpenCV crea pixeles "virtuales" fuera de la imagen, en
las fronteras, para producir imágenes de salida del mismo tamaño que la de entrada o para
no afectar el filtrado de los pixeles de los bordes de la imagen.
El suavizado por una Gaussiana es el más útil, aunque no el más rápido. En vista que la
imagen de entrada es buena solo deseamos eliminar el poco ruido que podría estar en la
imagen debido a pequeños cambios en el ambiente. Por esta razón se implementó un
desenfoque simple, el cual es el suavizado más sencillo y rápido que OpenCV soporta.
Cada píxel en la salida es la media simple de todos los píxeles en una ventana alrededor del
píxel correspondiente en la entrada.
Figura 3. Comparación suavizado por una Gaussiana (centro) y desenfoque simple (derecha).
Ecualización por Histograma
Las cámaras por lo general deben enfrentarse no sólo al contraste en una escena, sino
también a la exposición de sus sensores a la luz de la escena. En una cámara normal, la
obturación y apertura del lente oscilan entre exponer poco o demasiado los sensores a la
luz. A menudo el rango de contrastes es muy amplio para los sensores, por lo que existe un
trade-off entre la captura de las áreas oscuras (por ejemplo, las sombras) que requiere más
tiempo de exposición, y las áreas brillantes, que requieren menor exposición para evitar la
saturación de “nublados”.
Por lo que una forma de lidiar con este trade-off es tratar de ampliar el rango dinámico de la
imagen, para lo que la técnica más común es la ecualización por histograma. [22]
Operaciones Morfológicas
Por último, después de la eliminación de ruido, buscaremos el aislamiento de los elementos
individuales, y la unión de elementos dispares en la imagen, de forma que emplearemos las
transformaciones morfológicas más simples, dilatación y erosión []. Para preservar el área
de regiones conectadas con más precisión, se implementaron las operaciones de apertura y
cierre.
Figura 4. Comparación de la operación de apertura (centro) y de cierre (derecha).
El cierre se utiliza en la mayoría de los algoritmos de componentes conectados para reducir
los segmentos no deseados o generados por el ruido. En la implementación encontramos
que las regiones brillantes se mantuvieron unidas, pero conservando su tamaño básico.
Figura 5. Operación de cierre.
La operación de apertura es empleada a menudo para separar elementos que se encuentren
muy cerca entre ellos en la imagen. Por su parte, en el proyecto se encontró que las
pequeñas regiones brillantes, causadas por la fuente de luz, fueron eliminadas, y el resto de
regiones brillantes fueron aislados manteniendo su tamaño.
Figura 6. Operación de apertura.
Parte fundamental de este trabajo es encontrar los componentes conectados, por lo que la
operación de cierre se realiza primero para eliminar los elementos que surgen
exclusivamente del ruido y luego la operación de apertura se utiliza para conectar las
regiones cercanas más grandes.
Segmentación
Otsu
Con frecuencia se realizan distintas etapas durante los pasos de procesamiento de imagen y
llega un punto en el cual se desea hacer una decisión final sobre los píxeles de la imagen o
rechazar categóricamente esos píxeles por debajo o por encima de cierto valor,
manteniendo los demás [23]. Se eligió el método de umbralización de Otsu [24] ya que en
[25] se recomendó por aportar información útil para extracción de características y
caracterización de la hoja.
Canny
Finalmente se aplica un algoritmo de detección de bordes con la intensión de resumir la
binarización de la imagen en información útil para encontrar contornos. El algoritmo de
Canny trata de reunir los posibles pixeles de borde en contornos. Dichos contornos se
forman mediante la aplicación última de un umbral de histéresis a los píxeles.
Extracción de Características
Hasta este punto hemos encontrado los píxeles del borde que separan a los distintos
segmentos de una imagen, sin embargo esto no aporta nada sobre los bordes de las
entidades en sí mismas. El siguiente paso es reunir los píxeles del borde en contornos.
Un contorno es una lista de puntos que representan una curva en una imagen. Esta
representación puede ser diferente dependiendo de la escena o circunstancia [26]. En
OpenCV los contornos son representados por secuencias en las que cada entrada en la
secuencia codifica la información sobre la ubicación del siguiente punto de la curva.
Códigos de Cadena
Normalmente, los contornos se pueden representar como una secuencia de vértices. Una
representación alternativa puede ser las cadenas de Freeman [27]. Con una cadena de
Freeman, un polígono es representado como una secuencia de pasos en una de las ocho
direcciones, cada paso es designado por un número entero de 0 a 7. Las cadenas de
Freeman tienen aplicaciones útiles en el reconocimiento y otros contextos.
Figura 7. Cadenas de Freeman.
Momentos
Una de las maneras más simples para comparar dos curvas es calcular los momentos de
contorno. En términos generales, un momento es una característica del contorno calculado
mediante la integración sobre todos los píxeles del contorno.
El cálculo de momentos proporciona algunas características elementales de un contorno
que se puede utilizar para comparar dos curvas. Sin embargo, los momentos por sí mismos
no son los mejores parámetros para este tipo de comparaciones, en la mayoría de los casos
prácticos.
Usualmente, se utilizan los momentos normalizados, de modo que los objetos de la misma
forma pero diferentes tamaños proporcionen valores similares. Del mismo modo, los
momentos simples dependen del sistema de coordenadas elegido, lo que significa que los
objetos no se comparan correctamente si se rotan.
Resultados
Los resultados muestran un programa* que obtiene el contorno de la hoja. Así mismo, se
muestra un punto correspondiente al centro geométrico obtenido a partir de los momentos.
Respecto al trabajo futuro, cabe señalar que las imágenes presentadas como resultado
muestran deformidades en el contorno debido a la sombra. Sin embargo, el trabajo a
realizar será más sobre el diseño del experimento para mantener controlado el ambiente.
Por otra parte, la continuación del proyecto llevará a cabo la extracción de más
características geométricas así como el entrenamiento de la red neuronal y el modelado de
los procesos ocultos de Markov.
*
Ver Anexo I
Anexo I – Código
//=======================================================================
// System Includes
//=======================================================================
#include <assert.h>
#include <stdio.h>
#include <sys/timeb.h>
#include <memory.h>
//=======================================================================
// Project Includes
//=======================================================================
#include "cv.h"
#include "highgui.h"
#include "PGRFlyCapture.h"
//=======================================================================
// FireFly Constants
//=======================================================================
#define FILENAME "img.bmp"
// The maximum number of cameras on the bus.
#define MAX_CAMS
1
// The index of the camera to grab from.
#define CAMERA_INDEX 0
// The image resolution
#define WIDTH 640 // Columns
#define HEIGHT 480
// Rows
// The image pixel size in bytes
#define PIXEL 4
//=======================================================================
// OpenCV Constants
//=======================================================================
#define CVCONTOUR_APPROX_LEVEL 2
#define CVCLOSE_ITR 1
#define PERIM_SCALE 8
//=======================================================================
// FireFlye variables
//
http://www.ptgrey.com/support/downloads/documents/flycapture/flycapture_s
tart.htm
//=======================================================================
FlyCaptureImage frame;
FlyCaptureImage image;
FlyCaptureContext context;
FlyCaptureError error;
FlyCaptureInfo info;
//=======================================================================
// OpenCV variables
// file:///C:/Program%20Files/OpenCV/docs/index.htm
// file:///C:/Program%20Files/OpenCV1.2/doc/index.htm
//=======================================================================
IplImage *cvImage = 0;
IplImage *out_rgb = 0;
IplImage *out_gray = 0;
// Contours variables
CvMemStorage* storage = cvCreateMemStorage(0);
CvContourScanner scanner;
CvSeq* contour = 0;
CvSeq* contours = 0;
// Moments variables
CvMoments moments;
double M00;
double M01;
double M10;
//=======================================================================
// Function prototypes
//=======================================================================
void init();
//=======================================================================
// OpenCV function prototypes
//=======================================================================
void processImage();
void segmentImage();
void featureExtraction();
//=======================================================================
// FireFly function prototypes
//=======================================================================
int startFireFly();
int stopFireFly();
int grabFireFly();
int saveFireFly();
void reportError(FlyCaptureError error, char* fname);
//=======================================================================
// main Description:
//
Function to
//=======================================================================
int main( int argc, char** argv ) {
struct _timeb
timeStart;
struct _timeb
timeFinish;
cvNamedWindow( "Camera", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "Output", CV_WINDOW_AUTOSIZE );
if( startFireFly() )
{
init();
while(true)
{
//=================================================================
// Start
//=================================================================
_ftime( &timeStart );
if (grabFireFly())
{
processImage();
segmentImage();
cvZero(out_rgb);
cvDrawContours( out_rgb, contours,
CV_RGB(255,255,0), CV_RGB(255,255,255),1);
featureExtraction();
cvCircle(out_rgb, cvPoint(
(int)(M10/M00),(int)(M01/M00) ), 1, cvScalar(255,0,255), 2);
}
_ftime( &timeFinish );
//=================================================================
// End
//=================================================================
#ifdef WIN64
__time64_t uiTime =
#else
unsigned int uiTime =
#endif
(unsigned int) (60000 /( ( timeFinish.time * 1000 +
timeFinish.millitm ) - ( timeStart.time * 1000 + timeStart.millitm ) ) );
printf("%u fps\n", uiTime);
cvShowImage( "Camera", cvImage);
cvShowImage( "Output", out_rgb );
if( cvWaitKey( 10 ) >= 0 )
break;
}
}
stopFireFly();
// Destroy the window previously created
cvDestroyWindow("Camera");
//cvDestroyWindow("Output");
return 0;
}
//=======================================================================
// init Description:
//
Function to initialize
//=======================================================================
void init()
{
frame.pData = new unsigned char[ WIDTH * HEIGHT * PIXEL ];
// From grabFireFly()
image.pData = new unsigned char[ WIDTH * HEIGHT * PIXEL ];
cvImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 3 );
// From preProcess()
out_rgb = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 3 );
out_gray = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 );
}
//=======================================================================
// processImage Description:
//
Function to process the cvImage
//=======================================================================
void processImage()
{
//out_rgb = cvCreateImage( cvSize(cvImage->width,cvImage->height),
IPL_DEPTH_8U, 3 );
// Smooth
cvSmooth(cvImage, out_rgb, CV_BLUR, 5, 5);
// Grayscale
//out_gray = cvCreateImage( cvSize(cvImage->width,cvImage->height),
IPL_DEPTH_8U, 1 );
cvCvtColor( out_rgb, out_gray, CV_BGR2GRAY );
// Equalization
cvEqualizeHist( out_gray, out_gray );
// Morphological open and closing operations
cvMorphologyEx( out_gray, out_gray, 0, 0, CV_MOP_OPEN, CVCLOSE_ITR
);
cvMorphologyEx( out_gray, out_gray, 0, 0, CV_MOP_CLOSE, CVCLOSE_ITR
);
}
//=======================================================================
// segmentImage Description:
//
Function to segment the cvImage
//=======================================================================
void segmentImage()
{
// Thresholding - Otsu
cvThreshold(out_gray,out_gray,0,160,CV_THRESH_OTSU);
// Thresholding - Canny
cvCanny(out_gray,out_gray,0,160);
}
//=======================================================================
// featureExtraction Description:
//
Function to extract features from the cvImage
//=======================================================================
void featureExtraction()
{
// Retrieves all the contours and puts them in the list.
// Compresses horizontal, vertical, and diagonal segments, leaving
only their ending points.
scanner = cvStartFindContours(out_gray, storage, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE );
int numCont = 0;
while( (contour = cvFindNextContour( scanner )) != NULL )
{
double len = cvContourPerimeter( contour );
// calculate perimeter len threshold:
double q = (out_gray->height + out_gray->width) /
PERIM_SCALE;
//Get rid of blob if its perimeter is too small:
if( len < q )
{
cvSubstituteContour( scanner, NULL );
} else
{
// Smooth its edges if its large enough
CvSeq* new_contour;
// Polygonal approximation - Douglas-Peucker
approximation algorithm
new_contour = cvApproxPoly(contour, sizeof(CvContour),
storage, CV_POLY_APPROX_DP, CVCONTOUR_APPROX_LEVEL, 0);
// Convex Hull of the segmentation
//new_contour = cvConvexHull2( contour, storage,
CV_CLOCKWISE, -1);
cvSubstituteContour( scanner, new_contour );
numCont++;
}
}
contours = cvEndFindContours( &scanner );
// Moments
cvMoments(out_gray,&moments);
M00 = cvGetSpatialMoment(&moments,0,0);
M10 = cvGetSpatialMoment(&moments,1,0);
M01 = cvGetSpatialMoment(&moments,0,1);
}
//=======================================================================
// grabFireFly Description:
//
Function to grab a frame with the FireFly
//=======================================================================
int grabFireFly()
{
// Start grabbing images.
error = flycaptureGrabImage2( context, &frame );
if (error != 0 )
{
reportError(error,"flycaptureGrabImage2");
return 0;
}
// Convert the image.
//image.pData = new unsigned char[ frame.iCols * frame.iRows * 4 ];
image.pixelFormat = FLYCAPTURE_BGR;
error = flycaptureConvertImage( context, &frame, &image);
if (error != 0 )
{
reportError(error,"flycaptureConvertImage");
return 0;
}
//cvImage = cvCreateImage( cvSize(image.iCols, image.iRows),
IPL_DEPTH_8U, 3 );
cvImage->widthStep = image.iRowInc;
cvImage->imageData = (char *) image.pData;
return 1;
}
//=======================================================================
// startFireFly Description:
//
Function to start the FireFly connection
//=======================================================================
int startFireFly()
{
if (MAX_CAMS > 1)
{
// Enumerate the cameras on the bus.
FlyCaptureInfoEx arInfo[ MAX_CAMS ];
unsigned int
uiSize = MAX_CAMS;
error = flycaptureBusEnumerateCamerasEx( arInfo, &uiSize );
if (error !=0)
{
reportError(error, "flycaptureBusEnumerateCameras");
return 0;
}
for( unsigned int uiBusIndex = 0; uiBusIndex < uiSize;
uiBusIndex++ )
{
FlyCaptureInfoEx* pinfo = &arInfo[ uiBusIndex ];
printf(
"Index %u: %s (%u)\n",
uiBusIndex,
pinfo->pszModelName,
pinfo->SerialNumber );
}
}
// Create the context.
error = flycaptureCreateContext(&context);
if (error != 0)
{
reportError(error, "flycaptureCreateContext");
return 0;
}
// Initialize the camera.
error = flycaptureInitialize(context, CAMERA_INDEX);
if (error != 0)
{
reportError(error, "flycaptureInitialize");
return 0;
}
// Get the info for this camera.
error = flycaptureGetCameraInformation(context, &info);
if (error != 0)
{
reportError(error,"flycaptureGetCameraInformation");
return 0;
}
if (info.CameraType ==
FlyCaptureCameraType::FLYCAPTURE_BLACK_AND_WHITE)
{
printf("B&W %s s/n %d\r\n",info.pszModelString,
info.SerialNumber);
}
else if (info.CameraType == FlyCaptureCameraType::FLYCAPTURE_COLOR)
{
printf("Colour %s s/n %d\r\n",info.pszModelString,
info.SerialNumber);
}
// Start FlyCapture.
error = flycaptureStart(context,
FlyCaptureVideoMode::FLYCAPTURE_VIDEOMODE_ANY,
FlyCaptureFrameRate::FLYCAPTURE_FRAMERATE_ANY);
if (error != 0)
{
reportError(error,"flycaptureStart");
return 0;
}
return 1;
}
//=======================================================================
// stopFireFly Description:
//
Function to stop the FireFly connection
//=======================================================================
int stopFireFly()
{
// Stop FlyCapture.
error = flycaptureStop(context);
if (error != 0)
{
reportError(error, "flycaptureStop");
return 0;
}
printf("Disconnected.");
// Destroy the context.
error = flycaptureDestroyContext( context );
if (error != 0)
{
reportError(error, "flycaptureDestroyContext");
return 0;
}
delete [] image.pData;
return 1;
}
//=======================================================================
// saveFireFly Description:
//
Function to save a frame with the FireFly
//=======================================================================
int saveFireFly()
{
// Save the converted image to disk.
error =
flycaptureSaveImage(context,&image,FILENAME,FLYCAPTURE_FILEFORMAT_BMP );
if (error != 0 )
{
reportError(error,"flycaptureSaveImage");
return 0;
}
return 1;
}
//=======================================================================
// reportError Description:
//
Function to return error code
//=======================================================================
void reportError(FlyCaptureError error, char* fname)
{
fprintf(stderr, "%s error:
\"%s\"\r\n",fname,flycaptureErrorToString(error));
return;
}
Referencias
Las figuras 3 - 7 fueron obtenidas del libro Learning OpenCV, Computer Vision with the
OpenCV Library, Gary Bradski y Adrian Kaebler, O’Reilly 2008.
[1] El País - Uruguay. "Crisis alarmante", El País. Montevideo: May 11, 2008.
[2] INEGI Estadísticas, ANUIES Anuarios estadísticos, 2002.
[3] L. Y. Del Valle, "Con su CDT los cultivos" El Nuevo Día. San Juan, Puerto Rico: Feb 7,
2008.
[4] E. C. Oerke, H. W. Dehne, F. Shoenbeck, A. Weber. Crop Protection and Crop
Production. Amsterdam. Elsevier. 1994
[5] G. Guyot, “Optical properties of vegetation canopies”, Applications of Remote Sensing
in Agriculture, M.D. Steven and J.A. Clark (Eds), pp. 19–43, 1990.
[6] Y. J. Lee, K. W. Chang, Y. Shen, T. M. Huang, H. L. Tsay, “A handy imaging system
for precision agriculture studies”, International Journal of Remote Sensing, vol. 28 no. 21,
pp. 4867 - 4876, 2007.
[7] D. P. Martin, E. P. Rybicki, Microcomputer-based quantification of maize streak virus
symptoms in Zea mays. Phytopathology, vol. 88, pp. 422-427, 1998.
[8] G. Pajares G., J. De la Cruz. Visión por computador, imágenes digitales y aplicaciones.
Editorial Ra-Ma. 2002.
[9] J. Canny. A Computational Approach to Edge Detection. IEEE Trans. on Pattern
Analysis and Machine Intelligence, vol. 8 no. 6, pp. 679-698, 1986.
[10] T.E. Weier, C. R. Stocking, et al. : Botany: An Introduction to Plant Biology. John
Wiley and Sons(1982)
[11] Wu Qingfeng, Lin Kunhui Lin , Zhou Changl. Feature extraction and automatic
recognition of plant leaf using artificial neural network. The 2nd International Conference
on Computer Science & Education (ICCSE’2007), pp.47-50 ISTP BGQ59, 2007
[12] Wang, Z., Chi, Z. and Feng. Shape based leaf image retrieval. Image Signal Process
150, 34-43, Diciembre 2003.
[13] J.-X. Du, X.-F. Wang, and G.-J. Zhang. Leaf shape based plant species recognition.
Applied Mathematics and Computation, vol. 185, 2007.
[14] E. Zagrouba , W. Barhoumi. A prelimary approach for the automated recognition of
malignant melanoma, Image Analysis and Stereology Journal, 23(2), pp. 121–135, 2004.
[15] L.R. Rabiner, B.H Juang. An introduction to hidden Markov Models, IEEE ASSP
Mag., vol. 3, no. 1, pp. 4-16, 1986.
[16] L. R. Rabiner. "A tutorial on hidden Markov models and selected applications in speech
recognition". Proceedings of the IEEE, vol. 77 no. 2, pp. 257–286, 1989.
[17] Hong Fu , Zheni Chi. A two-stage approach for leaf vein extraction. Neural Networks
and Signal Processing, 2003. Proceedings of the 2003 International Conference on vol. 1,
pp. 208 – 211, 2003.
[18] YunFeng Li, QingSheng Zhu,
YuKun Cao, Cheng Liang Wang. A Leaf Vein
Extraction Method Based On Snakes Technique. Neural Networks and Brain, 2005.
ICNN&B '05. International Conference on vol. 2, pp. 885 – 888, 2005.
[19] S.G. Wu , F.S. Bao , E.Y Xuan Wang , Yi-Fan Chang, Qiao-Liang Xiang. A Leaf
Recognition Algorithm for Plant Classification Using Probabilistic Neural Network. Signal
Processing and Information Technology, 2007 IEEE International Symposium on pp. 11 16, 2007
[20] W. S. Lee, D. C. Slaughter. Recognition partially occluded plant leaves of using a
modified Watershed algorithm. Transactions of the ASAE, ISSN 0001-2351, vol. 47, no. 4,
pp. 1269-1280, 2004.
[21] Ji-Xiang Du, De-Shuang Huang, Xiao-Feng Wang, Xiao Gu. Computer-aided plant
species identification (CAPSI) based on leaf shape matching technique.Transactions of the
Institute of Measurement and Control, vol. 28 no.3,pp. 275, 2006.
[22] A. A. Schwarz, J. M. Soha. Multidimensional histogram normalization contrast
enhancement. Proceedings of the Canadian Symposium on Remote Sensing, pp. 86–93,
1978.
[23] M. Sezgin, B. Sankur. Survey over image thresholding techniques and quantitative
performance evaluation. Journal of Electronic Imaging, vol. 13 pp. 146–165, 2004.
[24] N.A. Otsu. Threshold selection method from gray-level histograms. IEEE Trans.
System Man Cybernet, vol. 9 no. pp 62–66, 1979.
[25] Xiao-Feng Wang, Ji-Xiang Du, Guo-Jun Zhang. Recognition of Leaf Images Based on
Shape Features Using a Hypersphere Classifier. Applied Mathematics and Computation.
vol. 205 pp. 916-926, 2008.
[26] S. Suzuki, K. Abe. Topological structural analysis of digital binary images by border
following. Computer Vision, Graphics and Image Processing, vol. 30pp. 32–46, 1985.
[27] H. Freeman. On the classification of line-drawing data. Models for the Perception of
Speech and Visual Form, pp. 408–412, 1967.
Descargar