Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
POSGRADO/MSC SEP SES TNM INSTITUTO TECNOLÓGICO DE CHIHUAHUA II “SOFTWARE DE INDEXADO DE PATRONES DE DIFRACCIÓN” TESIS PARA OBTENER EL GRADO DE MAESTRA EN SISTEMAS COMPUTACIONALES PRESENTA TANIA PAOLA CAMPOS FRÍAS DIRECTOR DE TESIS M. C. RAFAEL VÁZQUEZ PÉREZ CO-DIRECTOR DE TESIS M. C. CARLOS ELÍAS ORNELAS GUTIÉRREZ CHIHUAHUA, CHIH., JUNIO DE 2016 ii DEDICATORIA Dedico este trabajo a mi madre, quien me ha acompañado en mi trayecto profesional y de vida y ha sido siempre el mayor pilar de mis logros; quien me enseña cada día que no hay mejor forma de hacer las cosas que con responsabilidad y trabajo duro. iii AGRADECIMIENTOS A mis maestros por todo el conocimiento compartido, por su paciencia y por la ayuda que me brindaron a lo largo de este camino. A Carlos Elías Ornelas Gutiérrez y Rafael Vázquez Pérez por la orientación tan acertada, por el inmenso apoyo que recibí en cada una de las etapas de este trabajo y por la confianza en mí para concluirlo. Agradezco además al Consejo Nacional de Ciencia y Tecnología (CONACYT) por el soporte otorgado para la culminación satisfactoria de mis estudios de maestría. iv RESUMEN El presente trabajo de tesis se realizó con el objetivo de desarrollar un software que permita a los investigadores del Centro de Investigación en Materiales Avanzados (CIMAV) analizar imágenes que contienen patrones de difracción, así como efectuar mediciones de ángulos y distancias entre distintos puntos característicos (señales) comprendidos en los patrones bajo estudio. La razón principal para elaborar este sistema es que los investigadores deben realizar el proceso de análisis e indexación de patrones de difracción de forma manual, tarea que se torna tediosa provocando que sea más propensa a errores humanos. Por lo tanto, se diseñó una herramienta para asistir en la indexación de patrones en imágenes y facilitar el proceso de detección de señales, logrando con ello una medición más acertada entre los elementos del patrón de difracción analizado. Así, para el desarrollo de esta aplicación se utilizaron diversos algoritmos de análisis de imágenes a través de la librería especializada en el procesamiento de imágenes llamada OpenCV en conjunto con el lenguaje de programación C++, empleando además el Entorno de Desarrollo Integrado (IDE) Qt Developer. v ABSTACT The main objective of this thesis is to develop a software to allow CIMAV (Centro de Investigación en Materiales Avanzados) researchers to analize images containing diffraction patterns and perform measurements in the pattern to obtain the distances and angles between the characteristic spots (signals) in the image. The primary reason to build this system is that researchers need to carry out the process of analyzing and indexing the diffraction pattern manually. This can become a very tedious labour, which could make it more susceptible to human errors. Therefore, the software tool presented here was designed to assist in the diffraction patterns indexing process, simplifying the actions followed to identify signals in the image resulting in more accurate measurement between the elements on the diffraction pattern under analysis. Hence, many image processing algorithms were used to achieve the construction of this application, consumed from the specialized image-processing library OpenCV along with the C++ programming language and the Integrated Development Environment (IDE) called Qt Developer. vi ÍNDICE ÍNDICE ............................................................................................................... vi ÍNDICE DE FIGURAS ...................................................................................... viii I. INTRODUCCIÓN ....................................................................................... 1 1.1. Introducción al proyecto ....................................................................... 1 1.2. Planteamiento del problema ................................................................ 3 1.3. Alcances y limitaciones ........................................................................ 5 1.4. Justificación ......................................................................................... 6 1.5. Objetivos .............................................................................................. 7 1.6. Supuestos o Hipótesis. ........................................................................ 8 II. ESTADO DEL ARTE .................................................................................. 9 III. MARCO TEÓRICO .................................................................................. 11 3.1. Cristalografía ...................................................................................... 11 3.2. TEM ................................................................................................... 15 3.3. Fase ................................................................................................... 16 3.4. Indexación .......................................................................................... 17 3.5. Ley de Bragg ...................................................................................... 18 3.6. Redes neuronales .............................................................................. 19 3.7. Análisis de imágenes ......................................................................... 21 3.8. Procesamiento de imágenes .............................................................. 26 3.9. Operaciones morfológicas ................................................................. 29 3.10. OpenCV ........................................................................................... 32 3.11. Operaciones matemáticas ............................................................... 52 IV. DESARROLLO ........................................................................................ 54 4.1. Análisis ............................................................................................... 55 4.2. Diseño ................................................................................................ 56 4.3. Implementación .................................................................................. 63 5.4. Pruebas .............................................................................................. 84 V. RESULTADOS Y DISCUSIÓN ................................................................ 90 VI. CONCLUSIONES .................................................................................... 92 BIBLIOGRAFÍA ................................................................................................ 93 ANEXOS .......................................................................................................... 97 vii Anexo 1. Pruebas del sistema aplicadas a imágenes con diferentes tipos de patrones de difracción, con la imagen original a la izquierda y la imagen procesada por SIPAD. .................................................................................................... 97 Anexo 2. Publicación en la revista Journal of Mechanical Engineering and Automation .................................................................................................... 99 Anexo 3. Diagrama de clases del sistema. ................................................. 107 Anexo 4.Manual de usuario SIPAD. ........................................................... 108 GLOSARIO .....................................................................................................126 viii ÍNDICE DE FIGURAS Figura III.1. Estructura cristalina, imagen microscópica y patrón de difracción de un diamante. .. 12 Figura III.2. Estructura, imagen microscópica y patrón de difracción de una muestra de grafito. . 13 Figura III.3. Estructura, imagen microscópica y patrón de difracción de una muestra de carbón. . 14 Figura III.4. Patrón de difracción del diamante y del carbón. ......................................................... 16 Figura III.5. Ejemplo de indexación de un patrón de difracción. .................................................... 17 Figura III.6. Representación gráfica de la ley de Bragg. ................................................................. 18 Figura III.7. Imagen binaria............................................................................................................. 21 Figura III.8. Imagen en escala de grises. ......................................................................................... 21 Figura III.9. Imagen RGB. .............................................................................................................. 22 Figura III.10. Representación de un píxel en una imagen RGB y con colores indexados. ............. 23 Figura III.11. Imagen de Lena en escala de grises y su histograma. ............................................... 25 Figura III.12. Ejemplos de Kernel del filtro de media .................................................................... 26 Figura III.13. Ejemplo de un kernel de 3x3 para un filtro Gaussiano. ............................................ 27 Figura III.14. Estructura del kernel vertical y horizontal del operador Sobel. ................................ 28 Figura III.15. Tipos principales de conectividad. ............................................................................ 29 Figura III.16. Ejemplo de dilatación y erosión sobre el objeto A, por medio del kernel B. ............ 31 Figura III.17. Umbralización tipo binaria. ....................................................................................... 38 Figura III.18. Umbralización tipo binaria inversa. .......................................................................... 39 Figura III.19. Umbralización tipo trunca. ........................................................................................ 39 Figura III.20. Umbralización a cero. ............................................................................................... 39 Figura III.21. Umbralización a cero inversa. ................................................................................... 40 Figura III.22. Método ADAPTIVE_THRESH_MEAN_C aplicado a una imagen. ....................... 41 Figura III.23. Método ADAPTIVE_THRESH_GAUSSIAN_C aplicado a una imagen. ............... 41 Figura IV.1. Etapas del modelo en cascada. .................................................................................... 54 Figura IV.2. Prototipo de la interfaz de usuario. ............................................................................. 57 Figura IV.3. Pasos del algoritmo de pre-procesamiento. ................................................................ 58 Figura IV.4. Acercamiento a los píxeles de distintas señales en la imagen. ................................... 60 Figura IV.5. Flujo de navegación del usuario. ................................................................................ 61 Figura IV.6. Flujo de navegación del sistema. ................................................................................ 62 Figura IV.7. Valor de la escala medida con la aplicación SimpleMeasure a) y con SIPAD b). ..... 86 Figura IV.8. Medición realizada sobre la misma imagen con a) SimpleMeasure y b) SIPAD. ...... 87 Figura IV.9. Medición de ángulos con a) SimpleMeasure y b) con SIPAD. .................................. 88 Figura IV.10. Mediciones de distancia entre varios pares de puntos realizadas con SIPAD .......... 89 ix ÍNDICE DE TABLAS Tabla VI.1. Comparación del algoritmo final............................................................................ 91 INTRODUCCIÓN 1 I. INTRODUCCIÓN 1.1. Introducción al proyecto La microscopía electrónica de transmisión (TEM, por sus siglas en inglés) es una técnica muy empleada para la caracterización de materiales a nivel mundial, esta técnica es ampliamente usada en la investigación científica para comprender el comportamiento de los materiales en ciencia básica, determinar o predecir propiedades de los materiales en ciencia aplicada y ampliamente usada en la industria como técnica de caracterización de materiales; el Centro de Investigación en Materiales Avanzados de Chihuahua (CIMAV) cuenta con tres TEM que son usados en proyectos de ciencia básica, ciencia aplicada y servicios a la industria. De estos TEM se obtienen imágenes que permiten caracterizar una muestra con excelente resolución (incluso resolución atómica) determinando su morfología, estructura cristalina, composición elemental y determinación de estructura electrónica. Esta amplia caracterización permite asociar las características del material con sus propiedades físicas y químicas y predecir el comportamiento que tendrán los materiales en determinadas circunstancias, permitiendo identificar sus propiedades para utilizarlos en las aplicaciones específicas que se requieran. Una parte muy importante dentro de la caracterización de materiales a partir de las imágenes obtenidas del TEM es la estructura cristalina, ya que la mayoría de las veces es la responsable de muchas propiedades de los materiales; de tal forma que para un material con la misma composición química pero diferente estructura cristalina (arreglo periódico de los átomos) las propiedades cambian drásticamente, como en el caso del carbón, donde sus propiedades son muy diferentes si hablamos de diferentes estructuras cristalinas (carbón amorfo, grafito, diamante, nanotubos de carbono, etc.), además existen otros materiales que pueden formar múltiples estructuras cristalinas como el caso del fierro el cual puede formar estructuras cristalinas diferentes, en combinación con otros átomos como el oxígeno (FeO, Fe2O3, Fe3O4), el carbono (Fe3C), etc. Los elementos que conforman las estructuras cristalinas de las cuales se componen los materiales, influyen enormemente en sus propiedades químicas y físicas y, aun cuando sus tamaños se encuentran en el orden de los nanómetros, es necesario determinar qué INTRODUCCIÓN 2 tipo de estructura cristalina está formada en el material de interés para conocer las cualidades y capacidades del mismo. Para obtener la estructura cristalina de los materiales por TEM, se incide un haz de electrones sobre la muestra de interés. Cuando el haz llega a la muestra, algunos de los electrones son difractados de acuerdo a la ley de Bragg, por lo que si el material posee una estructura cristalina (ordenada), el resultado será un patrón de difracción con señales muy intensas, las cuales están relacionadas con las distancias interplanares (distancia entre átomos con repetición periódicamente) del material en estudio. Los patrones de difracción obtenidos son capturados mediante el uso de cámaras especiales, las cuales generan imágenes cuya representación normalmente está dada en escalas nanométricas, y posteriormente se realizan mediciones de distancias y ángulos de forma manual sobre dichos patrones para determinar la o las fases (ordenamiento cristalino de sus átomos) presentes en el material, así como relaciones de orientación y crecimiento cristalino. A este proceso de medición se le conoce como indexación. Un método que ha sido ampliamente utilizado para el reconocimiento y clasificación de patrones es la utilización de redes neuronales, en áreas tan diversas como medicina, biología, física, química (Amato,et al., 2013), inteligencia artificial, robótica, videojuegos (Kumar & Mitra Thakur, 2012) y astronomía (De la Calleja & Fuentes, 2004). Esto se debe a que las redes neuronales analizan y clasifican de manera muy confiable los patrones dados en una fracción del tiempo que le tomaría a una persona, eliminando además los posibles errores humanos que esto último implica. Asimismo, las redes neuronales tienen la capacidad de aprender, por lo que aún si se introducen patrones desconocidos se adaptará a los nuevos datos y en base a la información que ya tiene deducirá la respuesta. Esto es muy útil cuando se tiene una gran cantidad de muestras que deben procesarse y clasificarse, ya que la red se encarga de la clasificación en un periodo de tiempo mucho menor del que le toma a una e incluso a varias personas hacerlo. INTRODUCCIÓN 3 1.2.Planteamiento del problema La indexación de patrones de difracción tradicionalmente en el CIMAV se ha realizado en forma manual, con poca automatización y no se han desarrollado sistemas previos a este proyecto. Generalmente se utiliza el software Simple Measure, un programa que permite a los investigadores medir de forma semiautomática los ángulos y distancias entre ciertos puntos del patrón de difracción que considere relevantes; es decir, el usuario determina y selecciona los puntos en la imagen que le son de interés para que el software realice las mediciones pertinentes sobre ellos. Además, se pueden colocar referencias horizontales y verticales que faciliten la medición, así como cambiar los colores de las mediciones, aumentar o reducir el zoom de la imagen e incluir una barra con información de la imagen como escala, fecha, hora, longitud de onda del haz de electrones y la longitud de cámara (distancia en centímetros a la cual se tomó la fotografía del patrón). Asimismo, se utilizan procesadores de imágenes como imageJ o Digital Micrograph. Estos programas permiten realizar mediciones directas sobre los patrones de difracción; sin embargo, no son aplicaciones especializadas para indexar patrones de difracción por lo que trabajar con ellos hace que el proceso sea aún menos automático que con el llamado Simple Measure. Existen también otras aplicaciones que permiten el análisis de patrones de difracción. Una de ellas es ProcessDiffraction, la cual es gratuita y ofrece diversas herramientas para extraer información de patrones de difracción, como la localización del centro del patrón, generación de semicírculos para reducir la probabilidad de procesar “anillos falsos” que pudieran afectar el análisis, permitir al usuario encontrar posibles valores de indexación al ingresar ciertos datos al programa, entre otras (Lábár, "ProcessDiffraction": A computer program to process electron, 2000; Lábár, Consistent indexing of a (set of) single crystal SAED pattern(s) with the ProcessDiffraction program, 2004) Otro programa es Java Electron Microscope Simulator (JEMS), desarrollado por Pierre Stadlemann para el análisis de difracción de electrones y la simulación de imágenes en la ciencia de análisis de materiales. Este software es comercial, sin embargo ofrece una versión demo limitada (Stadelmann, JEMS, 2004; Stadelmann, Simulation of diffraction patterns and high, 2008) INTRODUCCIÓN 4 Por su parte, la aplicación Image-Pro Plus es un poderoso analizador de imágenes que permite, entre otras cosas: Obtener imágenes desde una cámara, microscopio, videograbadora o escáner en formato TIFF, JPEG, BMP, TGA, y muchos otros. Rastrear y contar objetos manual o automáticamente. Medir atributos de los objetos tales como área, ángulos, perímetro, redondez y relación de aspecto, en las unidades de medida preferidas por el usuario. Visualizar los datos de forma numérica, estadística o gráfica. La licencia de este software tiene un costo de aproximadamente $5,500.00 USD y está bloqueado por hardware, por lo que incluye un centinela que se conecta a un puerto paralelo o USB de la máquina en la que se vaya a utilizar el programa para activarlo (Media Cybernetics, Image-Pro Plus, 2003; Media Cybernetics, Image-Pro Plus, 2003). Obtener información en el TEM requiere de un análisis detallado para su correcta interpretación. Al ser los patrones de difracción de tanta importancia, requieren que se les preste especial atención; sin embargo, la interpretación de los mismos es realizada en forma manual por lo que el tiempo invertido para ello es grande, además existe una elevada posibilidad de que ocurran errores humanos y la dificultad para observar todos los detalles que puede llegar a tener el patrón. Contar con un sistema inteligente capaz de agilizar la interpretación de los datos, así como evitar errores humanos de medición, mostrando todos los detalles del patrón, enriquecerán en gran manera el estudio del material en cuestión, asimismo incrementarán en gran manera la capacidad de análisis al disminuir el tiempo de interpretación. INTRODUCCIÓN 5 1.3.Alcances y limitaciones Se desarrollará un software que indexe de manera semiautomática patrones de difracción dados; es decir, que realice la medición de distancias y ángulos de ciertos patrones en base a un punto principal que el software deberá determinar. El tipo de patrones de difracción que se procesarán serán únicamente aquellos con forma de puntos, debido a las grandes diferencias que existen entre cada uno de los distintos tipos de patrones (de anillos, puntos, líneas, arcos, etc.). Si bien en el inicio del proyecto se consideró el uso de redes neuronales para la clasificación de los patrones de difracción a analizar, se descartó el uso de las mismas debido a que al procesar únicamente un tipo de patrón en específico (de puntos), ya no fue necesaria la utilización de un clasificador, puesto que ya no hay elementos qué catalogar. Asimismo, el software no incluirá la caracterización del material, lo que significa que solamente otorgará ciertos valores numéricos como resultado y usando estos resultados, la determinación del material debe realizarse por el investigador mediante otros sistemas o herramientas. De esta forma, el desarrollo del sistema no comprende el uso de una base de datos para la consulta e interpretación de los valores obtenidos y, por consiguiente, tampoco la determinación del material o de los materiales incluidos en la muestra analizada. INTRODUCCIÓN 6 1.4.Justificación En la actualidad los investigadores del CIMAV realizan el proceso de medición sobre las imágenes de patrones de difracción ya sea de forma manual (imprimiendo la imagen obtenida del TEM para utilizar regla y transportador en ella o midiendo con estas herramientas directamente sobre el monitor) o auxiliados de un software de medición que tiene implementados instrumentos para que los investigadores realicen las mismas actividades que en el proceso manual, con la diferencia que se tienen utensilios virtuales en lugar de los físicos convencionales. Estos métodos de indexado, aún con la experiencia de los investigadores, son propensos a errores humanos; razón por la cual mediante este proyecto se pretende semi-automatizar el indexado de patrones de difracción de modo que el proceso de indexado de las imágenes sea más sencillo, rápido y eficaz para los investigadores del CIMAV. Asimismo, la interpretación de los resultados de forma rápida y precisa estará al alcance de los investigadores interesados mediante la instalación del software desarrollado para el indexado de patrones de difracción en sus equipos. De esta manera la computadora con el software propio del microscopio solamente será utilizada para la captura de imágenes, y cada investigador podrá realizar el análisis de los resultados en cualquier otro equipo de cómputo que tenga el software instalado. INTRODUCCIÓN7 1.5.Objetivos El objetivo de este trabajo es desarrollar un software capaz de procesar una imagen de un patrón de difracción obtenida de un Microscopio Electrónico de Transmisión que sugiera al usuario la localización de los distintos puntos de interés en la imagen para que en base a ellos pueda realizar las mediciones correspondientes, facilitando con esto la interpretación de los patrones destacando los detalles difíciles de observar a simple vista. INTRODUCCIÓN 8 1.6.Supuestos o Hipótesis. El desarrollo de una herramienta para indexar patrones de difracción permitirá auxiliar a los investigadores y alumnos del CIMAV en el análisis de imágenes de patrones de difracción mediante la automatización del proceso de identificación de puntos de interés en ellos y simplificando así la tarea de indexación a los usuarios. ESTADO DEL ARTE 9 II. ESTADO DEL ARTE Image Processing Library & Toolbox (IPLT) es un entorno modular para el procesamiento de patrones de difracción de electrones (Schenk, Philippsen, Engel, & Walz, 2013). Todos sus módulos están escritos en el lenguaje C++ y pueden accederse desde una interfaz gráfica de usuario o a través de línea de comandos para satisfacer las necesidades de uso de los usuarios avanzados tanto como de usuarios inexpertos. Este software permite al usuario determinar la forma de la barrera (beam stopper) que cubre el haz de electrones más intenso, el cual generalmente se encuentra en el punto central del patrón de difracción, a fin de proteger el lente de la cámara; además de ubicar y verificar el espacio entre los distintos átomos del patrón, conocido como enrejado, y la posición de dicha barrera (Jensen, 2010). Asimismo, existe un programa para la búsqueda de picos de intensidad de las señales llamado AMP (Autocorrelation Mapping Program, Programa de Mapeo de Auto-correlación), en el cual se utiliza un algoritmo de auto correlación para intensificar la señal y centrar la imagen en el enrejado aparente. Es importante la intensificación de la señal para mejorar la relación señal a ruido, así como para identificar los puntos de difracción ocultos por la barrera o por el ruido de la imagen. AMP está escrito en MATLAB para el sistema operativo Windows. Está compilado en un programa ejecutable de libre descarga y para uso académico (Jiang, Georgieva, Nederlof, Liu, & Abrahams, 2011; Leiden, 2011). Otro programa para el análisis de patrones de difracción es el desarrollado por Li (2015) para la simulación y el análisis de patrones de difracción de muestras monocristalinas, llamado SAED2s (Simulation and Analysis of Electron Diffraction Pattern, Simulación y Análisis de Patrones de Difracción de Electrones). Entre las características de SAED2s se incluye la simulación interactiva de patrón de difracción de electrones de los granos de cristal individuales, cálculo de la intensidad, procesamiento de múltiples fases y la mejora en la indexación del patrón de difracción y la coincidencia con el patrón experimental. Este software se encuentra disponible de manera gratuita por un tiempo limitado, en el cual solamente se puede trabajar sobre los archivos que vienen precargados en la herramienta, por lo que para analizar otros patrones es necesario comprar una licencia. ESTADO DEL ARTE 10 Hay también un programa para uso no comercial llamado CrysTBox (Crystallographic Toolbox, Caja de Herramientas Cristalográficas) que contiene un conjunto de instrumentos automatizados para ayudar a los cristalógrafos y microscopistas de electrones con su trabajo diario. Entre las herramientas para el análisis automatizado de los patrones de difracción de electrones con las que cuenta este programa se encuentra diffractGUI, cuyo propósito es la determinación automática de la orientación de la muestra, además de identificar puntos de difracción individuales, medir distancias y ángulos interplanares en patrones de difracción de puntos y de disco (Klinger, 2014). CrysTBox está disponible sobre demanda, por lo que para obtener los archivos de instalación es necesario contactar al autor. Otra de las herramientas utilizadas es CSpot, un programa para la simulación, la indexación y el análisis de tres tipos de patrones de difracción de electrones: de puntos, Kikuchi y de anillo (policristalinos). CSpot permite la manipulación de los patrones de difracción simulados en tiempo real y de manera interactiva mediante el cambio y la visualización de la orientación de los cristales y a través del ajuste de parámetros de simulación, por ejemplo, condiciones de operación del microscopio (CrystOrient, 2015). Se puede solicitar una versión de prueba del software mediante un formulario de contacto; los precios de una licencia van de 3500 a 7000 euros, dependiendo del tipo requerido (académico o completo). MARCO TEÓRICO 11 III. MARCO TEÓRICO 3.1.Cristalografía La cristalografía es la ciencia dedicada al estudio de los materiales cristalinos, sus propiedades físicas y químicas, su forma externa, su estructura interna y la manera en que sus átomos están ordenados (Borchardt-Ott, 2011; Goel, 2006). Los cristales son sólidos cuyos átomos se encuentran organizados en intervalos regulares entre sí. Esta regularidad en su acomodo puede describirse en términos de elementos de simetría; estos elementos determinan la simetría de las propiedades físicas de un cristal. El patrón atómico de un cristal sería entonces el patrón básico que es descrito por dichos elementos de simetría (Kelly, Groves, & Kidd, 2000). Por ejemplo, el carbono puede presentarse en tres formas principales: diamante, grafito y carbón amorfo. El diamante es el material más duro que se conoce; como se puede observar en la Figura III.1a, posee una estructura cristalina cúbica con enlace covalente entre sus átomos que lo hace especialmente útil en herramientas de corte y esmeriles debido a su dureza (Considine & Considine, 1995; Groover, 2007). Pearce (2003) muestra en su trabajo de tesis una imagen microscópica de una muestra de diamante (Figura III.1. Estructura cristalina, imagen microscópica y patrón de difracción de un diamanteb) y el patrón de difracción que genera esa muestra (Figura III.1. Estructura cristalina, imagen microscópica y patrón de difracción de un diamantec). MARCO TEÓRICO 12 Figura III.1. Estructura cristalina, imagen microscópica y patrón de difracción de un diamante. El grafito por su parte tiene un alto contenido de carbono cristalino en forma de capas. Los enlaces entre los átomos de estas capas son covalentes y por tanto fuertes, pero las capas paralelas están levemente adheridas entre sí. Esta estructura, que se muestra en la Figura III.2a, hace que la resistencia y otras propiedades del grafito varíen de manera significativa con la dirección; esto explica el porqué, en forma de polvo, el grafito posee características de poca fricción debido a la facilidad con que se separa en capas, siendo muy valioso como lubricante (Andrés Cabrerizo, Antón Bozal, & Barrio Pérez, 2008; Groover, 2007). Asimismo se muestra en la Figura III.2. Estructura, imagen microscópica y patrón de difracción de una muestra de grafitob la imagen obtenida con un TEM de una muestra de grafito y el patrón de difracción asociado a ella en la Figura III.2. Estructura, imagen microscópica y patrón de difracción de una muestra de grafitoc (Pearce, 2003). MARCO TEÓRICO 13 Figura III.2. Estructura, imagen microscópica y patrón de difracción de una muestra de grafito. Finalmente, el carbón está constituido por microcristales en los que los planos hexagonales no están bien orientados, sino desplazados unos respecto a otros y solapando entre sí, indicando en consecuencia un grado mucho menor de cristalinidad que en el diamante o el grafito. Por lotanto presentan un elevado porcentaje de la estructura altamente desordenada, como se muestra en la Figura III.3.a, produciendo el plegamiento de láminas hexagonales dejando huecos de muy diferente tamaño. En la Figura III.3. Estructura, imagen microscópica y patrón de difracción de una muestra de carbónb se observa la imagen tomada con un TEM de una muestra de carbón amorfo y su respectivo patrón de difracción en la Figura III.3. Estructura, imagen microscópica y patrón de difracción de una muestra de carbónc (Bokhonov, et al., 2014; Considine & Considine, 1995; Martín Martínez, 1990). MARCO TEÓRICO 14 Figura III.3. Estructura, imagen microscópica y patrón de difracción de una muestra de carbón. MARCO TEÓRICO 15 3.2.TEM Para el análisis de los materiales cristalinos se utiliza un Microscopio Electrónico de Transmisión (TEM por sus siglas en inglés). Este instrumento utiliza un haz de electrones acelerados que atraviesan la muestra por una de sus caras, proporcionando una imagen formada por los electrones que salen por la cara contraria (Vázquez Nin & Echeverría, 2000). Cuando los electrones impactan con la muestra generan una serie de señales que se relacionan directamente con la estructura atómica del material. En el TEM los electrones transmitidos se utilizan para crear imágenes que revelan la estructura interna de la muestra, el tamaño y distribución de las partículas, defectos en la red atómica, etc. A partir de estas imágenes puede hacerse un estudio cristalográfico detallado del material investigado permitiendo, entre otras cosas, analizar la composición química de partículas, estudiar defectos micro-estructurales en materiales cristalinos, medir tamaños, ángulos y radios a escalas nanométricas e identificar fases cristalinas (Martínez Orellana, n.d.). MARCO TEÓRICO 16 3.3.Fase Todo sistema uniforme desde el punto de vista de su composición química y de su estado físico se denomina sistema homogéneo o fase. Una fase puede consistir a su vez en cierta cantidad de materia que puede estar en una sola porción o dividida en ciertas porciones más pequeñas. Por lo tanto, un sistema constituido por más de una fase se denomina heterogéneo, en el que cada una de las partes homogéneas constituye una fase distinta netamente diferenciada por sus características y propiedades particulares (Barrow, 2002; Rajadell & Movilla, 2005). Si se comparan los patrones de difracción de las fases del carbono correspondientes al diamante (Figura III.4a) y al carbón (Figura III.4b) se pueden observar ciertas similitudes entre ambos, sin embargo el patrón de difracción del diamante se compone de intensas señales que hacen notoria la diferencia entre ambas derivaciones del carbono. Figura III.4. Patrón de difracción del diamante y del carbón. Por lo tanto, en un sistema heterogéneo, cada una de las fases pueden tener la misma composición química pero tener propiedades distintas, como son el agua y el hielo, o una totalmente distinta, como el agua y el aceite; en ambos casos cada uno de los elementos tiene una fase diferente (Bernau, 1958; Kalpakjian & Schmid, 2002). MARCO TEÓRICO 17 3.4.Indexación La indexación es probablemente una de las tareas más importantes a la hora de procesar los patrones de difracción ya que a partir de ella se obtiene la caracterización de un material (Esteve, 2006). Es el proceso de determinar, a partir de un punto específico en el patrón de difracción, la distancia que existe hacia otros puntos, el ángulo que se forma en relación con otros puntos y a partir de dichas mediciones determinar el material cristalino responsable del patrón de difracción (Fultz & Howe, 2013; González Viñas & Mancini, 2003; McClurg & Smit, 2013). En la Figura III.5 se muestra un ejemplo de un patrón indexado. Figura III.5. Ejemplo de indexación de un patrón de difracción. MARCO TEÓRICO 18 3.5.Ley de Bragg La estructura de los cristales se estudia mediante la difracción de fotones, neutrones y electrones. Dicha difracción depende de la estructura del cristal y de la longitud de onda de la partícula empleada (Kittel, 1997). La ley de Bragg establece una relación entre el ángulo de incidencia (), la longitud de onda () de la radiación reflejada y el espacio interplanar (d) en el cristal analizado. La Figura III.6 representa de manera gráfica dicha ecuación (Hernández Cano, Foces-Foces, & Martínez- Ripoll, 1995; Tipler, 2003). 𝑠𝑒𝑛𝜃 = 𝑛 2𝑑 ( III.1 ) Figura III.6. Representación gráfica de la ley de Bragg. Es decir, cuando un haz de longitud de onda incide sobre la superficie de un cristal en el que las capas de átomos o iones están separados una distancia d, la intensidad máxima del rayo reflejado ocurre cuando 𝑠𝑒𝑛𝜃 = 𝑛 2𝑑 . Donde (ángulo de Bragg) es complementario del ángulo de incidencia y n es un entero (Oxford, 1998). MARCO TEÓRICO 19 3.6.Redes neuronales Las redes neuronales son sistemas que intentan reproducir la estructura neuronal del cerebro para imitar el razonamiento y comportamiento propio de los humanos. La parte más importante de estas redes es su capacidad de resolver problemas a través del aprendizaje basado en ejemplos. Por lo tanto, la facultad de una red para dar soluciones estará ligada al tipo de ejemplos disponibles durante el proceso de aprendizaje, los cuales deben ser suficientes y diversos para que el dominio esté bien representado. De forma general, una red neuronal consiste en grupos, llamados capas, que contienen unidades de procesamiento conocidas como neuronas artificiales, las cuales imitan el funcionamiento de una neurona biológica. Estas unidades, al igual que las neuronas reales, se componen de conexiones de entrada (dendritas), conexiones de salida (axones o axón) y un procesamiento interno que genera una señal de salida en función de la señal que se le haya dado a la entrada. De este modo, el conjunto de unidades neuronales conectadas entre sí constituye una red neuronal con pesos asociados a cada una de las conexiones entre neuronas (Skapura, 1996; Wu & McLarty, 2000). El procesamiento comienza con la red en un estado de inactividad. Al aplicar un patrón en forma de señales a la capa de entrada de la red, cada una de ellas estimula uno de las neuronas de entrada y estas a su vez generan una señal de salida. Luego, el conjunto de dichas salidas sirve como entrada a la siguiente capa, y así sucesivamente hasta que la capa final produzca una salida para el patrón ingresado. Para poder lograr el funcionamiento anterior, es necesario tener entrenada la red neuronal, es decir, hacer que la red tenga un conocimiento previo a partir del cual pueda generar salidas con un nivel de confiabilidad aceptable. La retropropagación es un mecanismo de entrenamiento que consiste en comparar la predicción de la red neuronal con la clasificación que se sabe corresponde a la entrada analizada. Dicha comparación luego permite ajustar los pesos entre los nodos de la red para minimizar el error entre las clasificaciones reales y las pronosticadas por la red (McCarty, 2011). Además, existen redes de neuronas artificiales con aprendizaje no supervisado; es decir, que no necesitan de un profesor o supervisor externo para realizar su aprendizaje. Estas redes son capaces de descubrir por sí mismas características, regularidades, MARCO TEÓRICO 20 correlaciones o categorías en los datos de entrada, y obtenerlas de forma codificada a la salida (Flórez López & Fernández Fernández, 2008; Isasi Viñuela & Galván León, 2004). MARCO TEÓRICO 21 3.7.Análisis de imágenes 3.7.1. Tipos de imágenes En total existen cuatro tipos básicos de imágenes: binaria, escala de grises, color real o RGB (rojo, verde, azul por sus siglas en inglés)e indexada. Una imagen binaria (o de “dos niveles”) tiene solamente dos posibles valores para cada píxel: blanco o negro. Esto significa que cada píxel puede almacenarse en un solo bit con cualquiera de los valores binarios “0” ó “1” (ver Figura III.7.). Figura III.7. Imagen binaria. En una imagen en escala de grises los únicos colores son sombras de gris que van desde el 0 (negro) hasta 255 (blanco). Cada píxel está formado por una de estas sombras y se representa con 1 byte (8 bits). La razón para tener este tipo de imágenes es que se requiere proporcionar menos información para cada píxel (ver Figura III.8). Figura III.8. Imagen en escala de grises. MARCO TEÓRICO 22 En las imágenes RGB o de color real (true color) cada píxel tiene un color particular que está definido por la cantidad de rojo, verde y azul en él. Si cada uno de los componentes R, G y B tiene un rango de 0 a 255, el total de diferentes posibles colores en la imagen es de 224. Cada píxel requiere 24 bits, por lo que estas imágenes también se conocen como imágenes de 24 bits (ver Figura III.9). Figura III.9. Imagen RGB. Por último, a diferencia de lo que sucede en una imagen RGB (ver Figura III.10. Representación de un píxel en una imagen RGB y con colores indexados.a), en las imágenes con colores indexados (ver Figura III.10. Representación de un píxel en una imagen RGB y con colores indexados.b) cada píxel tiene un valor que en lugar de su color proporciona un apuntador al color en el mapa que contiene la lista de todos los colores utilizados en esa imagen. Este tipo de imágenes permite un número limitado de colores distintos, por lo que son utilizadas principalmente para ilustraciones que contienen grandes regiones con el mismo color (Deligiannidis & Arabnia, 2014; Burger & Burge, 2008). MARCO TEÓRICO 23 Figura III.10. Representación de un píxel en una imagen RGB y con colores indexados. 3.7.2. Profundidad (depth, color depth) La profundidad o profundidad de color de una imagen es la cantidad de información usada para crear colores y describe su habilidad de reproducirlos correctamente. Está dada por el número de bits usados por un solo píxel de la imagen. Una imagen binaria por ejemplo, tiene una profundidad de 1 bit por píxel (bpp) debido a que se tienen solamente dos colores en toda la imagen y un bit es suficiente para distinguir entre ellos. Una imagen en escala de grises tendrá por lo general una profundidad de color de 8bpp para medir la intensidad en 256 niveles discretos, siendo 0 el más bajo y 255 el más alto. Una imagen a color por su parte tendrá 16, 24 o 32 bpp, siendo la más común de 24bpp. En una imagen RGB de 24bpp por ejemplo, 8 bits de cada píxel se asignan a cada uno de los canales rojo (R), verde (G) y azul (B), por lo que cada MARCO TEÓRICO 24 píxel puede representar uno de 16,777,216 (224 ó 28 • 28 • 28) colores posibles (Hunt, 2010; Theoharis, Papaioannou, Platis, & Patrikalakis, 2008). 3.7.3. Espacio de color (color space) Todos los archivos de imagen tienen un espacio de color. Éste define la cantidad y los límites de colores y sombras de color que una imagen puede contener (gama de color). Existe un sinnúmero de espacios de color diferentes, cada uno creado para una tarea específica. Por ejemplo, algunos fueron diseñados para programas de dibujo, mientras que otros fueron ideados para la percepción del color (Ebner, 2007). Algunos de los espacios de color más comunes son: RGB. Es el más común ya que se utiliza ampliamente en dispositivos de análisis de imágenes (cámaras digitales, escáneres, etc.) y de visualización (monitores, televisiones, etc.). Se creó con base en la regla de que todo color visible puede obtenerse mezclando el color rojo, verde y azul en porcentajes específicos. Desafortunadamente, cada dispositivo tiene su propia característica espectral para cada canal de color y puede producir rangos muy diferentes de colores RGB; por lo tanto, este espacio pertenece a los espacios de color dependientes del dispositivo (Choras, 2010). HSV o HSB (tono, saturación y valor/brillo, por sus siglas en inglés). Este espacio fue definido para modelar el método de un artista para mezclar los colores. Debido a que tiene su base en la visión humana, es muy intuitivo a la hora de definir colores ya que cada color se describe por su tinte, intensidad y brillo, y no por porcentajes de rojo, verde y azul (Choras, 2010). 3.7.4. Histograma Un histograma es una gráfica compuesta de líneas que muestran el número relativo y distribución de valores de tonalidad dentro de una imagen. Se utiliza para representar la distribución de los datos de una imagen en un formato visual sencillo de interpretar. Los histogramas se crean dividiendo el rango de niveles o valores que pueden tomar los píxeles de la imagen y sobre cada nivel se dibuja una línea que es proporcional al del número de píxeles MARCO TEÓRICO 25 para un valor determinado; entre más alta sea la línea más píxeles se encuentran en ese valor. Los histogramas con frecuencia se ven como montañas debido a que dichas líneas se encuentran muy juntas unas con otras (Burger & Burge, Principles of Digital Image Processing: Fundamental Techniques, 2009; Mittra, 2002; Romaniello, 2007; Sarkar, 2008; Simoes, Lucena Junior, Leite, & Silva, 2012). En la Figura III.11 se puede observar el histograma para la imagen de Lena en escala de grises. Figura III.11. Imagen de Lena en escala de grises y su histograma. MARCO TEÓRICO 26 3.8.Procesamiento de imágenes 3.8.1. Filtrado El filtrado es una parte importante dentro del procesamiento de imágenes, ya que es fundamental para realizar operaciones de análisis como la segmentación, extracción de características de textura y de forma (Ren & Du, 2013). Es una forma efectiva para reducir el ruido en una imagen, conservando aspectos importantes. El filtro utilizado dependerá en la naturaleza del ruido, pudiendo usar varios de ellos para múltiples fuentes de ruido. 3.8.1.2.Filtro de media Consiste en sustituir cada píxel por la media aritmética de los puntos que tiene alrededor (incluido él mismo) en un kernel de NxN puntos, donde el punto a sustituir es el central. Se obtiene calculando la media de todos los valores de los píxeles del kernel y se sustituye el píxel central del kernel por el valor obtenido. Reduce la magnitud del ruido uniforme, suavizando los gradientes de toda la imagen y provoca un efecto de difuminarla, efecto que aumenta a medida que lo hace el tamaño del kernel (Gupta & Ibaraki, 2015). Algunos ejemplos de kernel utilizados en este filtro se muestran en la siguiente imagen (Figura III.12). Figura III.12. Ejemplos de Kernel del filtro de media 3.8.1.3.Filtro Gaussiano A diferencia del filtro de media, se le da más peso al píxel central que a sus vecinos, asignando además pesos mayores a los píxeles más cercanos al centro del kernel y menos peso a los más MARCO TEÓRICO 27 alejados. El calificativo de “Gaussiano” es gracias a que su definición sigue la forma de la campana de Gauss (Grau, 2010). Un ejemplo de kernel para este filtro se observa en la imagen a continuación (ver Figura III.13). Figura III.13. Ejemplo de un kernel de 3x3 para un filtro Gaussiano. 3.8.1.4.Filtro de mediana Consiste en obtener la lista completa de valores de los píxeles del kernel, ordenarlos y tomar el del medio (mediana). La ventaja de este filtro con el de media es que los detalles abruptos y los bordes de los objetos no se difuminan tanto, por lo que es muy efectivo para eliminar ruido del tipo sal y pimienta. Este filtro no utiliza un kernel específico, solamente su tamaño, a partir del cual determina el valor de la mediana (Gupta & Ibaraki, 2015; González Marcos, et al., 2006). 3.8.2. Gradientede imagen Se utiliza para detectar píxeles con mayor contraste, ya que resalta las variaciones de intensidad de la luz. Se calcula por medio de la convolución de la imagen con 2 kernels predefinidos e independientes, uno para la dirección vertical y otro para la horizontal, para obtener la mayor cantidad posible de información sobre las regiones con alto contraste de la imagen (Mohamed Kamel, 2011). 3.8.3. Algoritmo Canny para detección de bordes El operador de bordes Canny fue diseñado para combinar la buena detección de bordes reales, ubicación precisa y mínima respuesta a falsos bordes. Aunque inicialmente su objetivo era detectar bordes en múltiples espacios, la mayoría de las implementaciones aplican el detector Canny en un solo nivel. En esta forma básica, el operador realiza lo siguiente (Bradsky & MARCO TEÓRICO 28 Kaehler, 2008; Burger & Burge, Principles of Digital Image Processing: Fundamental Techniques, 2009; Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011): Pre-procesamiento. Suaviza la imagen con un filtro Gaussiano para eliminar el ruido de los bordes. Localización de bordes. Una vez que se suaviza la imagen, para cada píxel se obtiene la magnitud y módulo (orientación) del gradiente. Seguimiento de bordes y umbralización por histéresis. Se reúnen los grupos de píxeles de borde conectados aplicando la umbralización por histéresis, la cual consiste en utilizar dos umbrales distintos, uno bajo y otro alto, para determinar cuáles puntos pertenecen a un contorno. Si el píxel tiene un gradiente mayor que el umbral superior, se acepta como un píxel de borde; si el píxel está debajo del umbral inferior, será rechazado. Si el gradiente del píxel se encuentra entre ambos umbrales, será aceptado únicamente si se encuentra conectado a un píxel que esté sobre el umbral superior. 3.8.4. Algoritmo Sobel El operador Sobel es un filtro lineal de detección de bordes basado en un kernel de 3x3 (ver Figura III.14). Este operador puede verse como la medida de la variación de la imagen en la dirección vertical y horizontal. Es decir, da una aproximación del gradiente de la imagen diferenciando los píxeles en cada una de las direcciones, operando en una pequeña ventana alrededor del píxel de interés para reducir la influencia del ruido (Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). Figura III.14. Estructura del kernel vertical y horizontal del operador Sobel. MARCO TEÓRICO 29 3.9.Operaciones morfológicas La morfología es la presentación y estructura de un objeto, o los arreglos e interrelaciones entre las partes del mismo. El filtrado morfológico permite el análisis y procesamiento de imágenes, ya que define una serie de operaciones que las transforma a través de su examinación con un elemento con cierta forma predefinida. El modo en que este elemento intersecte con el entorno de un píxel determinará el resultado de la operación morfológica aplicada (Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011; Parker, 2011). Las operaciones morfológicas básicas son la dilatación y la erosión, y son utilizadas en una gran variedad de contextos como eliminar ruido, aislar o unir elementos, encontrar caídas de intensidad u hoyos en una imagen, etc. (Bradsky & Kaehler, 2008). 3.9.1. Conectividad La conectividad entre píxeles es un concepto importante utilizado para establecer las fronteras de los objetos y las regiones de una imagen. Para determinar si dos píxeles están conectados debe determinarse si son adyacentes en algún sentido. Existen dos formas comunes de definir la conectividad: con 4 celdas (vecindad 4) donde sólo se analizan los vecinos inmediatos; u 8 celdas (vecindad 8) donde se consideran para su análisis los ocho píxeles alrededor del píxel seleccionado (González Marcos, et al., 2006; Nixon & Aguado, 2008; Sucar & Giovani, 2011). Ambos tipos de conectividad se muestran en la Figura III.15. Figura III.15. Tipos principales de conectividad. MARCO TEÓRICO 30 3.9.2. Kernel El instrumento básico de la morfología matemática es el elemento estructural o kernel, el cual está definido como una configuración de píxeles (una forma) en la que se define un origen (punto de anclaje) para determinar la manera en que un píxel se combina con sus vecinos (Gálvez Rojas, Alcaide García, & Mora Mata, 2007; Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). 3.9.3. Convolución La convolución es la base de muchas de las transformaciones que pueden ser aplicadas para mejorar, modificar o procesar imágenes. Este término significa mover un kernel sobre cada píxel de una imagen y multiplicar cada uno de los píxeles de la imagen por su peso asociado; por lo tanto, el resultado de la operación de convolución está determinada por el kernel utilizado (Bradsky & Kaehler, 2008; Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). 3.9.4. Dilatación y erosión Son los operadores morfológicos fundamentales. Ambos son convoluciones de alguna imagen por medio de un kernel. El kernel puede pensarse como una plantilla o una máscara de cualquier tamaño y forma con su punto de anclaje en el centro (Ver Figura III.16). Para la dilatación, el kernel se va moviendo a través de la imagen y en cada movimiento se calcula el valor máximo de píxel dentro de las dimensiones del kernel y en la imagen se reemplaza el píxel en donde se encuentre el punto de anclaje con dicho valor máximo. La erosión es la operación contraria: conforme se mueve el kernel por la imagen, se calcula el valor mínimo de los píxeles dentro del área del kernel y se reemplaza el píxel bajo el ancla con el valor mínimo calculado (Bradsky & Kaehler, 2008; opencv.org, OpenCV Reference Manual, 2014) MARCO TEÓRICO 31 Figura III.16. Ejemplo de dilatación y erosión sobre el objeto A, por medio del kernel B. 3.9.5. Apertura y cierre Son operaciones comúnmente utilizadas como filtros para la eliminación de ruido tipo sal y pimienta, así como para suavizar la superficie de formas en las imágenes facilitando la detección de objetos. Se trata de la combinación de los operadores de erosión y dilatación. En el caso de la apertura, primero se erosiona y luego se dilata utilizando el mismo elemento estructural, “abriendo” los pequeños espacios entre objetos que están en contacto, separando unos objetos de otros y aumentando los agujeros dentro de los objetos. El cierre por su parte se obtiene primero dilatando y luego erosionando la imagen, lo que provocará que, al contrario de la apertura, se remuevan las pequeñas áreas negras de la imagen (Bradsky & Kaehler, 2008; Brahmbhatt, 2013; González Marcos, et al., 2006; Parker, 2011) MARCO TEÓRICO 32 3.10. OpenCV OpenCV es una librería de código abierto que incluye varios cientos de algoritmos para el desarrollo de aplicaciones de visión computacional. Puede utilizarse tanto en aplicaciones académicas como comerciales bajo una licencia BSD que permite su uso, distribución y adaptación libres (Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). Tiene interfaces en C++, C, Python y Java y soporta Windows, Linux, Mac OS, iOS y Android. OpenCV fue diseñado para la eficiencia computacional con un fuerte enfoque en aplicaciones de tiempo real. La librería puede además aprovechar el procesamiento multi núcleo debido a que está escrita en C/C++ optimizado (OpenCV API Reference, 2014). 3.10.1. Funciones OpenCV 3.10.1.1.Estructura Mat() La clase Mat de OpenCV es la estructura de datos utilizada para contener imágenes y demás información en forma de matriz. Por defecto, tiene un tamaño cero pero también se puede especificar un tamaño inicial (Laganière, OpenCV 2 Computer Vision ApplicationProgramming Cookbook, 2011). Existen diversas formas de crear un objeto tipo Mat, las opciones más populares se enlistan a continuación (Brahmbhatt, 2013; OpenCV API Reference, 2014; OpenCV User Guide, 2014): Mat(nrows, ncols, type) Mat(size, type) Mat(rows, cols, type, s) Mat(size, type, s) Mat(m) Mat(rows, cols, type, data, step = AUTO_STEP) Mat(size, type, data, step = AUTO_STEP) Mat(ndims, sizes, type) Mat(ndims, sizes, type, s) Mat(ndims, sizes, type, data, steps) MARCO TEÓRICO 33 Donde: ndims.- Número de dimensiones del arreglo. rows.- Número de filas en un arreglo bidimensional. cols.- Número de columnas en un arreglo bidimensional. size.- Tamaño del arreglo bidimensional: size(cols, rows). sizes.- Arreglo de enteros especificando la forma de un arreglo n-dimensional. type – Tipo de arreglo. Especifica el tipo de dato a utilizar para almacenar los elementos y el número de canales por cada punto de la matriz. Para hacer esto se tienen múltiples definiciones construidas a partir de la siguiente convención: CV_<Profundidad><Tipo de dato>C<Número de canales>. Los parámetros se definen como (Bradsky & Kaehler, 2008; opencv.org, OpenCV User Guide, 2014): Profundidad: indica la cantidad de bits utilizados por un solo píxel de la imagen para crear y reproducir colores. Sus valores pueden ser: 8,16, 32 ó 64. Tipo de dato: Las diferentes opciones para este parámetro son S, U o F. “S” (Signed) indica que permitirá almacenar valores negativos, 0 y valores positivos. “U” (Unsigned) solamente admitirá valores no negativos (0 y valores positivos). “F” (Float) acepta cualquier número real; es decir, el 0 ó cualquier número negativo o positivo con punto decimal (Bronson, 2013). Número de canales: Indica el número de canales de la imagen, que pueden ir desde 1 hasta 4. Por lo tanto, algunos ejemplos de tipo de arreglo son: CV_8UC1, CV_32FC4, CV_16SC3, etc. s.- Valor opcional para inicializar cada elemento con él. data.- Apuntador a los datos de usuario. Los constructores de matrices solamente inicializan la cabecera de la matriz que apunta a la información específica, por lo que no se asigna ni se copia información. MARCO TEÓRICO 34 step.- Número de bytes que ocupa cada fila de la matriz. Si existen, debe incluir los bytes de relleno al final de cada fila. Si no se especifica, (AUTO_STEP por defecto), se asume que no hay relleno. steps.- Arreglo de ndims-1 saltos (steps) en caso de un arreglo multidimensional (el último step siempre se asigna como el tamaño del elemento). Si no se especifica, se asume que la matriz es continua. m.- Arreglo que se asigna a la matriz construida (total o parcialmente). No se copia información con este constructor; en su lugar, la cabecera apuntando a m o su sub arreglo se construye y se asocia con él. 3.10.1.2.imread() Es una rutina que determina el formato con el que se cargará el archivo basado en su nombre; además asigna de forma automática la memoria necesaria para la estructura de datos de la imagen. Este método es capaz de leer una amplia variedad de formatos de imagen, incluyendo BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS y TIFF (Bradsky & Kaehler, 2008). Esta función se invoca de la forma (OpenCV API Reference, 2014): imread(filename, flags=1) Donde: filename.- Nombre del archivo a abrir. flags.- Especifica el tipo de color de la imagen cargada. Los posibles tipos son: CV_LOAD_IMAGE_ANYDEPTH. Regresa una imagen de 16 ó 32 bits cuando la imagen de entrada tiene la profundidad correspondiente; en otro caso la convierte a 8 bits. CV_LOAD_IMAGE_COLOR. Convierte la imagen a una de color. CV_LOAD_IMAGE_GRAYSCALE. Convierte la imagen a escala de grises. Regresa una imagen a color de 3 canales. = 0. Regresa una imagen en escala de grises. < 0. Regresa la imagen tal cual (con canal alfa). MARCO TEÓRICO 35 3.10.1.3.namedWindow() Abre una ventana en la pantalla que puede contener y mostrar una imagen. Esta función es proporcionada por el módulo HighGUI, el cual contiene los métodos de interfaz de usuario de OpenCV (Parker, 2011), y permite asignar un nombre a la ventana creada para poder referirse a ella en futuras llamadas a funciones de HighGUI (Bradsky & Kaehler, 2008). Su estructura es de la forma (OpenCV API Reference, 2014): namedWindow(name, flags= WINDOW_AUTOSIZE) Donde: name.- Nombre de la ventana que aparecerá en la barra de título y que podrá ser utilizado como identificador de la misma. flags.- Banderas de la ventana. Las banderas soportadas son: WINDOW_NORMAL. El usuario puede redimensionar la ventana sin limitaciones. WINDOW_AUTOSIZE. El tamaño de la ventana automáticamente se ajusta al de la imagen mostrada y no se puede cambiar manualmente. WINDOW_OPENGL. La ventana se crea con soporte para OpenGL. 3.10.1.4.imshow() Despliega una imagen en la ventana de OpenCV especificada. Si la ventana fue creada con la bandera CV_WINDOW_AUTOSIZE, la imagen se muestra con su tamaño original. De otra forma, la imagen se dimensiona de tal forma que se ajuste a la ventana. Para referenciar este método se utiliza (OpenCV API Reference, 2014): imshow(winname, mat) Donde: winname.- Nombre de la ventana. mat.- imagen que se mostrará en la ventana. 3.10.1.5.waitKey() MARCO TEÓRICO 36 Método que le pide al programa que se detenga y espere la pulsación de una tecla. Si se le asigna como argumento un entero positivo, el programa esperará ese número de milisegundos y luego continuará, aunque no se haya presionado ninguna tecla. Si el argumento es cero o un número negativo, el programa esperará indefinidamente hasta que se presione una tecla (Bradsky & Kaehler, 2008). La instrucción para invocarlo es (opencv.org, OpenCV API Reference, 2014): waitKey(delay=0) Donde: delay.- Retraso en milisegundos. El 0 (parámetro por defecto) es un valor especial que significa “infinito”. 3.10.1.6.cvtColor() Permite convertir de un espacio de color a otro. Un espacio de color es una forma de describir los colores de una imagen. El más simple es el espacio de color RGB, el cual representa el color de cada píxel con un valor de rojo (Red), uno de verde (Green) y uno de azul (Blue). Otro espacio de color es la escala de grises (grayscale), el cual descarta la información de color y solo almacena la intensidad de cada píxel (Bradsky & Kaehler, 2008; Brahmbhatt, 2013). En las transformaciones desde o hacia el espacio de color RGB, el orden de los canales debe especificarse explícitamente (RGB o BGR) debido a que el formato de color por defecto de OpenCV es BGR y no RGB como normalmente se considera. Para utilizar este método se utiliza el código (OpenCV API Reference, 2014): cvtColor(src, dst, code, dstCn=0); Donde: src.- Imagen de entrada. dst.- Imagen de salida del mismo tamaño y profundidad que la de entrada. code.- Código de conversión del espacio de color. Algunas de las conversiones más comunes son: RGB ↔ Escala de grises. Transformaciones dentro del espacio RGB como agregar/remover el canal alfa, invertir el orden de los canales, convertir de/a color RGB de 16 bits o la conversión de/a escala de grises: MARCO TEÓRICO 37 CV_BGR2GRAY CV_RGB2GRAY CV_GRAY2BGR CV_GRAY2RGB RGB ↔HSV. En imágenes de 8 y 16 bits, los canales R, G y B se convierten a formato de punto flotante y se escalan para ajustarlos al rango de 0 a 1: CV_BGR2HSV CV_RGB2HSV CV_HSV2BGR CV_HSV2RGB dstCn.- Número de canales de la imagen de salida; si el parámetro es 0 (valor por defecto), el número de canales se obtiene automáticamente de los parámetros src y code. 3.10.1.7.equalizeHist() Sirve para ecualizar el histograma de una imagen, normalizando su brillo y mejorando su contraste. Esto se realizaeliminando los valores más pequeños del histograma y luego estirándolo para que ocupe la totalidad de los valores de intensidad (0 a 255), haciéndolo lo más plano posible (Bradsky & Kaehler, 2008; Brahmbhatt, 2013; Lélis Baggio, et al., 2012). La ecualización se realiza aplicando la función (OpenCV API Reference, 2014): equalizeHist(src, dst) Donde: src.- Imagen fuente de 8 bits de un canal. dst.- Imagen destino del mismo tamaño y tipo que src. 3.10.1.8.threshold() Permite rechazar categóricamente aquellos píxeles que se encuentren debajo o por encima de algún valor conocido como umbral, manteniendo el resto de los píxeles (Bradsky & Kaehler, 2008; González Marcos, et al., 2006). La umbralización se aplica de la forma (OpenCV API Reference, 2014): MARCO TEÓRICO 38 threshold(src, dst, thresh, maxval, type); Donde: src.- Arreglo de entrada. dst.- Arreglo de salida con el mismo tamaño y tipo que src. thresh.- Valor del umbral. maxval.- Valor máximo que se usará con los tipos de umbralización THRESH_BINARY y THRESH_BINARY_INV. type.- Tipo de umbralización. Los posibles parámetros son: THRESH_BINARY. Si el valor del píxel de la imagen de entrada es mayor al umbral asignado, se asigna el valor establecido como maxval en la misma posición de la imagen de salida; en otro caso se establece el valor 0 para dicho píxel (Figura III.17). Figura III.17. Umbralización tipo binaria. THRESH_BINARY_INV. Hace la operación inversa a THRESH_BINARY; es decir, asigna un 0 a los píxeles que son mayores al umbral y pone el valor maxval al resto (Figura III.18. Umbralización tipo binaria inversa.). MARCO TEÓRICO 39 Figura III.18. Umbralización tipo binaria inversa. THRESH_TRUNC. Asigna el valor del umbral a todos los píxeles que sean mayor al mismo y el resto los deja con el mismo valor (Figura III.19. Umbralización tipo trunca.). Figura III.19. Umbralización tipo trunca. THRESH_TOZERO. Si el valor del píxel es mayor que el umbral, le asigna el mismo valor; en cualquier otro caso lo pone en 0 (Figura III.20. Umbralización a cero.). Figura III.20. Umbralización a cero. THRESH_TOZERO_INV. Pone en 0 cualquier píxel cuyo valor sea mayor al umbral y mantiene con el mismo valor al resto (ver Figura III.21. Umbralización a cero inversa.). MARCO TEÓRICO 40 Figura III.21. Umbralización a cero inversa. 3.10.1.9.adaptiveThreshold() Automáticamente converge a un valor de nivel de gris para cada imagen en particular que permite separar dentro de la imagen las regiones de alta y de baja densidad. Tras calcular el valor umbral para una imagen en concreto, se crea una nueva imagen de la siguiente manera: todo lo que en la imagen original tiene un valor superior al del umbral se pone a uno y lo que está por debajo se pone a cero. (Suárez Cuenca, 2009) La umbralización adaptativa se aplica de la forma (OpenCV API Reference, 2014): adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C) Donde: src.- Imagen de 8 bits y un solo canal. dst.- Imagen de salida con el mismo tamaño y tipo que src. maxval.- Valor máximo que se usará con los tipos de umbralización: THRESH_BINARY y THRESH_BINARY_INV. adaptiveMethod.- Algoritmo de umbralización adaptativa a utilizar: ADAPTIVE_THRESH_MEAN_C. El valor del umbral T(x, y), calculado individualmente para cada píxel, es un promedio de la vecindad blockSize x blockSize del punto (x, y) menos el parámetro C (Figura III.22. Método ADAPTIVE_THRESH_MEAN_C aplicado a una imagen.). MARCO TEÓRICO 41 Figura III.22. Método ADAPTIVE_THRESH_MEAN_C aplicado a una imagen. ADAPTIVE_THRESH_GAUSSIAN_C. El valor del umbral T(x, y) es una suma ponderada de la vecindad blockSize x blockSize del punto (x, y) menos el parámetro C (Figura III.23. Método ADAPTIVE_THRESH_GAUSSIAN_C aplicado a una imagen.). Figura III.23. Método ADAPTIVE_THRESH_GAUSSIAN_C aplicado a una imagen. thresholdType.- Tipo de umbral: THRESH_BINARY. Si el valor del píxel de la imagen de entrada es mayor al umbral asignado, se asigna el valor establecido como maxval en la misma MARCO TEÓRICO 42 posición de la imagen de salida; en otro caso se establece el valor 0 para dicho píxel (ver threshold()¡Error! No se encuentra el origen de la referencia.). THRESH_BINARY_INV. Hace la operación inversa a THRESH_BINARY; es decir, asigna un 0 a los píxeles que son mayores al umbral y pone el valor maxval al resto. blockSize.- Tamaño de la vecindad de un píxel que se utiliza para calcular un valor de umbral para el píxel (número impar mayor a 1). C.- Constante que se resta del promedio o del promedio ponderado. Normalmente es positivo y también puede ser cero o negativo. 3.10.1.10. medianBlur() Función que aplica un filtro de mediana para suavizar la imagen. Opera en la vecindad de un píxel para determinar el valor de salida del mismo. El píxel en cuestión y sus vecinos forman un conjunto de valores y, como sugiere el nombre, el filtro calculará el valor promedio del grupo de píxeles y reemplazará el valor del píxel con el promedio obtenido (Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). El método se aplica de la forma (OpenCV API Reference, 2014): medianBlur(src, dst, ksize) Donde: src.- Imagen de entrada de 1, 3 ó 4 canales. Cuando ksize sea 3 ó 5, la profundidad de la imagen deberá ser CV_8U, CV_16U ó CV_32U; cuando ksize sea mayor, solo puede ser CV_8U. dst.- Arreglo de salida con el mismo tamaño y tipo que src. ksize.- Tamaño lineal de apertura. Debe ser impar y mayor que 1, por ejemplo: 3, 5, 7… 3.10.1.11. erode() La erosión es una técnica para reducir la forma de los objetos removiendo píxeles de su borde (Dawson-Howe, 2014). La erosión se realiza mediante el desplazamiento de un kernel rectangular de unos por una imagen, poniendo a cero todos aquellos píxeles que no contengan MARCO TEÓRICO 43 completamente al elemento estructurante en su entorno, reduciendo el contorno del objeto (Brahmbhatt, 2013; González Marcos, et al., 2006). Se aplica a través de (OpenCV API Reference, 2014): erode(src, dst, kernel, anchor=Point(-1,-1), iterations=1, borderType= BORDER_CONSTANT, borderValue=morphologyDefaultBorderValue()) Donde: src.- Imagen de entrada; el número de canales puede ser arbitrario, pero la profundidad debe ser una de CV_8U, CV_16U, CV_16S, CV_32F ó CV_64F. dst.- Imagen de salida del mismo tamaño y tipo que src. kernel.- Elemento estructural usado para la erosión; si es igual a Mat(), se utiliza un elemento estructural rectangular de 3 x 3. anchor.- Posición del ancla en el elemento; el valor por defecto es (-1, -1), lo que significa que el ancla está en el centro del elemento. iterations.- Número de veces que se aplica la erosión. borderType – Método de extrapolación del píxel. Éste se aplica para procesar los píxeles a las orillas de la imagen, ya que se necesitan píxeles fuera de la imagen para procesar los que se encuentran en los bordes. Las diferentes opciones para hacer esto son (los bordes de la imagen están indicados por el símbolo “|”): BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh BORDER_REFLECT: fedcba|abcdefgh|hgfedcb BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba BORDER_WRAP: cdefgh|abcdefgh|abcdefg BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii especificando a 'i' borderValue.- Valor del borde en caso de que el tipo sea BORDER_COSTANT. 3.10.1.12. dilate() La dilatación consiste en expandir el número de píxeles del objeto, típicamente en todas las direcciones simultáneamente (Dawson-Howe, 2014). La dilatación se realiza mediante el desplazamiento de un kernel rectangular de unos por una imagen y si alguno de los vecinos de MARCO TEÓRICO 44 lamáscara coincide con un píxel de entorno, entonces el píxel de la imagen se pone a uno, extendiendo el área de los objetos y rellenando los posibles huecos dentro de ellos (Brahmbhatt, 2013; González Marcos, et al., 2006; Laganière, OpenCV 2 Computer Vision Application Programming Cookbook, 2011). Muy similar a la erosión, la dilatación se obtiene a través de (OpenCV API Reference, 2014): dilate(src, dst, kernel, anchor= Point(-1,-1), iterations=1, borderType= BORDER_CONSTANT, borderValue= morphologyDefaultBorderValue()). Ver erode() para revisar los posibles valores de parámetros de la función. 3.10.1.13. morphologyEx() Función multipropósito que se utiliza para realizar operaciones morfológicas avanzadas en imágenes, como la apertura o el cierre (Brahmbhatt, 2013). Se llama a través de (opencv.org, OpenCV API Reference, 2014): morphologyEx(src, dst, op, kernel, anchor=Point(-1,-1), iterations =1, borderType =BORDER_CONSTANT, borderValue=morphologyDefaultBorderValue()). Donde: op.- Tipo de operación morfológica, puede ser una de las siguientes: MORPH_OPEN. Operación de apertura. MORPH_CLOSE. Operación de cierre. MORPH_GRADIENT. Gradiente morfológico. MORPH_TOPHAT. “top hat”. MORPH_BLACKHAT. “black hat”. Ver erode() para revisar los posibles valores del resto de los parámetros de la función. 3.10.1.14. distanceTransform() La función de transformación de distancia calcula la medida precisa o aproximada de cada píxel de una imagen binaria al píxel cero más cercano; es decir, produce una imagen en escala de grises en la que la intensidad de un píxel en la imagen depende de la distancia del mismo al punto de borde más cercano a él (opencv.org, OpenCV API Reference, 2014; Whelan & Molloy, 2001). Se utiliza por medio de: MARCO TEÓRICO 45 distanceTransform(src, dst, distanceType, maskSize) distanceTransform(src, dst, labels, distanceType, maskSize, labelType= DIST_LABEL_CCOMP) Donde: src.- Imagen origen (binaria) de 8 bits (un canal). dst.- Imagen de salida con distancias calculadas. Es una imagen de punto flotante de 32 bits y un canal del mismo tamaño que src. distanceType.- Tipo de distancia. Puede ser: CV_DIST_L1 CV_DIST_L2 CV_DIST_C maskSize.- Tamaño de la mascara de transformación de distancia. Puede tener el valor 3, 5, o CV_DIST_MASK_PRECISE. En el caso de los tipos de distancia CV_DIST_L1 y CV_DIST_C, el parámetro debe ser 3 debido a que una máscara de da el mismo resultado que una de o cualquiera de mayor apertura. labels.- Arreglo 2D de salida de etiquetas (opcional). Tiene el tipo CV_32SC1 y el mismo tamaño que src. labelType.- Tipo de arreglo de etiquetas a construir. Si labelType==DIST_LABEL_CCOMP a cada componente de ceros conectado en src (así como todos los píxeles diferentes de cero más cercanos al componente conectado) se le asignará la misma etiqueta. Si labelType==DIST_LABEL_PIXEL cada pixel cero (y todos los píxeles diferentes de cero cercanos) obtiene su propia etiqueta. 3.10.1.15. normalize() Normalizar hace referencia al retoque de color que se aplica a una imagen para lograr un equilibrio entre el balance de blancos y negros, y desplazar los valores tonales que no estén donde deberían; es decir, este proceso deja la imagen lo más parecida posible a la realidad, sin MARCO TEÓRICO 46 que tenga una tendencia hacia un color predominante (Adobe Premiere Pro). Una imagen se normaliza a través de (OpenCV API Reference, 2014): normalize(src, dst, alpha=1, beta=0, norm_type=NORM_L2, dtype=-1, mask=noArray()) normalize(src, dst, alpha, normType) Donde: src.- Arreglo de entrada. dst.- Arreglo de salida del mismo tamaño que src. alpha.- Valor criterio sobre el cual se normaliza o el límite de rango inferior en caso de una normalización de rango. beta.- Límite de rango superior en caso de una normalización de rango; no se utiliza para normalización de criterio. normType.- Tipo de normalización: NORM_INF NORM_L1 NORM_L2 NORM_MINMAX dtype.- Cuando es negativo, el arreglo de salida tiene el mismo tipo que src; en otro caso, tiene el mismo número de canales que src y la profundidad es igual a CV_MAT_DEPTH(dtype). mask.- Máscara de operación opcional. 3.10.1.16. copyTo() Crea una imagen que contiene una nueva copia de la imagen original, grabando solamente los píxeles con valores diferentes a cero (opencv.org, OpenCV Reference Manual, 2014) (opencv.org, OpenCV User Guide, 2014). Para aplicar esta función se utiliza (OpenCV API Reference, 2014): copyTo(m) copyTo(m, mask) Donde: m.- Matriz destino. Si no tiene el tamaño o tipo correctos antes de la operación, se redistribuye. MARCO TEÓRICO 47 mask.- Máscara de operación. Sus elementos diferentes de cero indican cuáles son los elementos de la matriz que deben copiarse. 3.10.1.17. zeros() Regresa un arreglo de ceros del tamaño y tipo especificados que puede utilizarse para formar un arreglo constante como parámetro de una función o como inicializador de una matriz. Se emplea por medio de (opencv.org, OpenCV API Reference, 2014): zeros(rows, cols, type), zeros(size, type) o zeros(ndims, sz, type) Donde: ndims.- Dimensión del arreglo. rows.- Número de filas. cols.- Número de columnas. size.- Alternativa a la especificación del tamaño de la matriz Size(cols, rows). sz – Arreglo de enteros que especifica la forma del arreglo. type – Tipo de la matriz creada. 3.10.1.18. Canny() Encuentra bordes en una imagen utilizando el algoritmo Canny. Este emplea algo de post procesamiento para proporcionar bordes más finos (Brahmbhatt, 2013; opencv.org, OpenCV API Reference, 2014). La forma de aplicarlo es (OpenCV API Reference, 2014): Canny(image, edges, threshold1, threshold2, apertureSize=3, L2gradient=false) Donde: image.- Imagen de entrada de 8 bits y un solo canal. edges.- Mapa de bordes de salida con el mismo tamaño y tipo que image. threshold1.- Primer umbral para el procedimiento de histéresis. threshold2.- Segundo umbral para el procedimiento de histéresis. apertureSize.- Tamaño de apertura para el operador Sobel(). 3.10.1.19. findContours() MARCO TEÓRICO 48 Un contorno es una lista de puntos que representa, en una forma u otra, una curva en la imagen. En OpenCV los contornos se representan por medio de secuencias en las que se almacena información sobre la ubicación del siguiente punto en la curva. Además, esta función extrae una jerarquía de puntos y bordes conectados, la cual se organiza de tal forma que los contornos que se encuentren más arriba en el árbol son más propensos a ser bordes de objetos, mientras que los de niveles más bajos son más tendentes a ser bordes con ruido o de huecos (Bradsky & Kaehler, 2008; Brahmbhatt, 2013). Para detectar los bordes de la imagen binaria se utiliza: findContours(image, contours, hierarchy, mode, method, offset=Point()) findContours(image, contours, mode, method, offset=Point()). Donde (OpenCV API Reference, 2014): image.- Imagen fuente de 8 bits y un canal. Los píxeles diferentes de cero son tratados como unos y los píxeles con valor cero permanecen iguales, por lo que la imagen es tratada como binaria. La función modifica la imagen a la vez que extrae los contornos. contours.- Contornos detectados. Cada contorno se almacena como un vector de puntos. hierarchy.- Vector de salida opcional que contiene información sobre la topología de la imagen. Tiene tantos elementos como el número de contornos. mode.- Modo de recuperación de contornos: CV_RETR_EXTERNAL. Recupera solo los contornos exteriores extremos. CV_RETR_LIST. Obtiene todos los contornos sin establecer ninguna relación jerárquica. CV_RETR_CCOMP. Extrae todos los contornos y los organiza en una jerarquía de dos niveles. En el nivel superior
Compartir