Dpto. de Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Aplicaciones de Visión por Computador en Farmacia Hospitalaria Proyecto Fin de Carrera Autor: Julián Ávalos Juárez Director: José María Maestre Torreblanca Sevilla, Marzo 2016 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA AUTOR: Ávalos Juárez, Julián DIRECTOR: Maestre Torreblanca, José María ENTIDAD COLABORADORA: Hospital Universitario Reina Sofía, Córdoba RESUMEN DEL PROYECTO Hoy en día, se antoja necesario tener un control actualizado sobre los activos de la farmacia de un hospital. Por ello, se realizan inventarios constantemente para llevar a cabo una adecuada gestión de stocks, que permita, por una parte, satisfacer las necesidades sanitarias de los pacientes internos y de las consultas externas del hospital de una manera eficiente, y por la otra optimizar el coste económico que ello supone. Sin embargo, realizar estos inventarios con una frecuencia mayor que la deseada, supone el empleo de horas de trabajo del personal del hospital. Estas horas de trabajo podrían reducirse con la ayuda de técnicas de visión por computador que realicen tareas, tales como, la contabilización del número de unidades de un medicamento disponible, a través de una simple fotografía. Éste es, de hecho, el objetivo del presente proyecto: el estudio y aplicación de técnicas de visión por computador en la farmacia hospitalaria, que permitan al personal farmacéutico la realización de otras tareas gracias a las facilidades que estas técnicas proporcionan. Para llevar a cabo este estudio, hemos contado con la colaboración del servicio de farmacia del Hospital Universitario Reina Sofía de Córdoba. 2 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA COMPUTER VISION APPLICATIONS IN HOSPITAL PHARMACY AUTHOR: Ávalos Juárez, Julián DIRECTOR: Maestre Torreblanca, José María COOPERATING ENTITY: Hospital Universitario Reina Sofía, Córdoba PROJECT SUMMARY Hospitals need nowadays to improve their inventory management at the pharmacy to save costs while guaranteeing the satisfaction of the clinical needs. Image processing techniques can be helpful in this regard and in this project they are applied to help two Spanish hospitals, Reina Sofía and San Juan de Dios, with the inventory management of their pharmacies. 3 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA ÍNDICE GENERAL CAPÍTULO 1: STOCKS E INVENTARIOS .......................................................................................6 1.1 CONCEPTO DE STOCK ..................................................................................................... 7 1.2 CONCEPTO DE INVENTARIO .......................................................................................... 7 1.3 GESTIÓN DE STOCKS ....................................................................................................... 8 CAPÍTULO 2: INTRODUCCIÓN A LA VISIÓN POR COMPUTADOR ...............................................9 2.1 OBJETIVO DE LA VISIÓN ARTIFICIAL .............................................................................. 10 2.2 REPRESENTACIÓN DE LA REALIDAD .............................................................................. 10 2.2.1 IMÁGENES ............................................................................................................ 10 2.2.2 ESCENAS 3D.......................................................................................................... 11 2.2.3 SECUENCIAS ANIMADAS ....................................................................................... 11 2.3 ETAPAS DE UN SISTEMA DE VISIÓN .............................................................................. 12 CAPÍTULO 3: VISIÓN POR COMPUTADOR EN MATLAB ........................................................... 13 3.1 INTRODUCCIÓN ............................................................................................................ 14 3.2 IMAGE PROCESSING TOOLBOX ..................................................................................... 14 3.2.1 FILTRADO Y REALZADO DE IMÁGENES .................................................................. 17 3.2.2 SEGMENTACIÓN DE IMÁGENES ............................................................................ 23 3.2.2 CLASIFICACIÓN Y RECONOCIMIENTO .................................................................... 28 3.3 COMPUTER VISION SYSTEM TOOLBOX ......................................................................... 29 3.3.1 PUNTOS DE INTERÉS ............................................................................................. 30 3.3.2 DETECTOR SURF ................................................................................................... 30 CAPÍTULO 4: ADQUISICIÓN DE IMÁGENES ............................................................................. 40 4.1 ADQUISICIÓN DE IMÁGENES CON WEBCAM ................................................................. 41 4.2 ADQUISICIÓN DE IMÁGENES CON KINECT..................................................................... 43 CAPÍTULO 5: APLICACIÓN AL CONTEO DE UNIDOSIS .............................................................. 46 5.1 SERVICIO DE FARMACIA ............................................................................................... 47 5.2 DISTRIBUCIÓN UNIDOSIS DE MEDICAMENTOS ............................................................. 48 5.3 CONTEO AUTOMATIZADO DE UNIDOSIS ....................................................................... 51 5.3.1 CASO SENCILLO .................................................................................................... 52 5.3.2 CASO GENERALIZADO ........................................................................................... 57 4 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.3.3 EJEMPLOS............................................................................................................. 63 CAPÍTULO 6: APLICACIÓN AL CONTEO DE CAJAS .................................................................... 71 6.1 INTRODUCCIÓN ............................................................................................................ 72 6.2 CONTEO DE CAJAS EN DOS DIMENSIONES .................................................................... 72 6.3 CONTEO DE CAJAS EN TRES DIMENSIONES ................................................................... 89 6.3.1 EJEMPLOS............................................................................................................. 96 6.3.2 CONTEO DE CAJAS CON KINECT .......................................................................... 109 CAPÍTULO 7: CONCLUSIONES................................................................................................ 123 7.1 CONCLUSIONES .......................................................................................................... 124 BIBLIOGRAFÍA....................................................................................................................... 125 5 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 1 STOCKS E INVENTARIOS 6 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 1.1 CONCEPTO DE STOCK Stock es una palabra de origen inglés, y según el diccionario de la RAE se refiere a existencias (f. pl. Mercancías destinadas a la venta, guardadas en un almacén o tienda). Algunos libros traducidos al castellano de originales anglosajones, emplean la palabra inventarios en lugar de stocks. No obstante, en este proyecto nos estaremos refiriendo a existencias en cada mención a dicho anglicismo. Si queremos profundizar un poco más en cuanto al significado de stock que nos concierne, podemos consultar otros autores. Por ejemplo, para Parra (2005), “stock es un término que indica un depósito de mercancías, materias primas u otro objeto cualquiera. Es un concepto estático” [1], mientras que otros autores como Rambaux (1988), definieron los stocks como “provisiones de artículos en espera para su utilización” [2], aunque esta definición no presenta a los stocks como bienes económicos que son. No ocurre lo mismo con la expresión “gestión de stocks”, que es un proceso que no se detiene en el tiempo, sino que supone una actividad continuada. Es un concepto dinámico. 1.2 CONCEPTO DE INVENTARIO Análogamente al apartado anterior, el diccionario de la RAE define inventario como (m. Asiento de los bienes y demás cosas pertenecientes a una persona o comunidad, hecho con orden y precisión). Es decir, realizar un inventario sobre los elementos existentes en la farmacia de un hospital, consistirá en saber qué cantidad de medicamentos se encuentran disponibles físicamente en dicha farmacia. Como hemos dicho anteriormente, nosotros no nos referiremos a inventario como a stock, sino en resumidas cuentas, como al proceso de determinar cuál es el stock del que disponemos en la farmacia. La realización de inventarios es algo muy importante para tener un control real sobre los activos de la farmacia. 7 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 1.3 GESTIÓN DE STOCKS Actualmente, se ha llegado a la conclusión de que el hecho de almacenar existencias supone un alto coste. En este sentido, Parra (2005), se refiere a la expresión Gestión de Stock Cero o el Just in Time [1]. El objetivo de la farmacia debe ser, por tanto, mantener el volumen de stock al más bajo nivel, compatible con el suministro regular de las necesidades del hospital. Los objetivos a conseguir deben ser [5], [27]: Minimizar el importe económico de los medicamentos almacenados en el hospital Minimizar las roturas de stock Procurar una eficiente utilización de los recursos Satisfacer las necesidades de los pacientes y hacerlo de una manera cómoda Para llevar a cabo la gestión de los activos del hospital, el personal farmacéutico debe realizar inventarios de manera periódica. En dichos inventarios, se informará del valor numérico real de las existencias de los distintos tipos de medicamentos, en ese instante en concreto. Estas tareas de inventarios suelen resultar bastante tediosas, y son llevadas a cabo por el propio personal farmacéutico del hospital. Al emplear tiempo útil de trabajo en estas tareas, se resta tiempo a otras en las que sí que son necesarios conocimientos farmacéuticos, por lo que se produce un gasto de tiempo innecesario. Por tanto, la máxima automatización posible se antoja fundamental para ahorrar tiempos y un mejor funcionamiento del sistema farmacéutico. La visión por computador puede resultar importante en este ámbito, y esto es lo que desarrollaremos en los próximos capítulos. 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 2 INTRODUCCIÓN A LA VISIÓN POR COMPUTADOR 9 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 2.1 OBJETIVO DE LA VISIÓN ARTIFICIAL La visión artificial tiene como finalidad la extracción de información del mundo físico a partir de imágenes, utilizando para ello un ordenador. Se trata de un objetivo ambicioso y complejo que actualmente se encuentra en una etapa primitiva [11]. 2.2 REPRESENTACIÓN DE LA REALIDAD Un sistema de visión artificial debe actuar sobre una representación de la realidad que le proporciona información sobre propiedades como el brillo, colores o las formas. Estas representaciones pueden presentarse en forma de imágenes estáticas, escenas tridimensionales o imágenes en movimiento. 2.2.1 IMÁGENES Una imagen bidimensional es una función que, a cada par de coordenadas (x,y), asocia un valor relativo a alguna propiedad del punto que representa, como por ejemplo, el brillo o el matiz. Es decir, una imagen digital acromática o en escala de grises, puede ser representada por una matriz cuyas celdas se corresponden con los píxeles de la misma. Cada elemento de la matriz puede dar información sobre el brillo o el matiz de cada píxel de la imagen. Existen diversas formas de representar digitalmente imágenes en color. La más común es la representación RGB. Tal y como se muestra en la Figura 1, una imagen RGB puede representarse asociando a cada punto, una terna de valores que indica la intensidad de tres planos (rojo, verde y azul). En este caso, son necesarias tres matrices para la representación de una imagen a color RGB, cada una de las cuales representa la intensidad de cada plano de color para cada píxel de la imagen. 10 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 1. Descomposición RGB [9]. 2.2.2 ESCENAS 3D Otra posible forma de representación de la realidad, consiste en asignar a cada punto del espacio que pertenece a un objeto (x,y,z), una propiedad del punto. Al trabajar con imágenes 3D, como se tiene la forma de los objetos, la información de brillo y color puede no ser tan relevante. 2.2.3 SECUENCIAS ANIMADAS Un punto con suficiente brillo que parpadea a una frecuencia superior a 25 pulsos por segundos, es distinguido por nuestros sentidos como un punto fijo. Cuando se representan sucesiones de imágenes estáticas, a una frecuencia superior a 25 pps, el sistema visual humano no es capaz de distinguir el cambio y lleva a la (errónea) interpretación de movimiento, consiguiéndose el efecto de secuencia animada al que nos referimos. 11 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 2.3 ETAPAS DE UN SISTEMA DE VISIÓN Diferentes estudios han comprobado que, el ser humano captura la luz a través de los ojos y que esta información circula a través del nervio óptico, llegando al cerebro y procesándose en éste. La visión artificial, en un intento de reproducir digitalmente este comportamiento, define cuatro etapas o fases: La primera etapa, se trata de una etapa completamente sensorial. Consiste en la captura o adquisición de las imágenes digitales, típicamente con un CCD (dispositivo de carga acoplada). En las cámaras digitales, un CCD es un sensor con diminutas células fotoeléctricas que registra las imágenes que son capturadas. En la segunda fase, el preprocesado, se prepara la imagen, eliminando partes no útiles o que causan algún tipo de distorsión y se resaltan partes útiles. Este preprocesado se realiza mediante la aplicación de filtros y transformaciones geométricas. A continuación, en la segmentación, se aíslan elementos de interés para su posterior interpretación. Por último, se llega a la etapa de reconocimiento o clasificación. En ella, la finalidad es distinguir objetos segmentados, gracias al análisis de características que previamente se han establecido, para diferenciarlos. Figura 2. Diagrama de bloques de las etapas [11]. 12 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 3 VISIÓN POR COMPUTADOR EN MATLAB 13 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 3.1 INTRODUCCIÓN En sus últimas versiones, Matlab proporciona al usuario varias extensiones para el tratamiento de imágenes. La primera de ellas se trata de la extensión llamada Image Processing Toolbox™. Image Processing Toolbox™ proporciona un conjunto completo de algoritmos, funciones y aplicaciones de referencia estándar para el procesamiento, análisis y visualización de imágenes, así como para el desarrollo de algoritmos. Puede llevar a cabo análisis de imágenes, segmentación, mejora, reducción de ruido, transformaciones geométricas y registro. Soporta una gran cantidad de tipos de imágenes y, sus características y aplicaciones de visualización, permiten la exploración tanto de imágenes como de videos. La segunda extensión se denomina Computer Vision System Toolbox™, y ofrece algoritmos, funciones y aplicaciones para el diseño y simulación de sistemas de visión por computador y procesamiento de vídeo. Con marcos basados en aprendizaje automático, es posible la detección de objetos, reconocimiento de los mismos y desarrollar sistemas de recuperación de imagen. Por otra parte, en Matlab, es posible trabajar con imágenes o vídeos almacenados en un dispositivo electrónico, pero también permite la captura y tratamiento en tiempo real. Es posible la conexión de una cámara u otros dispositivos de captura, de manera que el procesado sea dinámico sobre el entorno real. Para todo esto, existe la extensión denominada Image Acquisition Toolbox ™, que veremos con detalle posteriormente, al igual que las dos extensiones anteriores. 3.2 IMAGE PROCESSING TOOLBOX En este apartado, desarrollaremos algunas de las funciones que proporciona Matlab en su pack de procesado de imágenes, ya que nos serán útiles en el desarrollo práctico del proyecto. TIPOS DE IMAGENES EN MATLAB El pack de procesado de imágenes define cuatro tipos de imágenes. Estos tipos determinan la forma en la que Matlab interpreta los valores de las matrices como píxeles de una imagen. Dichos tipos de imágenes y susaracterísticas, quedan recogidas en la Tabla 1 y las Figuras 4, 5,6 y 7. 14 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Tabla 1. Tipos de imágenes en Matlab. TIPO DE IMAGEN INTERPRETACIÓN Binaria Imagen representada con una matriz lógica que contiene ceros y unos, interpretados como negros y blancos, respectivamente. Indexada Matriz del tipo logical, uint8, uint16 single o double. Se trata de una imagen cuyos píxeles tienen valores que son índices directos a un mapa de color RGB. RGB (color) Se trata de una imagen cuyos píxeles son especificados por 3 valores, uno para cada componente de color (rojo, verde y azul) de cada píxel. En Matlab, una imagen RGB es representada por una matriz mxnx3 de clase uint8, uint16, o double. Escala de grises Es una imagen cuyos valores de píxeles corresponden a una escala de grises. En MATLAB, una imagen de intensidad es representada por un array de clase uint8, uint16, o double. Figura 4. Imagen Binaria Matlab [9]. 15 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 5. Imagen indexada [9]. Figura 6. Imagen RGB [9]. Figura 7. Imagen en escala de grises [9]. 16 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 3.2.1 FILTRADO Y REALZADO DE IMÁGENES A continuación, analizaremos algunas de las funciones que implementa Matlab para el preprocesamiento de imágenes. OPERACIONES ARITMÉTICAS Las operaciones aritméticas más comunes en el procesamiento de imágenes son: suma, resta, multiplicación y división. Para que sea posible llevar a cabo dichas operaciones, ambas imágenes deben tener el mismo ancho y alto. En la Figura 8 se muestra la suma de dos imágenes, que se realiza de la forma 𝐹 𝑥, 𝑦 = 𝐺 𝑥, 𝑦 + 𝑉(𝑥, 𝑦), mediante el comando 𝑖𝑚𝑎𝑑𝑑. F = imadd(G, V) imview(F) También es posible aumentar el brillo de una imagen, sumando un valor constante a cada píxel. En la Figura 9 se muestra el efecto de sumar un escalar a una imagen, en este caso, 50. La transformación se realiza de la forma 𝐹 𝑥, 𝑦 = 𝐺 𝑥, 𝑦 + 𝐾 F = imadd(G, 50) imview(F) De igual manera, es posible realizar una resta de imágenes 𝐹 𝑥, 𝑦 = 𝐺 𝑥, 𝑦 − 𝑉(𝑥, 𝑦) (Figura 10), y también la resta de una constante K. Este último caso, corresponderá con un oscurecimiento de la imagen que está siendo tratada (Figura 11). + = Figura 8. Suma de imágenes. 17 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA → Figura 9. Aumento de brillo. - = Figura 10. Resta de imágenes. → Figura 11. Reducción de brillo. Además, Matlab permite otras realizar otras operaciones lógicas aritméticas con imágenes como, las funciones AND, OR o NOT. 18 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA AJUSTE DE LA INTENSIDAD La función imadjust permite ampliar, reducir, y generalmente, modificar los rangos de intensidad de una imagen a unos nuevos rangos de intensidad en la imagen resultante. Esta función puede ser aplicada a imágenes en escala de grises y de color. 𝐽 = 𝐼𝑚𝑎𝑑𝑗𝑢𝑠𝑡(𝐼), mapea los valores de intensidad en la imagen en escala de grises I a nuevos valores, de tal forma que se obtiene el 1% de los datos saturados en las zonas claras y oscuras. De esta forma, se logra incrementar el contraste en la imagen resultante J. Imadjust también permite la siguiente sintaxis: 𝐽 = 𝑖𝑚𝑎𝑑𝑗𝑢𝑠𝑡(𝐼, [𝑙𝑜𝑤_𝑖𝑛 𝑖𝑔_𝑖𝑛], [𝑙𝑜𝑤_𝑜𝑢𝑡 𝑖𝑔_𝑜𝑢𝑡], 𝑔𝑎𝑚𝑚𝑎) De esta forma, se transforman los valores de intensidad de la imagen J, que están entre el intervalo [𝑙𝑜𝑤_𝑖𝑛 𝑖𝑔_𝑖𝑛], en valores del intervalo de salida , [𝑙𝑜𝑤_𝑜𝑢𝑡 𝑖𝑔_𝑜𝑢𝑡] . El parámetro gamma especifica la forma de la curva y, si se omite, toma el valor 1 (Figura 12). En el siguiente ejemplo, aplicamos la transformación imadjust, con una expansión de los valores de grises de la imagen de entrade entre 0.5 y 0.75, a unos valores entre 0 y 1. 𝐽 = 𝑖𝑚𝑎𝑑𝑗𝑢𝑠𝑡(𝐼, 0.5 0.75 , 0 1 ) %Mapeo de intensidad 𝑠𝑢𝑏𝑝𝑙𝑜𝑡 1,2,1 %Representación de la imagen original 𝑖𝑚𝑠𝑜𝑤(𝐼) 𝑠𝑢𝑏𝑝𝑙𝑜𝑡(1,2,2) %Representación de la imagen resultante 𝑖𝑚𝑠𝑜𝑤(𝐽) Figura 12. Mapeo de intensidad según gamma [33]. 19 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 13. Imagen tras ajuste de intensidad. HISTOGRAMA DE UNA IMAGEN Un histograma ilustra en un gráfico la manera en la cual se encuentran distribuidos los píxeles en una imagen, según la cantidad de píxeles en cada nivel de intensidad de color. A través de él, es posible obtener información acerca de las sombras (parte izquierda del histograma), los tonos medios (centro), o las iluminaciones (parte derecha). El histograma de una imagen en niveles de gris, proporciona información sobre el número de píxeles que existen para cada nivel de intensidad. En una imagen RGB, serán necesarios tres histogramas, uno para cada color. En la Figura 14 se muestra el histograma de una imagen a escala de grises, utilizando la función 𝐼𝑚𝑖𝑠𝑡(𝐼) Figura 14. Histograma de imagen en escala de grises. 20 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA El proceso de ecualizado de un histograma (Figura 15) mejora el contraste de una imagen, y distribuye uniformemente los diferentes niveles de intensidad. Suele mejorar la calidad de imágenes con gran saturación. El ecualizado está presente en Matlab con la función 𝑖𝑠𝑡𝑒𝑞. Figura 15. Ecualización de histograma [15]. Como se puede apreciar claramente en la Figura 15, se ha producido una redistribución de las intensidades de la imagen, en la que anteriormente, había un excesivo valor de píxeles a la izquierda (imagen muy saturada). De esta manera, es posible la apreciación de detalles que antes no eran posibles de observar a simple vista, debido a la saturación de la imagen primitiva. FILTROS SUAVIZANTES DE PASO BAJO Los filtros suavizantes suelen emplearse en el preprocesado para reducir el ruido existente en una imagen [12]. El filtrado paso bajo espacial, está basado en el promedio de los píxeles adyacentes al píxel que se evalúa en cada momento (vecindad, 3x3…). El filtrado de promediado de imágenes en Matlab es una operación lineal, y está implementado con el comando imfilter. 21 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA A continuación se muestra un ejemplo de implementación de este filtro: I=imread ‘imagen.jpg’ ; J = imnoise(I,'salt & pepper',0.02); % añade ruido sal y pimienta a la imagen h=fspecial('average',5); % crea un tipo especial de filtro K=imfilter(J,h); % aplica el filtro de promedio Figura 16. Imagen original, imagen con ruido e imagen con filtro media [12]. Otro filtro de paso bajo es el filtro de la mediana. Está basado en la sustitución del valor de un píxel por el de la mediana del conjunto formado por el mismo y sus ocho vecinos. Es una operación no lineal que se suele utilizar en el procesamiento de imágenes para reducir el ruido "sal y pimienta". La mediana de filtrado es más efectiva cuando el objetivo es reducir el ruido y al mismo tiempo, preservar los bordes. I = imread ‘imagen.jpg’ ; J = imnoise(I,'salt & pepper',0.02); % Añade ruido sal y pimienta a la imagen K = medfilt2(J); % Aplica el filtro de la mediana Figura 17. Imagen original, imagen con ruido e imagen con filtro mediana [12]. 22 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Como podemos observar, en este caso de ruido, es mucho más efectivo el filtro de mediana, ya que se ha eliminado el ruido y conservado los bordes de una manera más efectiva. 3.2.2 SEGMENTACIÓN DE IMÁGENES La segmentación es un proceso que consiste en, dividir una imagen digital en regiones similares con respecto a una o varias características (como por ejemplo el color, forma, tamaño…). Esto se realiza con el fin de facilitar el posterior análisis y reconocimiento automático. Se trata de una de las áreas más importantes y complejas de la visión artificial. En Matlab, los algoritmos de segmentación se basan generalmente en dos propiedades básicas acerca de los niveles de grises de una imagen: la umbralización, discontinuidad y similitud. UMBRALIZACIÓN La umbralización permite convertir una imagen en escala de grises o en color, en una imagen binaria. De esta forma, los objetos de interés son representados (1 ó 0) con un valor diferente a los píxeles del fondo (0 ó 1). Es una técnica de segmentación rápida, con un coste computacional barato que, sin embargo, no resulta siempre efectiva cuando se trabaja con imágenes del mundo real. Esto es debido a la presencia de ruidos, brillos o de imágenes con histogramas planos. El método de Otsu es uno de los mejores métodos de selección de umbral para imágenes del mundo real. Matlab posee la función graythresh, que calcula el umbral de la imagen global, usando el método de Otsu. Presenta la siguiente sintaxis: 𝑇 = 𝑔𝑟𝑎𝑦𝑡𝑟𝑒𝑠 (𝐼) Donde I es la imagen original y T es el umbral devuelto, situado entre el intervalo [0 1]. 𝐼 = 𝑖𝑚𝑟𝑒𝑎𝑑 ′𝑝𝑙𝑎𝑐𝑎. 𝑗𝑝𝑔′ ; 𝑇 = 𝑔𝑟𝑎𝑦𝑡𝑟𝑒𝑠 (𝐼) % Calcula el valor de umbral óptimo 𝑏𝑤 = 𝑖𝑚2𝑏𝑤 𝐼, 𝑇 ; % Transforma a imagen binaria 𝑖𝑚𝑠𝑜𝑤(𝑏𝑤) 23 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 18. Umbralización de imagen con método Otsu. DETECCIÓN DE BORDES En una imagen, los bordes o contornos, corresponden a los límites de los objetos presentes en la misma. Para hallar los contornos, buscamos lugares de la imagen en los que la intensidad de los píxeles cambia de una manera brusca. La detección de contornos se encuentra implementada en Matlab a través del comando edge, y es aplicado a imágenes de intensidad. La sintaxis es la siguiente: 𝐵𝑊 = 𝑒𝑑𝑔𝑒(𝐼, 𝑚𝑒𝑡𝑜𝑑); Esta función devuelve una imagen binaria correspondiente a los bordes de la imagen de entrada. Los métodos más importantes que admite son: sobel, prewitt, roberts y canny. Además, es posible ajustar un umbral T de sensibilidad, de manera que los cambios de intensidad no superiores a ese umbral, no sean considerados como bordes. 𝐵𝑊 = 𝑒𝑑𝑔𝑒 (𝐼, 𝑚𝑒𝑡𝑜𝑑, 𝑇); Figura 19. Imagen a escala de grises. 24 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 20. Detección de bordes con los diferentes métodos. CRECIMIENTO DE REGIONES El crecimiento de regiones es un procedimiento a través del cual, son agrupados píxeles o subregiones en regiones mayores. El procedimiento más sencillo es el denominado, agregación de píxeles, que comienza a partir de un conjunto de píxeles de partida (píxeles semilla), de forma que, a partir de cada semilla van creciendo regiones añadiendo píxeles a estas semillas. Se agregan aquellos píxeles vecinos que tienen propiedades similares. Dos problemas fundamentales en el crecimiento de regiones son: por una parte, la elección de semillas que representen adecuadamente a las regiones de interés, y por otra, la elección de propiedades adecuadas que puedan añadir píxeles durante el proceso de crecimiento [26]. La selección de los puntos de partida suele depender de la naturaleza de la imagen que se pretende segmentar, y la selección del criterio de similitud depende no sólo del problema considerado, sino también del tipo de imagen disponible. 25 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA En Matlab, dos funciones a tener en cuenta en la distinción de regiones son bwlabel y RegionProps. Antes de entrar en detalles en estos comandos, sería conveniente recordar el concepto de vecindad y conectividad. Los píxeles que rodean directamente a un píxel de coordenadas (x, y) son definidos como los vecinos de p. El conjunto de 4 píxeles que colindan horizontal y verticalmente con p tienen vecindad 4, y están localizados en las coordenadas: (x+1, y), (x-1, y), (x, y+1), (x, y-1). Cuando se toman además los píxeles localizados diagonalmente a p, se habla de vecindad 8, y las coordenadas de estos píxeles son: (x+1, y+1), (x+1, y-1), (x-1,y+1), (x-1,y-1). Figura 21. Vecindad 4 y vecindad 8 [11]. El concepto de conectividad de píxeles se utiliza como criterio de decisión en la definición de regiones de una imagen. Los objetos presentes en una imagen ocupan un área definida por sus bordes. Los píxeles pertenecientes a esa región se consideran conectados con conectividad 4 u 8, si cumplen las condiciones de adyacencia descritas anteriormente (vecindad 4 u 8), y además, si, sus respectivos niveles de gris son semejantes, o difieren en un rango de valores definido. En Matlab, la función bwlabel etiqueta los componentes conectados en una imagen binaria. Presenta la siguiente sintaxis: 𝐿 = 𝑏𝑤𝑙𝑎𝑏𝑒𝑙(𝑏𝑤, 𝑛) Retorna una matriz L del mismo tamaño que la imagen bw, que contiene etiquetas para los objetos conectados en bw. El valor n podría ser 4 u 8, donde se especifica si buscamos objetos 4-conectados u 8-conectados, respectivamente. Si el valor argumento n se omite, toma por defecto el valor 8. 26 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Se muestra a continuación un ejemplo del uso de la función bwlabel con la siguiente imagen (Figuras 22 y 23) 𝐼 = 𝑖𝑚𝑟𝑒𝑎𝑑 ′𝑓𝑖𝑔𝑢𝑟𝑎𝑠. 𝑗𝑝𝑔′ ; 𝑢𝑚𝑏𝑟𝑎𝑙 = 𝑔𝑟𝑎𝑦𝑡𝑟𝑒𝑠(𝐼); 𝐼 = 𝑖𝑚2𝑏𝑤(𝐼, 𝑢𝑚𝑏𝑟𝑎𝑙); % Binariza la imagen 𝐿 = 𝑏𝑤𝑙𝑎𝑏𝑒𝑙(𝐼); % Crea la matriz de regiones El resultado es una matriz con etiquetas para cada uno de los objetos con valores de 0 a N, siendo N el número de objetos. Figura 22 y 23. Imagen a segmentar y Matriz de segmentación L. La función regionprops mide las propiedades de las regiones de una imagen. Su sintaxis es: 𝑆𝑇𝐴𝑇𝑆 = 𝑟𝑒𝑔𝑖𝑜𝑛𝑝𝑟𝑜𝑝𝑠 (𝐿, 𝑝𝑟𝑜𝑝𝑖𝑒𝑑𝑎𝑑𝑒𝑠) Esta función devuelve la medida de un grupo de propiedades para cada región etiquetada en la matriz L. En la Tabla 2 se muestran muestra algunas de las propiedades que ofrece esta función. 27 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Tabla 2. Propiedades del comando regionprops. PROPIEDAD Area DESCRIPCIÓN Calcula el área en píxeles de la región BoundingBox Calcula la posición y dimensiones del mínimo rectángulo que envuelve la región Centroid Posición del centroide de la región Eccentricity Número escalar que da la excentricidad de la imagen MayorAxisLength Longitud en píxeles del eje mayor de la región MinorAxisLength Longitud en píxeles del eje mejor de la región Orientation Ángulo en grados entre el eje x y el eje mayor de la región Image Imagen binaria del mismo tamaño que la frontera 3.2.2 CLASIFICACIÓN Y RECONOCIMIENTO La etapa de clasificación suele ser el último objetivo de un sistema de visión artificial. Un sistema de reconocimiento de caracteres (OCR) clasifica una imagen como letra determinada, o un sistema de reconocimiento dactilar identifica una huella como perteneciente a una persona. Los algoritmos de clasificación tienen la misión de distinguir entre distintos objetos de un conjunto definido como colección de clases o universo de trabajo [12]. Un clasificador toma un conjunto de características como entrada al proceso y produce como salida una clase etiquetada. Las características discriminantes o rasgos son componentes que permiten determinar, de manera unívoca, a qué clase (de una colección de clases), puede pertenecer un objeto. Los comandos bwlabel y regionprops, que explicamos de manera detallada anteriormente, pueden proporcionar estas características discriminantes, tales como el área o la excentricidad. 28 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Se suele buscar un conjunto mínimo de características que puedan determinar de manera unívoca a qué clase pertenece cada elemento del universo de trabajo. El coste del cálculo para la obtención de estas características debe ser razonable, así como el tiempo de obtención de las mismas. Además, no debe haber correlación entre distintas características, y se debe tener en cuenta que objetos de una misma clase, pueden tener vectores de características con unos valores similares, por lo que la fiabilidad debe ser importante. Una vez determinadas las características a analizar, y obtenidas las mismas, la clasificación de un objeto comienza por la obtención de su patrón. El siguiente paso consistirá en determinar la proximidad o grado de pertenencia de este patrón a cada una de las clases que existen en el universo, asignando el objeto a aquellas clases con las que el grado de parecido sea mayor. Figura 24. Proceso de clasificación de una imagen [12]. 3.3 COMPUTER VISION SYSTEM TOOLBOX Esta extensión de Matlab ofrece algoritmos, funciones y aplicaciones para el diseño y simulación de sistemas de visión por computador y procesamiento de video. Ofrece soluciones capaces de detectar características de una imagen de manera que sea posible la detección de un objeto, su seguimiento a tiempo real, e incluso, la estimación del movimiento. Uno de los aspectos más estudiados en aplicaciones de visión por computador, es la correspondencia entre dos imágenes. Este tipo de tareas suele ser empleado por una gran cantidad de aplicaciones para el reconocimiento de objetos, como por ejemplo, si deseamos buscar un objeto (A) dentro de una imagen (B). 29 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA La correspondencia de imágenes abarca tres etapas: la detección de puntos de interés en cada una de las imágenes, la descripción de los mismos y el emparejamiento de puntos de interés de ambas imágenes. El primer paso, como hemos indicado, ha de ser la búsqueda de puntos en la imagen, de manera que aporten información realmente importante. El siguiente, describir la zona en cuestión, ya que estos puntos nos aportan información de localización, pero no es suficiente para una posterior búsqueda de correspondencia entre imágenes. Finalmente, se asocian puntos clave de una imagen A en una imagen B, de esta forma reconociendo un objeto de una imagen A en una imagen B. 3.3.1 PUNTOS DE INTERÉS La definición de punto de interés no está del todo clara, pero a grosso modo, son puntos que aportan información sustanciosa y, además, el conjunto de píxeles vecinos a estos aportan una información local realmente significativa. Son puntos bien definidos, y al someter la imagen a una operación matemática deben resaltar sobre el resto de puntos. Los puntos que vayan a ser localizados deben ser lo más estables posibles, y permanecer invariantes ante cambios de escala, orientación, rotación o iluminación de las imágenes. De esta forma se garantiza que dichos puntos puedan ser detectados de igual forma ante imágenes tomadas en distintos momentos y desde una posición con cierta variación. Nos centraremos en uno de los detectores más importantes y eficientes que hay hoy en día, el detector SURF, y que es el que utilizaremos más adelante en el desarrollo del proyecto. 3.3.2 DETECTOR SURF Este detector fue presentado en 2006 por Herbert Bay. Guarda ciertas similitudes con el detector SIFT (1999), en el que está inspirado, pero sin embargo, presenta ciertas mejoras como [25]: Una velocidad de cálculo considerablemente mayor Mayor robustez ante variaciones en las imágenes 30 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Para conseguir estas mejoras, el detector de SURF reduce la dimensión y complejidad de los descriptores obtenidos, pero de tal manera que, estos continúan siendo lo suficientemente característicos y repetitivos. DETECCIÓN DE PUNTOS DE INTERÉS Este detector está basado principalmente en la matriz Hessiana, ya que utiliza una aproximación básica de ésta. El motivo del uso de esta matriz es el buen rendimiento en cuanto a velocidad de cálculo computacional y precisión. A diferencia de detectores anteriores, no utiliza diferentes medidas para el cálculo de la posición y la escala de los puntos de interés de manera individual, sino que emplea el determinante de la matriz Hessiana en ambos casos. Dado un punto 𝑝(𝑥, 𝑦) de una imagen I, la matriz Hessiana 𝐻 𝑝, σ , en el punto p a la escala σ se define de la siguiente manera [20]: 𝐻 𝑝, σ = 𝐿𝑥𝑥 (𝑝, σ) 𝐿𝑦𝑥 (𝑝, σ) 𝐿𝑥𝑦 (𝑝, σ) 𝐿𝑦𝑦 (𝑝, σ) Matriz Hessiana Donde 𝐿𝑥𝑥 (𝑝, σ) es la convolución de la derivada parcial de segundo orden de la gaussiana ∂2 ∂x 2 𝑔(σ) con la imagen I en el punto p y lo mismo ocurre con 𝐿𝑥𝑦 (𝑝, σ) y 𝐿𝑦𝑦 (𝑝, σ). Los filtros gaussianos son óptimos para el análisis del espacio escala. Debido a ciertas limitaciones como, la necesidad de ser discretizados y la aparición del siempre deseado efecto aliasing, se ha probado en los detectores SURF una alternativa a estos filtros gaussianos. Se trata de los denominados filtros de caja. Los filtros de caja realizan una aproximación de las derivadas parciales de segundo orden de las gaussianas, y presentan la ventaja de que pueden ser evaluados de una manera rápida usando integrales 31 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA La escala más pequeña posible corresponde a un filtro de caja de dimensión 9x9, que corresponde a las aproximaciones de la derivada parcial de segundo orden de una gausianna con σ =1.2. Figura 25. Aproximación de las derivadas parciales con filtros tipo caja. Las aproximaciones de las derivadas parciales se denotan con 𝐷𝑥𝑥 , 𝐷𝑥𝑦 y 𝐷𝑦𝑦 . El determinante de la matriz Hessiana se calcula de la siguiente manera: det 𝐻𝑎𝑝𝑟𝑜𝑥 = 𝐷𝑥𝑥 𝐷𝑦𝑦 − (0.9𝐷𝑥𝑦 )2 La imagen de salida que se obtiene tras la convolución de la imagen original con un filtro de dimensiones 9x9 es considerada como escala inicial. Mediante la aplicación gradual de filtros de mayores dimensiones, se obtienen capas sucesivas, evitando de esta manera efectos aliasing. El espacio escala está dividido en octavas, y estas octavas están compuestas por un número fijo de imágenes como resultado de la convolución de una imagen original con una serie de filtros de una dimensión cada vez mayor. En cada nueva octava, el incremento del tamaño del filtro es el resultado de doblar en incremento producido en la octava anterior. 32 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 26. Tamaño de filtros en diferentes escalas [25]. Finalmente, para localizar los puntos de interés en una imagen, se eliminan aquellos que no son máximos en una región 3x3x3. De esta manera, el máximo determinante de la matriz Hessiana es interpolado en la escala y espacio de la imagen. Así pues, todos los puntos de interés quedarían localizados. ASIGNACIÓN DE ORIENTACIÓN La siguiente etapa en la creación del descriptor, corresponde a la determinación de la orientación de los puntos de interés hallados en el apartado anterior. Este paso es muy importante, ya que otorga al descriptor la invariancia ante cualquier tipo de rotación de la imagen. Para ello, lo primero es calcular la Respuesta de Haar en la dirección X, y en la dirección Y, en una región circular de radio 6s, donde s es la escala del punto de interés. Una vez calculadas las respuestas de Haar o wavelets, éstas son ponderadas por una gaussiana centrada en el punto de interés, para dar mayor valor a las respuestas más próximas al punto. Finalmente, el área circular alrededor del punto de interés es dividida en 6 secciones, cubriendo un ángulo de π/3 cada una. La orientación dominante será aquella que, sumando todas las direcciones dentro de cada sección, tenga un vector de mayor longitud (Figura 28). 33 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figuras 27 y 28. Funciones de Haar y asignación de orientación [22]. EXTRACCIÓN DEL DESCRIPTOR La extracción del descriptor se realiza construyendo, en primer lugar, una región cuadrada centrada en el punto de interés y con un tamaño de 20s. A continuación, la región es dividida en regiones más pequeñas 4x4. Para cada nueva subregión, se calculan características para puntos de muestra separados por una región 5x5. La respuesta de Haar en la dirección horizontal la llamaremos 𝑑𝑥 , mientras que a la respuesta en la dirección vertical la llamaremos 𝑑𝑦 . Una vez obtenidas estas respuestas, para cada subregión se suman los resultados dx y dy , además de los valores absolutos de estos resultados. De modo que, cada subregión tiene como descriptor un vector v de dimensión 4: 𝑣 = ( 𝑑𝑥 , 𝑑𝑦 , 𝑑𝑥 , 𝑑𝑦 ) Por lo tanto, englobando las 4x4 subregiones, para cada uno de los puntos de interés, resulta un descriptor SURF con una longitud total de 64 valores. EMPAREJAMIENTO El último paso del detector, consistirá en enlazar los puntos de interés hallados en las dos imágenes. Cada punto de interés de la imagen A, será comparado con los 34 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA puntos de interés de la imagen B, a través de la distancia euclídea entre sus descriptores. Un emparejamiento es detectado en caso de que la distancia relativa entre ambos puntos sea menor a 0.7 veces la distancia respecto al segundo vecino más cercano. Esta estrategia de matching es conocida como la del vecino más próximo. El procedimiento del algoritmo SURF para detectar puntos de interés en dos imágenes, y enlazarlos finalmente se resume en la Figura 29. Figura 29. Algoritmo SURF para la detección de imágenes [22]. DETECTOR SURF EN MATLAB [10] Matlab presenta una serie de funciones que, combinándolas, forman un algoritmo que permite la detección de un objeto específico en una imagen. Se basa en la correspondencia de puntos entre una imagen de referencia a buscar y la imagen donde se busca esta imagen de referencia. Estos puntos de referencia pueden tratarse de puntos surf, brisk, o corner. 35 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Es posible detectar objetos a pesar de posibles cambios en la escala, o rotaciones en el plano entre imagen a buscar e imagen buscada. Este método de detección puede ser aplicado en el caso de tener que detectar un objeto específico, por ejemplo, sería posible detectar en una imagen de una estantería un libro en concreto, pero no cualquier tipo de libro. Nos centraremos en el caso de puntos característicos surf. En el siguiente ejemplo trataremos de buscar el elefante que se muestra en la figura, en la fotografía donde se encuentran más objetos. Las imágenes mostradas en las figuras 30 y 31 han sido obtenidas de Computer Vision System Toolbox ,Matlab User‟s Guide. Figuras 30 y 31. Elefante que debe ser encontrado y escena donde debe ser encontrado [20]. % 1. Lectura de ambas imágenes elephantImage = imread('elephant.jpg'); sceneImage = imread('escritorio.jpg'); % 2. Detección de puntos característicos elephantPoints = detectSURFFeatures(elephantImage); scenePoints = detectSURFFeatures(sceneImage); figure; 36 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA imshow(elephantImage); title('100 puntos más característicos del elefante'); hold on; plot(selectStrongest(elephantPoints, 100)); Figura 32. 100 puntos más característicos del elefante. figure; imshow(sceneImage); title('300 puntos más característicos de la escena’); hold on; plot(selectStrongest(scenePoints, 300)); Figura 33. 300 puntos más característicos de la escena. % 3. Extracción de descriptores [elephantFeatures, elephantPoints] = extractFeatures(elephantImage, elephantPoints); [sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints); 37 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA % 4. Emparejamiento de puntos usando los descriptores elephantPairs = matchFeatures(elephantFeatures, sceneFeatures); matchedElephantPoints = elephantPoints(elephantPairs(:, 1), :); matchedScenePoints = scenePoints(elehantPairs(:, 2), :); figure; showMatchedFeatures(elephantImage, sceneImage, matchedElephantPoints, ... matchedScenePoints, 'montage'); title(Puntos conectados (Incluyendo Outliers)'); Figura 34. Puntos conectados (Incluyendo Outliers). % 5. Localización del objeto [tform, inlierElephantPoints, inlierScenePoints] = ... estimateGeometricTransform(matchedElephantPoints, matchedScenePoints, 'affine'); figure; showMatchedFeatures(ElephantImage, sceneImage, inlierElephantPoints, ... inlierScenePoints, 'montage'); title('Puntos conectados (Sólo Inliers)'); Figura 35. Puntos conectados (Sólo Inliers). 38 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA boxPolygon = [1, 1;... % arriba-izquierda size(elephantImage, 2), 1;... % arriba-derecha size(elephantImage, 2), size(elephantImage, 1);... % abajo-derecha 1, size(elephantImage, 1);... % abajo-izquierda 1, 1]; % arriba-izquierda de Nuevo para cerrar el polígono newBoxPolygon = transformPointsForward(tform, boxPolygon); figure; imshow(sceneImage); hold on; line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y'); title(‘Elefante encontrado’); Figura 36. Elefante encontrado. 39 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 4 ADQUISICIÓN DE IMÁGENES 40 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 4.1 ADQUISICIÓN DE IMÁGENES CON WEBCAM Matlab proporciona a través de su extensión Image Acquisition Toolbox, la posibilidad de adquirir imágenes y videos con una webcam en tiempo real para el posterior tratamiento de los mismos. Para obtener el listado de cámaras instaladas basta con teclear el comando webcamlist, mostrándose los dispositivos instalados en el equipo. >> webcamlist ans = 'Logitech HD Webcam C270' Creando un objeto con la cámara deseada, se produce la conexión de la misma, y se establece una conexión exclusiva. >> cam=webcam(1) cam = webcam with properties: Name: 'Logitech HD Webcam C270' Resolution: '640x480' AvailableResolutions: {1x19 cell} Gain: 192 ExposureMode: 'auto' Exposure: -5 Brightness: 128 Sharpness: 24 BacklightCompensation: 0 WhiteBalance: 2300 Contrast: 32 Saturation: 32 41 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Es posible mostrar algunas de las propiedades de la cámara y el ajuste de algunos parámetros tales como la resolución. >> cam.AvailableResolutions % Muestra las resoluciones disponibles ans = Columns 1 through 5 '640x480' '160x120' '176x144' '320x176' '320x240' '544x288' '640x360' '752x416' '864x480' '960x544' '960x720' Columns 6 through 10 '352x288' '432x240' Columns 11 through 15 '800x448' '800x600' Columns 16 through 19 '1024x576' '1184x656' >> cam.resolution '1280x720' '1280x960' % Muestra la resolución actual ans = 640x480 >> cam.resolution='1280x960'; % Cambia la resolución a ‘1280x960’ Finalmente, previsualizamos el contenido de la cámara y tomamos un fotograma de la escena, quedando almacenado el mismo en la matriz imagen. >> preview(cam) imagen=snapshot(cam) 42 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 4.2 ADQUISICIÓN DE IMÁGENES CON KINECT Kinect es un dispositivo, pensado inicialmente como un controlador de juego para Xbox, que integra diversos componentes tales como una cámara RGB, un sensor de profundidad e infrarrojos (emisor y receptor) y cuatro micrófonos incorporados. Es capaz de capturar el esqueleto humano y posicionarlo en el plano. Sin embargo, las diversas funciones que proporcionan hicieron interesante la integración de Kinect en Matlab, de modo que pudieran utilizarse todas estas funciones más allá que en un simple videojuego de entretenimiento. En el presente proyecto aprovecharemos la función de profundidad que Kinect facilita, a diferencia de una cámara convencional que no proporciona esta información. Seguidamente, entramos un poco en detalle con cada uno de los componentes que integran una Kinect [32]. Cámara RGB que ofrece una resolución máxima de 1280x960. Hace posible la captura de imágenes en color. Emisor de infrarrojos y sensor de profundidad. El emisor emite luz infrarroja y el sensor de profundidad mide la luz reflejada de tal forma que hace una estimación de la distancia entre un objeto y el sensor. Cuatro micrófonos que permiten capturar sonido y encontrar la localización de una fuente de sonido y la dirección de una onda sonora. Acelerómetro que determina la orientación de la Kinect. Figura 37. Componentes de una Kinect [32]. 43 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Existen dos modos para la adquisición de imágenes [30] con información de profundidad: el Near Mode (modo cercano) y el Default Mode (modo predeterminado). El Near Mode permite trabajar con imágenes situadas hasta a una distancia de 40cm respecto a la Kinect, mientras que en el Default Mode, los objetos deben estar alejados al menos a 80cm para una correcta lectura de los valores de profundidad. El modo cercano ha sido implementado en las últimas versiones de Kinect para Windows, sin embargo, en la Kinect utilizada en el proyecto, este modo no se encontraba aún disponible, por lo que ha sido necesario situar los objetos al menos a 80cm del sensor. En la figura 38 se muestra una comparativa de rangos de funcionamientos de ambos modos. Figura 38. Rangos de funcionamiento para cada uno de los modos [30]. Mostramos el proceso para adquirir una imagen a color, y la imagen con los valores de profundidad. La imagen de profundidad será una matriz con los valores (en milímetros), de la distancia entre el sensor de profundidad y cada punto de la imagen. colorVid = videoinput('kinect',1); depthVid = videoinput('kinect',2); sceneImage=getsnapshot(colorVid); depthImage=getsnapshot(depthVid); RGB=label2rgb(depthImage); % Crea un objeto para imagen color % Crea objeto para imagen profundidad % Captura la imagen % Captura la imagen % Realiza una conversión a RGB de la imagen de profundidad para hacerla más vistosa figure imshow(sceneImage) figure imshow(RGB); 44 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 39. Imagen real e imagen de profundidad. Los puntos más cercanos son representados con tonos más fríos, mientras que los más lejanos son representados con tonalidades más cálidas. En las imágenes pueden aparecer zonas erróneas [31] de color negro (0cm), que corresponden o bien a zonas demasiado cercanas a la cámara (menos de 40cm en el Near Mode y menos de 80cm en el Default Mode), o bien a zonas muertas. Estas zonas muertas se deben a que al colocar obstáculos delante de la cámara, el patrón de puntos IR se proyecta sobre ellos y no es posible ver lo que hay detrás. Como el sensor de captura no está situado en la misma posición que el sensor que proyecta los infrarrojos, tras el objeto queda una zona en la que no se proyectan puntos IR. La siguiente figura muestra el fenómeno de aparición de estas sombras. Figura 40. Aparición de sombras [31]. 45 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 5 APLICACIÓN AL CONTEO DE UNIDOSIS 46 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.1 SERVICIO DE FARMACIA En el servicio de farmacia del Hospital Universitario Reina Sofía de Córdoba, trabajan unas 60 personas, con el fin de que cada paciente disponga del medicamento que necesita en el lugar y momento adecuado. Todos los medicamentos de uso hospitalario que no se encuentran disponibles en las farmacias, y que deben recoger los pacientes externos en el hospital, toda aquella medicación que se recibe a diario cuando un paciente está ingresado, o todo aquel tratamiento de quimioterapia que se administra a pacientes con cáncer, es gestionado desde este servicio de farmacia. El servicio de farmacia se divide en 4 almacenes. [4] detalla la distribución de la farmacia en distintas áreas del complejo hospitalario de la siguiente forma: Almacén 1, localizado en la planta baja del hospital, se trata del principal almacén del servicio de farmacia. Almacén 2, que hace referencia a las máquinas dispensadoras de medicamentos, las cuales se pueden encontrar en puntos estratégicos del hospital, como la unidad de cuidados intensivos. Almacén 3, representaba al antiguo almacén del Hospital Provincial de Córdoba, absorbido hoy en día por el Almacén 1. Almacén 4, conocido como Apostore (Figura 41). Se trata de una sala robotizada, de reciente implantación en el hospital, y localizada dentro del Almacén 1. En esta localización, son almacenados los medicamentos con un mayor impacto para el hospital, permitiendo una gestión más eficiente. Figura 41. Almacén Apostore [4]. 47 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.2 DISTRIBUCIÓN UNIDOSIS DE MEDICAMENTOS Uno de los objetivos del servicio de farmacia hospitalaria es presentar un sistema eficaz y seguro de dispensación y distribución de medicamentos. Los medicamentos deben mantenerse disponibles en el lugar apropiado y en forma oportuna para su aplicación a los pacientes. El Sistema de Distribución de Medicamentos en Dosis Unitaria (SDMSU) es un sistema de utilización de medicamentos, formado por un conjunto de procesos que comprenden la prescripción, validación, dispensación y administración [28]. Figura 42. Ciclo de distribución unidosis [28]. Este sistema presenta una mayor seguridad para pacientes hospitalizados, comparado con otros sistemas de distribución de medicamentos [26]. A continuación, analizamos las ventajas que el sistema de medicamentos unidosis, presenta frente a otros tipos de sistemas: Es el sistema que mejor garantiza que el medicamento prescrito llegue al paciente al cual ha sido destinado, ya que se basa en la orden médica a cada paciente en forma individual. Utiliza de manera eficiente y racional los recursos humanos involucrados en la distribución de los medicamentos, ya que disminuye el tiempo de manipulación de los mismos, y el tiempo de control de los niveles de stock, pudiendo de esta forma dedicar más tiempo al cuidado de los pacientes. 48 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Disminuye el coste hospitalario asociado a la medicación, ya minimiza el tamaño del stock, disminuye el despilfarro por pérdidas, recupera medicamentos no aplicados al paciente y disminuye los errores de medicación. Permite un mejor seguimiento y control de los tratamientos farmacéuticos. Presenta mayor capacidad de adaptación a procedimientos computarizados y automatizados. Según el estudio “Evaluación del impacto derivado de la utilización de productos de dosis unitaria en dos centros de atención primaria”, realizado por Jose Luis Segú, de la Unidad de Farmacia Clínica y Farmacoterapia de la Universitat de Barcelona, el uso de dosis unitarias supone un ahorro del 14% se las unidades prescritas, o que cada paciente no acumulase en su casa más de 19 dosis innecesarias al año. Los medicamentos suministrados mediante este sistema se encuentran completamente identificados (nombre comercial, principio activo, dosis, unidades de la dosis, lote y caducidad), hasta el momento final de la administración, ya que los fármacos sin identificar pueden suponer un grave peligro para el paciente. Figura 43. Medicamentos etiquetados [28]. En la etapa de dispensación, la medicación es entregada mediante carros de unidosis a cada unidad de enfermería para la posterior administración a los pacientes ingresados en el hospital, o bien a la farmacia que suministra medicamentos a los pacientes externos que acuden a retirar su medicación. 49 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 44. Carro de medicación unidosis. Figura 45. Consulta de pacientes externos y sala de unidosis [4]. 50 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.3 CONTEO AUTOMATIZADO DE UNIDOSIS En la farmacia donde son atendidos los pacientes externos del hospital, son realizados inventarios de forma periódica. El objetivo de estos inventarios es conocer de una manera real, para cada medicamento, la cantidad disponible de cada uno de ellos. De esta manera, como explicamos en el Capítulo 1, se minimiza el importe económico de los medicamentos almacenados, pero de forma tal que se sigan satisfaciendo las necesidades de los pacientes que acuden a retirar su medicación. Estos inventarios requieren el empleo de horas por parte del personal del hospital, y en este caso práctico, pretendemos automatizar en la medida de lo posible este proceso para ahorrar horas de trabajo. Para ello, en este caso, trataremos de contabilizar el número de unidades unidosis de un medicamento en concreto, mediante técnicas de visión artificial. Trabajaremos con unidosis de Omeprazol 20mg en cápsulas, uno de los medicamentos de dosis individual suministrados de manera más frecuente en la farmacia del Hospital Universitario Reina Sofía de Córdoba. Las cápsulas irán siendo esparcidas por el personal sobre un fondo liso, en varias veces, de manera que, una cámara fija tome una imagen cada vez, y un algoritmo en Matlab informe al farmacéutico y almacene el número de dosis existentes de manera automática. Así pues, con varios fotogramas, se evitaría el tener que contar de manera manual e individual, el número de dosis existentes, ahorrando una gran cantidad de tiempo. Figura 46. Cápsula de Omeprazol 20 mg. 51 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.3.1 CASO SENCILLO En este primer ejemplo práctico, consideramos el caso en el cual, las unidosis se han distribuido de manera que, ninguna se encuentra en contacto físico con ninguna otra. Se trataría del caso más sencillo desde el punto de vista de visión artificial, y supondría un mayor cuidado del farmacéutico a la hora de esparcir las unidosis sobre el fondo uniforme. En primer lugar, inicializamos la cámara y realizamos la captura de la escena una vez distribuidas las dosis sobre el fondo. Trabajaremos con la capa azul de la imagen RGB capturada. close all clear all cam=webcam; preview(webcam) pause RGB=snapshot(cam); objetos=0; % Inicializa el valor de dosis a 0 figure imshow(RGB) title('Imagen original'); Figura 47. Imagen original. gris=RGB(:,:,3); figure imshow(gris); title('Imagen a escala de grises'); 52 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 48. Imagen a escala de grises. A continuación, realizamos una detección de bordes empleando el método sobel, con un parámetro de 0.05, obteniendo una imagen binaria en blanco y negro. BW = edge(gris,'sobel',0.05); figure imshow (BW); title('Imagen gris bordes'); Figura 49. Imagen gris bordes. Como podemos apreciar, las dosis de omeprazol presentan un envoltorio de carácter metálico, lo que provoca que, ante cualquier incidencia leve de luz, se 53 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA produzcan reflejos, los cuales provocan cambios en los niveles de gris de las imágenes capturadas. Estos cambios y saltos de en los niveles de gris, hacen que, los algoritmos de detección de bordes puedan identificar bordes en lugares internos en los que realmente no los haya, tal y como se identifica en la imagen anterior. Por tanto, tendríamos que eliminar estos bordes internos, y quedarnos con aquellos que sean contornos de las dosis esparcidas sobre el fondo. Para ello, en primer lugar aplicamos una máscara de unos sobre la imagen binaria obtenida, para rellenar posibles discontinuidades que el algoritmo de detección de bordes haya podido introducir de manera poco eficiente. mascara=ones(5,5) bwmask=imfilter(BW,mascara); figure imshow(bwmask); title('Imagen bordes despues mascara'); Figura 50. Imagen bordes después máscara Una vez aplicadas las máscaras, seguimos teniendo una imagen binaria que contiene, por una parte información acerca de los bordes externos de cada cápsula, y por otra parte información errónea dentro de cada una de ellas. Esta información errónea consiste en valores binarios positivos, que no se corresponden con el contorno exterior de cada unidosis. El comando imfill con el parámetro „holes‟ rellena agujeros en una imagen binaria. Si aplicamos este comando a la imagen binaria que hemos obtenido, 54 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA rellenamos el interior de cada una de las cápsulas, y de esta forma, obtenemos una imagen completamente binarizada que muestra cada una de ellas. BW2 = imfill(bwmask,'holes') figure imshow(BW2); title('Imagen rellenada'); Figura 51. Imagen rellenada. A continuación, con el comando imopen, los parámetros „disk‟ y el valor 10, eliminamos cualquier tipo de ruido que haya podido aparecer, que quepa en un disco de radio 10, y que por tanto pudiese ser considerado como una cápsula más. Además, de esta forma, también suavizamos las esquinas de las dosis obtenidas en la imagen rellenada, lo cual resulta interesante ya que debido a su fabricación, no todas las dosis presentan esquinas redondeadas. BW2 = imopen(BW2,strel('disk',10)); figure imshow(BW2); title('Imagen rellenada filtrada'); 55 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 52. Imagen rellenada filtrada. Finalmente, procedemos a segmentar la imagen resultante, buscando e identificando objetos con conectividad 8. Además, obtenemos las propiedades de cada uno de estos elementos conectados, ya que esto nos será realmente útil en casos más complejos como en los que mostraremos en el siguiente apartado. background=BW2; cc = bwconncomp(background, 8) cc.NumObjects; labeled = labelmatrix(cc); RGB_label = label2rgb(labeled, @spring, 'c', 'shuffle'); figure imshow(RGB_label) Figura 53. Representación visual de elementos conectados. 56 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA stats = regionprops(cc, 'all'); areas = [stats.Area]; disp('Elementos conectados') disp(cc.NumObjects) Elementos conectados 16 En este ejemplo, el número de elementos conectados, coincide con el número de cápsulas existentes en la fotografía, ya que en este caso se ha procurado que ninguna cápsula esté en contacto con ninguna otra. Sin embargo, si esto ocurriese, tal y como ocurrirá en el siguiente apartado, el número de elementos conectados no coincidirá con el total de cápsulas, ya que varios elementos en contacto con conectividad 8, computarían como un único elemento, por lo que la contabilización no sería correcta. Por tanto, será necesario añadir algo más a este algoritmo, y esto será lo que explicaremos en el siguiente caso. 5.3.2 CASO GENERALIZADO Éste se trataría del caso en el cual una o más dosis de omeprazol estuviesen en contacto físico. Debemos por tanto, encontrar un método lo más insensible a este hecho y que pudiera aplicarse igualmente al caso sencillo del apartado anterior. . Figura 54. Imagen original (caso generalizado). 57 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Consideraremos, por tanto, el escenario mostrado en la figura anterior, donde podemos apreciar que, existen seis cápsulas distribuidas sin contacto ninguno, dos grupos de dos cápsulas en contacto, y un grupo de tres cápsulas conectadas. Figura 55. Agrupación de cápsulas. Aplicaremos ahora, los algoritmos explicados en el caso sencillo, mostrándose lo siguiente: Figura 56. Imagen a escala de grises. 58 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 57. Imagen gris bordes. Figura 58. Imagen bordes después máscara. Figura 59. Imagen rellenada. 59 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 60. Representación visual de elementos conectados. Elementos conectados 9 En este caso, los elementos con conectividad 8 serían 9, lo cual no coincidiría con el total de cápsulas disponibles, 13. Esto demuestra que, por tanto, debemos introducir algo más para solucionar este problema. Fijémonos ahora en las áreas (en píxeles), de cada uno de los grupos de elementos conectados. stats = regionprops(cc, 'all'); areas = [stats.Area]; Figura 61. Áreas de los elementos 8-conectados. 60 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA A mayor numero de cápsulas en cada agrupación de elementos, más grande es el área de cada una de ellas, evidentemente. El elemento 2, con valor 11.762, corresponde al grupo de tres, los elementos 3 y 4 con valores 7.628 y 6.785 corresponden a los grupos de dos, y el resto de grupos, a los grupos unitarios. Ahora, realizaremos la división del valor mayor del vector de áreas, entre el menor de ellos, agrupmayor=max(areas)/min(areas) agrupmayor = 3.5578 De esta manera, considerando que el grupo de menor área sea siempre un grupo unitario, obtendríamos un valor aproximado (en principio no entero), del número de elementos de la agrupación de cápsulas más grande. Debido a que, durante el procesamiento de las imágenes se incluyeron máscaras redundantes para eliminar discontinuidades en los bordes, truncaremos al resultado a la unidad, obteniendo un valor numérico de 3, que coincide con la cantidad de elementos contenida en la mayor agrupación. El objetivo sigue siendo determinar a través de las áreas de los grupos, la cantidad de cápsulas que hay en cada agrupación. Representando un histograma de las agrupaciones, según sus áreas, con un número de valores del histograma igual a las dosis contenidas en la agrupación mayor, es posible solucionar este problema. figure, hist(areas,agrupmayor) Figura 62. Histograma de áreas. 61 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA u=hist(areas,agrupmayor) u= 6 2 1 Así pues, resultan grupos unitarios con frecuencia 6, grupos de dos cápsulas con frecuencia 2, y 1 grupo de tres cápsulas. Con esto, resulta bien sencillo obtener el total de cápsulas contenidas en la fotografía. h=length(u); capsulas=0; for w=1:h capsulas=capsulas+w*u(w); end msgbox(['Número total de cápsulas: ' num2str(capsulas)]); Por tanto, quedaría resuelto el problema, y obtendríamos el número de dosis de una manera correcta. Es importante recalcar que, para que este método funcione, en cada fotograma debe haber siempre al menos una dosis que no se encuentre en contacto con ninguna otra. A continuación, realizamos una batería de prueba con distintos escenarios posibles, y analizamos los resultados obtenidos. 62 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 5.3.3 EJEMPLOS EJEMPLO 1 (10 cápsulas) Grupo Área (píxeles) 1 2 3 4 5 6 7 8 9 2.998 3.128 6.064 2.897 3.118 3.025 3.001 2.852 2.910 Cápsulas detectadas 1 1 2 1 1 1 1 1 1 Total cápsulas detectadas 63 10 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 2 (12 CÁPSULAS) Grupo Área (píxeles) 1 2 3 4 5 6 7 10.502 3.926 3.539 14.671 3.463 3.617 3.828 Cápsulas detectadas 3 1 1 4 1 1 1 Total cápsulas detectadas 64 12 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 3 (6 CÁPSULAS) Grupo Área (píxeles) 1 2 3 4 4.029 4.425 4.409 13.540 Cápsulas detectadas 1 1 1 3 Total cápsulas detectadas 65 6 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 4 (19 CÁPSULAS Y FONDO NO HOMOGÉNEO) Como podemos apreciar en este ejemplo, el método de contabilización funciona también en presencia de fondos no homogéneos. Grupo Área (píxeles) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4.314 4.238 4.539 4.611 4.002 4.358 4.039 4.435 11.987 3.873 4.457 7.483 8.243 7.183 Cápsulas detectadas 1 1 1 1 1 1 1 1 3 1 1 2 2 2 Total cápsulas detectadas 66 19 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 5 (5 CÁPSULAS Y FONDO NO HOMOGÉNEO) Grupo Área (píxeles) 1 2 3 4 5 6.142 6.048 6.193 5.634 6.086 Cápsulas detectadas 1 1 1 1 1 Total cápsulas detectadas 67 5 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 6 (16 CÁPSULAS Y FONDO NO HOMOGÉNEO) Grupo Área (píxeles) 1 2 3 4 5 6 7 8 9 10 18.669 4.891 4.971 4.607 4.933 9.940 9.802 4.629 9.610 4.858 Cápsulas detectadas 4 1 1 1 1 2 2 1 2 1 Total cápsulas detectadas 68 16 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 7 (7 HOMOGÉNEO) CÁPSULAS DE OTRO MEDICAMENTO Y FONDO NO Observamos que, además, es aplicable también a otro tipo de unidosis (en este caso, Ibuprofeno). Grupo Área (píxeles) 1 2 3 4 5 6 3.542 7.584 3.459 3.521 3.214 3.187 Cápsulas detectadas 1 2 1 1 1 1 Total cápsulas detectadas 69 7 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 8 (9 CÁPSULAS DE OTRO MEDICAMENTO) Grupo Área (píxeles) 1 2 3 4 5 6 7 5.660 5.467 4.948 5.613 15.890 5.095 5.603 Cápsulas detectadas 1 1 1 1 3 1 1 Total cápsulas detectadas 70 9 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 6 APLICACIÓN AL CONTEO DE CAJAS 71 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 6.1 INTRODUCCIÓN En la farmacia hospitalaria, además de realizarse dispensación en forma de unidosis se dispensan cajas de medicamentos para los pacientes que acuden a recoger medicación. Estas cajas son apiladas en estanterías en los distintos almacenes de la farmacia, y trataremos de realizar un control del número de unidades a través de simples fotografías. Trabajaremos con dos tipos de medicamentos que son dispensados: Primperan 10mg/2ml en envases de 12 ampollas, y Nolotil 575 mg en envases de 25 cápsulas. 6.2 CONTEO DE CAJAS EN DOS DIMENSIONES El primer caso a tratar será aquel en el que solo exista un nivel de profundidad, es decir, aquel en el cual todas las cajas se encuentren a la vista, tal y como aparece en la Figura 63. Figura 63. Cajas con un nivel de profundidad. Trabajaremos en el primer ejemplo con cajas de Primperan, y para realizar la contabilización, recurriremos al algoritmo SURF para la detección de objetos. 72 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Para esto, para cada tipo de medicamento será necesario tener registrada una imagen de cada tipo de envase. En primer lugar, obtenemos de una base de datos de medicamentos el perfil de una caja de Primperan (Figura 64), y realizamos una captura de la escena donde se desean contar las cajas existentes (Figura 65). close all clear all fin=0; contar=0; boxImage = imread('primperan.jpg'); boxImage=boxImage(:,:,2); figure; imshow(boxImage); title(‘Perfil de una caja'); cam=webcam; cam.resolution='1280x960'; preview(cam); pause sceneImage=snapshot(cam); color=sceneImage; figure; imshow(color); title(‘Escena a analizar’); sceneImage=sceneImage(:,:,2); sceneImage=imadjust(sceneImage); % Variable contador % Imagen de envase de Primperan % Capa verde de la imagen % Inicialización de la cámara % Captura de la escena % Realce de intensidad Figuras 64 y 65. Perfil de una caja y escena a analizar. 73 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Iniciamos un bucle para la contabilización de las cajas, empleando el algoritmo de Surf. En cada paso por el bucle, el objetivo será la detección de una caja. En caso de detección, el lugar de la caja en la imagen de la escena, será reemplazado por un polígono opaco negro, aumentaremos el contador de cajas encontradas, e intentaremos la detección de una nueva, hasta que el algoritmo no detecte ninguna más, momento en el cual, el proceso habrá finalizado. while fin==0 % Inicio del bucle figure; imshow(sceneImage); boxPoints = detectSURFFeatures(boxImage); scenePoints = detectSURFFeatures(sceneImage); figure; imshow(boxImage); title('100 Feature Points más significativos de una muestra'); hold on; plot(selectStrongest(boxPoints, 100)); figure; imshow(sceneImage); title('300 Feature Points más significativos de la escena'); hold on; plot(selectStrongest(scenePoints, 300)); Figura 66. 100 puntos más significativos de una muestra. 74 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 67. 300 puntos más significativos de la escena. Seguidamente, extraemos los descriptores de los puntos más significativos, y buscamos emparejamientos (Figura 68) entre los descriptores de la imagen tipo para una caja de Primperan (Figura 66), y la escena de trabajo (Figura 67). Es importante indicar que, como es lógico, es necesario permitir múltiples coincidencias entre la imagen tipo y la escena de trabajo. [boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints); [sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints); boxPairs = matchFeatures(boxFeatures, sceneFeatures, 'MaxRatio',1,'Metric','SSD','Method','Threshold'); if isempty(boxPairs)==1 fin=1; end % Fin si no hay más coincidencias if fin==0 contar=contar+1; matchedBoxPoints = boxPoints(boxPairs(:, 1), :); matchedScenePoints = scenePoints(boxPairs(:, 2), :); 75 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA figure; showMatchedFeatures(boxImage, sceneImage, matchedBoxPoints, ... matchedScenePoints, 'montage'); title('Puntos combinados (Incluyendo Outliers)'); Figura 68. Puntos combinados (Incluyendo Outliers). [tform, inlierBoxPoints, inlierScenePoints] = ... estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, 'affine'); figure; showMatchedFeatures(boxImage, sceneImage, inlierBoxPoints, ... inlierScenePoints, 'montage'); title('Puntos combinados (Solamente Inliers)'); Figura 69. Puntos combinados (Solamente Inliers). 76 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Considerando solamente puntos inliers (Figura 69), obtenemos correspondencia de la imagen tipo, con una caja de la escena (Figura 70). la El paso siguiente será delimitar la región que corresponde a la caja que acaba de ser detectada. boxPolygon = [1, 1;... % Arriba izquierda size(boxImage, 2), 1;... % Arriba derecha size(boxImage, 2), size(boxImage, 1);... % Abajo derecha 1, size(boxImage, 1);... % Abajo izquierda 1, 1]; % Arriba izquierda de nuevo para cerrar newBoxPolygon = transformPointsForward(tform, boxPolygon); figure; imshow(sceneImage); hold on; line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y'); title('Caja detectada'); Figura 70. Caja detectada. Ahora rellenamos la caja detectada con un polígono opaco negro (Figura 71) y calculamos el área de este polígono, lo cual nos será útil más adelante en el caso de cajas agrupadas en varios niveles de profundidad. 77 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA [m,n]=size(sceneImage); ceros=zeros(m,n); dimension=numel(newBoxPolygon); vector=reshape(newBoxPolygon',dimension,1); sceneImage = insertShape(sceneImage,'FilledPolygon',{vector},'color','black','opacity',1); sceneImage=sceneImage(:,:,2); figure imshow(sceneImage); Figura 71. Escena de trabajo tras detección de caja. % Calculamos el área de la caja detectada cord(1,:)=vector(1:2,:); cord(2,:)=vector(3:4,:); cord(3,:)=vector(5:6,:); cord(4,:)=vector(7:8,:); cord(5,:)=vector(9:10,:); xv=cord(:,1); yv=cord(:,2); area(contar) = polyarea(xv,yv); % Almacenamos en vector area end end 78 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA A consecuencia de que una caja ha sido detectada, se volvería a entrar de nuevo en el bucle, realizando lo mismo que en el caso anterior una y otra vez por cada caja, hasta que se entre por última vez en el mismo en el momento que no haya más detecciones. En las Figura 72-77 se muestran los pasos que ocurren en la última entrada exitosa en el bucle tras haber detectado el resto de cajas. Figura 72. Escena de trabajo. Figura 73. 100 Puntos más significativos de una muestra. 79 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 74. 300 puntos más significativos de la escena. Figura 75. Puntos combinados (Incluyendo Outliers). 80 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 76. Puntos combinados (Solamente Inliers). Figura 77. Caja detectada. Finalmente, se volvería a machacar la escena con el último polígono negro, como se muestra en la Figura 78, y no se encontraría coincidencia alguna entra la imagen tipo de una caja y la escena de trabajo resultante, por lo que quedaría finalizado el caso. 81 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 78. Escena de trabajo. h = msgbox(['Se han encontrado las siguientes cajas: ' num2str(contar)]); Se muestran a continuación dos ejemplos prácticos de la aplicación del algoritmo para la detección de cajas con un único nivel de profundidad. 82 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 1 En este ejemplo podemos observar que el algoritmo es insensible a la rotación de las cajas, así como a pequeñas modificaciones que puedan producirse, como por ejemplo ocurre en la caja que presenta una marca roja. Figura 79. Escena a analizar. Figura 80. 100 Puntos más significativos de una muestra. 83 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 81. 300 puntos más significativos de la escena. Figura 82. Puntos combinados (Incluyendo Outliers). 84 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 83. Primera caja detectada. Figura 84. Última caja detectada. 85 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 2 En este caso trabajaremos con cajas de Nolotil, y podremos observar que el algoritmo es aplicable igualmente a otro medicamento. Figura 85. Escena a analizar. Figura 86. 100 puntos más significativos de una muestra. 86 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 87. 300 Puntos más significativos de la escena. Figura 88. Puntos combinados (Incluyendo Outliers). 87 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 89. Primera caja detectada. Figura 90. Última caja detectada. 88 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 6.3 CONTEO DE CAJAS EN TRES DIMENSIONES En el apartado anterior, se trató con el caso en el cual las cajas se encontraban apiladas en un único nivel de profundidad. Sin embargo, en este apartado, trabajaremos casos en los cuales las cajas se encuentren apiladas en varias tandas distintas, con situaciones en las que se encuentren apiladas en tantos niveles de profundidad como sea deseable. Figura 91. Cajas apiladas en dos niveles de profundidad. 89 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Será necesario que las cajas sean apiladas al fondo de la estantería siempre que sea posible, evitando la creación de huecos interiores invisibles a la aplicación (Figura 92). Figura 92. Hueco invisible. Situaciones como las de la Figura 92 llevarían a un cálculo incorrecto del total de cajas en el escenario, ya que trabajamos con una cámara situada en el frontal de todas las cajas, ignorando el contenido que existe en el interior de ellas. Trabajaremos con las áreas de los polígonos negros correspondientes a la detección de una caja. Aprovechando la perspectiva que se produce en las cámaras fotográficas, al igual que se produce en el ojo humano, los objetos situados más lejos respecto al objetivo se aprecian con un tamaño más pequeño que los que se encuentran más cerca. Por ello, las cajas situadas al más al fondo y que sean visibles a la cámara, tendrán un área más pequeña en la representación gráfica en dos dimensiones que se produce en una fotografía. En el siguiente ejemplo (Figura 93), trataremos un caso de una estantería con dos niveles de profundidad. 90 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 93. Cajas apiladas en dos niveles de profundidad. Aplicando el algoritmo del apartado 6.2, resulta la Figura 94, con polígonos negros en el lugar correspondiente a cada caja. Figura 94. Detección de cajas en dos dimensiones. 91 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Tras haber realizado un análisis con múltiples casos, se ha llegado a la conclusión de que el cociente entre el área del polígono de mayor de tamaño de un nivel de profundidad y cualquier otra caja presente en ese mismo nivel es inferior a 1.2, es decir, todas las cajas de un mismo nivel sufren como máximo un decremento de un 16.66% respecto al área de la caja de mayor. El vector area calculado en el apartado 6.2 nos da información acerca del área del frontal de cada una de las cajas Figura 95. Vector area. Debemos distinguir entre las cajas que se encuentran situadas a más profundidad y aquellas que se encuentran más cerca. Para ello, buscamos la caja de área mayor y le asignamos la etiqueta „1‟. Seguidamente, aquellas cajas con un área no inferior a un 16.66% del valor de la caja mayor con la etiqueta „1‟, serán etiquetadas igualmente con este mismo valor. Una vez completado el nivel „1‟, se vuelve a buscar a la caja mayor sin nivel asignado, y se repite el mismo proceso, asignándole la etiqueta „2‟ y a todas aquellas que no difieren más de un 16.66%. Por otra parte, aunque deben ser evitados, es posible que queden niveles intermedios no visibles a la fotografía, produciéndose un salto de nivel tal y como se aprecia en la Figura 96. Técnicamente, esto ocurrirá cuando la siguiente caja de mayor tamaño una vez completado el nivel anterior, presente un cociente superior a 2.3 respecto al mayor área del nivel anterior al que nos referimos, esto es, un decremento de un 56.5%. En este caso, la siguiente etiqueta a asignar para el siguiente nivel sería „3‟, ya que el nivel „2‟ no quedaría a la vista. Es posible que puedan producirse varios saltos en un mismo paso, para el caso de dos saltos, el cociente debe ser superior a 4.6, y la etiqueta a asignar sería „4‟, quedando ocultos los niveles „2‟ y „3‟ y así sucesivamente. 92 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Figura 96 Salto de nivel. En el ejemplo presente, no se produce ningún salto de nivel como se puede observar en la gráfica de la Figura 97 donde se muestran los límites para las cajas del mismo nivel, y para uno, dos y tres saltos de nivel. Observamos que el siguiente nivel sería el „2‟ (caja número 5). Figura 97. Área de las cajas y saltos correspondientes al primer nivel. 93 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA La caja de con mayor tamaño del nivel actual se representa en color rojo. Así pues como la siguiente caja mayor (la número 5), se encuentra fuera del rango de salto de nivel, se le asigna la etiqueta „2‟ y también a todas las demás dentro de los márgenes de su mismo nivel. De esta forma queda finalizado el proceso de etiquetado. Figura 98. Área de las cajas y saltos correspondientes al segundo nivel. El código que realiza el etiquetado en Matlab es el siguiente: agrupar=area; m=length(area); clases=zeros(1,m); rango=0; mayor=max(agrupar); while max(agrupar)>0 aux=max(agrupar); salto=floor((mayor/aux)/2.3); rango=rango+salto; % Cuenta el número de saltos de nivel % Actualiza la etiqueta mayor=max(agrupar); 94 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA rango=rango+1; for k=1:m % Etiqueta cajas en un mismo nivel if((mayor/agrupar(k))<1.2) clases(k)=rango; agrupar(k)=0; end end end Figura 99. Cajas etiquetadas. Una vez etiquetadas las cajas, resulta bien sencilla la contabilización de las mismas, conociendo el número de cajas interiores de la fila más cercana. Esto tiene fácil solución, con un valor de referencia ajustable según la posición de la cámara y el entorno de trabajo, o bien introduciendo el valor cerca manualmente. reord=max(clases)+min(clases); for k=1:m clases(k)=reord-clases(k); end % Inversión de etiquetas total=0; for k=1:m % Suma cajas total=total+cerca-(max(clases)-clases(k)); end 95 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA h = msgbox(['Se han encontrado las siguientes cajas: ' num2str(total)]); 6.3.1 EJEMPLOS A continuación se muestran varios casos prácticos de la aplicación del algoritmo de detección. Además, en ellos se irán mostrando cómo van siendo etiquetadas las cajas en cada nivel paso a paso. 96 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 1 (9 CAJAS) Caja 1 2 3 4 5 Área (píxeles) 4.7890e+04 2.8058e+04 2.7573e+04 4.6982e+04 9.7915e+04 Etiqueta 2 3 3 2 1 Total cajas detectadas 97 9 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 2 (8 CAJAS) Caja 1 2 3 4 Área (píxeles) 1.3034e+05 1.2261e+05 3.3655e+04 3.1509e+04 Etiqueta 3 3 1 1 Total cajas detectadas 98 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 3 (8 CAJAS) Caja 1 2 3 4 5 6 Área (píxeles) 6.6765e+04 7.5423e+04 4.2089e+04 4.2765e+04 3.8318e+04 4.4276e+04 Etiqueta 1 1 2 2 2 2 Total cajas detectadas 99 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 4 (7 CAJAS) Caja 1 2 3 4 5 6 7 Área (píxeles) 6.8637e+04 6.9922e+04 6.9749e+04 7.3629e+04 7.7605e+04 7.2206e+04 7.2802e+04 Etiqueta 1 1 1 1 1 1 1 Total cajas detectadas 100 7 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 5 (8 CAJAS) Caja 1 2 3 4 Área (píxeles) 2.4695e+04 4.9742e+04 1.8680e+05 2.6929e+04 Etiqueta 4 3 1 4 Total cajas detectadas 101 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 6 (8 CAJAS) Caja 1 2 3 4 5 Área (píxeles) 1.3153e+05 2.1985e+04 2.1716e+04 2.1663e+04 2.1638e+04 Etiqueta 1 4 4 4 4 Total cajas detectadas 102 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 7 (10 CAJAS) Caja 1 2 3 4 5 6 7 Área (píxeles) 6.2500e+04 6.7287e+04 3.7378e+04 3.7864e+04 3.6418e+04 6.4721e+04 3.5149e+04 Etiqueta 1 1 2 2 2 1 2 Total cajas detectadas 103 10 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 8 (10 CAJAS) Caja 1 2 3 4 5 Área (píxeles) 7.2801e+04 3.9260e+04 2.3752e+04 2.3135e+04 7.7374e+04 Etiqueta 1 2 3 3 1 Total cajas detectadas 104 10 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 9 (9 CAJAS) Caja 1 2 3 4 5 Área (píxeles) 6.2747e+04 6.2846e+04 2.2177e+04 2.0020e+04 2.1548e+04 Etiqueta 1 1 3 3 3 Total cajas detectadas 105 9 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 10 (9 CAJAS) Caja 1 2 3 4 Área (píxeles) 4.4042e+04 4.5311e+04 4.3410e+04 9.1145e+04 Etiqueta 2 2 2 1 Total cajas detectadas 106 9 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 11 (8 CAJAS) Caja 1 2 3 4 5 6 7 Área (píxeles) 6.2408e+04 3.4368e+04 3.3615e+04 3.4372e+04 3.0557e+04 3.2751e+04 3.3489e+04 Etiqueta 1 2 2 2 2 2 2 Total cajas detectadas 107 8 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 12 (10 CAJAS) Caja 1 2 3 4 Área (píxeles) 5.6817e+04 2.1645e+04 3.1790e+04 1.1973e+05 Etiqueta 2 4 3 1 Total cajas detectadas 108 10 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 6.3.2 CONTEO DE CAJAS CON KINECT En el último apartado hemos realizado el conteo de las cajas calculando niveles de profundidad en función del tamaño de las mismas, en una foto en dos dimensiones convencional. Sin embargo, si disponemos una cámara que nos proporcione información acerca de la coordenada Z en una fotografía, puede resultar interesante el uso de la misma. En nuestro caso, disponemos de una Kinect para Xbox 360 compatible con Windows y Matlab, e intentaremos aprovechar los valores de profundidad en una fotografía que esta cámara especial nos ofrece. El principal inconveniente que se ha detectado en la práctica ha sido el hecho de que la versión de Kinect de la que se dispone no es capaz de trabajar con el modo cercano, por lo que los objetos deben estar situados a 80 centímetros como mínimo del sensor de profundidad para poder obtener una medida del eje Z. Por ello, ha sido necesario situar las cajas bastante alejadas de la cámara, perdiéndose de esta forma precisión en las imágenes RGB que la Kinect captura, y haciendo imposible la detección de un perfil de una caja con esta misma cámara a una distancia superior a 80 centímetros. Por todo esto, el problema ha sido resuelto aplicando en primer lugar el conteo de cajas en dos dimensiones con una cámara convencional, como en el apartado 6.2, y posteriormente, detectando la distancia de cada una de estas cajas con la Kinect que disponemos para el proyecto. En los ejemplos que veremos, trabajaremos con cajas situadas en dos niveles distintos de profundidad. En este primer ejemplo, dispondremos de un total de 5 cajas, apiladas en dos niveles de profundidad, 4 de ellas en el nivel más lejano, y la última delante de estas. Figura 100. Cajas apiladas a dos niveles de profundidad. 109 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Aplicando el algoritmo del apartado 6.2 para cajas en dos dimensiones, obtendríamos el número total de cajas detectadas frontalmente como se muestra en la Figura 101. Figura 101. Detección de cajas en dos dimensiones Dicho valor numérico queda almacenado en la variable contar, y será utilizado a continuación tras el empleo de la Kinect. colorVid = videoinput('kinect',1); depthVid = videoinput('kinect',2); % Inicio de cámara de distancia handleToAxes = axes(); hImage = image(zeros(480,640,'uint8')); hold off; axis auto; axis on; preview(colorVid, hImage); % Inicia vista previa hold on 110 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA thisBB = [227 345 210 135]; % Crea área para recortar en preview rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)], 'EdgeColor','r','LineWidth',2 ) pause sceneImage=getsnapshot(colorVid); depthImage=getsnapshot(depthVid); depthImage = imcrop(depthImage, thisBB); sceneImage = imcrop(sceneImage, thisBB); depthImage=fliplr(depthImage); sceneImage=fliplr(sceneImage); % % % % % % Captura imagen a color Captura imagen profundidad Recorta imagen profundidad Recorta imagen color Imagen espejo (real) Imagen espejo (real) RGB=label2rgb(depthImage); figure imshow(sceneImage) figure imshow(depthImage) figure imshow(RGB) % Convierte a escala color % DepthImage a escala grises % DepthImage a escala color Figura 102. Previsualización e imagen a color recortada. Figura 103. DepthImage a escala de grises y escala de color. 111 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA A continuación, calculamos el histograma de distancias en milímetros de cada punto de la imagen de profundidad (Figura 104). x=500:10:1500; figure, hist(double(depthImage),x); u=hist(double(depthImage),x); Figura 104. Histograma de distancias. Podemos observar que las cajas corresponden a las muestras situadas entre los valores 800 y 1100 centímetros, el resto será información no deseada que filtraremos. Las cajas situadas en el nivel más lejano a la cámara serán aquellas con pixeles con distancias comprendidas entre 910 y 1100 milímetros de distancia y aquellas cajas más cercanas tendrán valores entre 800 y 910 milímetros. Así pues, eliminamos todos esos valores fuera de esos rangos, quedándonos con los valores correspondientes a las cajas, y realizamos una cuenta del número de píxeles correspondientes a la caja del nivel posterior y del nivel más cercano. dim=size(depthImage); % Dimensión imagen recortada alto=dim(1,1); ancho=dim(1,2); copia=zeros(alto,ancho); 112 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA for i=1:alto for k=1:ancho copia(i,k)=depthImage(i,k); if depthImage(i,k)>1100 copia(i,k)=0; end if depthImage(i,k)<800 copia(i,k)=0; end if copia(i,k)<910&&copia(i,k)>800 cerca=cerca+1; end if copia(i,k)>910&&copia(i,k)<1100 lejos=lejos+1; end % Filtra valores % Filtra valores % Píxeles nivel más cerca % Píxeles nivel más lejos end end RGB2=label2rgb(copia); figure imshow(RGB2) figure, hist(double(copia),x); v=hist(double(copia),x); % Conversión a color % DepthImage (Solo cajas) % Nuevo histograma Figura 105. Nueva imagen de profundidad y nuevo histograma. 113 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA Obtener el total de cajas conocido el porcentaje de píxeles de la fotografía correspondiente al nivel cercado es bien sencillo. Calculamos el número de cajas del primer nivel multiplicando el porcentaje de área delantera por el total de cajas en dos dimensiones, y truncamos la parte decimal debido a que las zonas más cercanas presentan un mayor número de píxeles debido a la perspectiva. Este valor sumado al total de cajas en dos dimensiones nos da el número total de cajas de la figura. areadelante=cerca/(cerca+lejos); % Porcentaje área delante cajasdelante=floor(contar*areadelante); h = msgbox(['Porcentaje de área delante: ' num2str(areadelante)]); h = msgbox(['Cajas delante: ' num2str(cajasdelante)]); h = msgbox(['Número total de cajas: ' num2str(cajasdelante+contar)]); Por último, se muestran varias situaciones posibles y los valores numéricos y resultados obtenidos. 114 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 1 (7 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 5 0.4677 2.33 2 7 Histograma de distancias de cajas obtenido 115 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 2 (7 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 7 0 0 0 7 Histograma de distancias de cajas obtenido 116 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 3 (9 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 6 0.5792 3.4754 3 9 Histograma de distancias de cajas obtenido 117 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 4 (8 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 4 1 4 4 8 Histograma de distancias de cajas obtenido 118 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 5 (5 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 3 0.7186 2.1558 2 5 Histograma de distancias de cajas obtenido 119 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 6 (10 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 7 0.5034 3.5241 3 10 Histograma de distancias de cajas obtenido 120 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 7 (8 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 8 0 0 0 8 Histograma de distancias de cajas obtenido 121 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA EJEMPLO 8 (10 CAJAS) Imagen a color y de profundidad obtenida con Kinect Número de cajas detectadas nivel posterior Porcentaje de área nivel frontal Número de cajas detectadas nivel frontal Número de cajas detectadas nivel frontal (truncado) Total cajas detectadas 7 0.1786 1.2504 1 8 Histograma de distancias de cajas obtenido 122 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA CAPÍTULO 7 CONCLUSIONES 123 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA 7.1 CONCLUSIONES Según hemos visto en este proyecto, es posible aplicar distintos métodos para el conteo de medicamentos unidosis y de cajas de medicamentos en una farmacia de un hospital. Estos métodos resultan muy eficaces y su puesta real en práctica puede facilitar el trabajo en la realización de inventarios. Sin embargo, posibles futuras mejoras y líneas de investigación, podrían hacer más efectivas las propuestas desarrolladas en el presente documento. En el conteo de medicamentos unidosis, pienso que podría ser bastante útil la utilización de una báscula electrónica con cierta precisión para realizar conteos utilizando el peso de las cápsulas. En cuanto al conteo de cajas, considero interesante el diseño de una estantería con cierta pendiente, donde las cajas vayan apilándose siempre al fondo, facilitando una correcta distribución de una forma cómoda. Este diseño no debe presentar mucha dificultad, y podría llevarse a la práctica con la utilización de una impresora de tres dimensiones. En dicha estantería resultaría también bastante útil la inclusión de un código QR que, al ser detectado, pueda identificar de manera rápida el tipo de medicamento que está siendo analizado, y el posterior almacenamiento y tratamiento de los datos obtenidos en una aplicación que permita llevar el control de una manera más automatizada del stock de la farmacia. En cuanto a la utilización de una Kinect, las dificultades presentadas al utilizar un ejemplar sin modo cercano, han impedido un uso más provechoso de la misma. Pienso que una Kinect con este modo, facilitaría bastante las cosas. Finalmente, como opinión personal respecto al trabajo, pienso que me ha sido bastante útil para profundizar conocimientos sobre visión artificial campo sobre el cual, me encontraba bastante interesado, de hecho por eso elegí un proyecto de este tipo. Destacar que me siento muy satisfecho con el proyecto realizado y de esta manera poner así fin así a mi etapa como estudiante de ingeniería de telecomunicaciones. Sevilla, marzo de 2016 124 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA BIBLIOGRAFÍA [1] Parra Guerrero, F., 2005. “Gestión de stocks”. 3ª ed. Editorial ESIC, Madrid [2] Rambaux, A., 1988. “Gestión económica de stocks”. 2ª ed. Editorial Hispano Europea, Barcelona [3] Guerrero-Salas, H., 2010. “Inventarios. Manejo y control”. Editorial Starbook Madrid [4] López Ramírez, A., 2014. “Optimización de Estimación de la Demanda en Servicio Farmacéutico Hospitalario”. Escuela Superior de Ingeniería. Universidad de Sevilla [5] Maestre Torreblanca, J.M., Isla Tejera, B., Fernández García, M.I., del Prado Llergo, J.R., Álamo Cantarero, T., Fernández Camacho, E., 2011. “Análisis y minimización del riesgo de rotura de stock aplicado a la gestión en farmacia hospitalaria”. Farm Hosp. 2012; 36(3):130-134 [6] Díaz-Maroto, S. “Gestión del material sanitario en el Servicio de Farmacia del Hospital General Penitenciario: (I) Clasificación y elaboración de una Guía de material sanitario. Farm Hosp 1995; 19: 105-8 [7] Muller, M., 2005. “Fundamentos de administración de inventarios”. Editorial Norma [8] Image Acquisition Toolbox for use with MATLAB®: user's guide, 2014 [9] Image Processing Toolbox for use with MATLAB®: user's guide, 2014 [10] Computer Vision System Toolbox for use with MATLAB®: user's guide, 2014 125 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA [11] Vélez Serrano, J. F., Moreno Díaz, A. B., Sánchez Calle, A., 2007. “Visión por computador”. 2ª ed. [12] García, I.D., 2008. “Visión Artificial y Procesamiento Digital de Imágenes usando Matlab”. Ecuador [13] Gonzalez, R.C., Woods R., 2007. "Digital Image Processing", 3ª ed. AddisonWesley [14] Maravall, D., 1993. "Reconocimiento de Formas y Visión Artificial". Editorial Rama [15] Procesamiento de imágenes con Matlab asignatura.us.es/imagendigital/Matlab_PID_1314.pdf [16] Segmentación de imágenes http://asignatura.us.es/imagendigital/Tema5_SegmentacionRegionesUmbralizacion.pdf [17] Fundamentos de la visión artificial https://rodas5.us.es/file/26a3632e-7124-4e72-b045d9ae3edd3938/1/Fundamentos%20de%20la%20Vision%20Artifical.pdf [18] Passariello, G., Mora, F., 1995. “Imágenes Médicas: Adquisición, Análisis, Procesamiento e Interpretación”. 1ª ed. Editorial Equinoccio. Venezuela [19] Legua, C., 2013 “Seguimiento automático de objetos en sistemas con múltiples cámaras”. Escuela Politécnica Superior. Madrid 126 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA [20] Romero, A., Cazorla, M., 2009. “Comparativa de detectores de características visuales y su aplicación al SLAM”. X workshop de agentes físicos. Cáceres [21] H. Bay, T. Tuytelaars,L. V. Gool, 2006 “Surf: Speeded up robust features”. ECCV, pp. 404–417 [22] Aracil, R., 2013 “Desarrollo de un sistema cognitivo de visión para la navegación robótica”. Escuela Técnica Superior de Ingeniería Informática. Universidad Politécnica de Valencia. Valencia [23] Lowe, D., 1999. "Object recognition from local scale-invariant features". Proceedings of the International Conference on Computer Vision. 2. pp. 1150–1157 [24] Guerrero, W., 2011 “Detección y descripción de puntos característicos en imágenes multiespectrales utilizando esquemas clásicos”. Escuela Superior Politécnica del Litoral. Guayaquil [25] Peraza, J.M., 2009 “Estimación de la distancia recorrida por un robot móvil mediante la utilización de descriptores surf”. Escuela Politécnica Superior. Universidad Carlos III. Madrid [26] Sistema de distribución de medicamentos por dosis unitarias http://www.sefh.es/bibliotecavirtual/ops/sdmdu.pdf [27] Gestión de stocks de medicamentos http://es.slideshare.net/ugcfarmaciagranada/pnt-13-gestin-de-stocks-de-medicamentos [28] Hospital regional de Málaga. Área de dosis unitaria http://www.hospitalregionaldemalaga.es/InforCorporativa/UnidadesdeGesti%C3%B3nC l%C3%ADnica/UGCFarmacia/AreaDosisUnitaria.aspx 127 APLICACIONES DE VISIÓN POR COMPUTADOR EN FARMACIA HOSPITALARIA [29] Object Detection in a Cluttered Scene Using Point Feature Matching http://es.mathworks.com/help/vision/examples/object-detection-in-a-cluttered-sceneusinusing-point-feature-matching.html [30] Near mode in Kinect https://blogs.msdn.microsoft.com/kinectforwindows/2012/01/20/near-mode-what-it-isand-isnt/ [31] Modo de funcionamiento normal de una Kinect http://kinectformatlab.es.tl/MODO-DE-FUNCIONAMIENTO-NORMAL.htm [32] Aplicaciones con Microsoft Kinect https://decibel.ni.com/content/blogs/carlosotiniano/2014/04/09/aplicaciones-conmicrosoft-kinect [33] Mapeo de intensidad de una imagen http://www-gva.dec.usc.es/~mjose/docencia/3ciclo/tema1.htm 128