PRÁCTICA - VII INTRODUCCIÓN AL PROCESADO DIGITAL DE IMÁGENES NOTA: Lo primero que debe hacerse al llegar al laboratorio es conectar el PC, si no está ya conectado, para que se inicie el WINDOWS 98. Si aparece una ventana de login hacer clic en el botón Cancelar. 1- OBJETIVO Y FUNDAMENTO TEÓRICO Podemos decir de manera sencilla que digitalizar una imagen consiste en reducir a números la información bidimensional que contiene. Por una parte, se discretizan las posiciones o coordenadas bidimensionales, de manera que aunque la función imagen venga inicialmente descrita como una función de punto continua, su registro y manipulación se realizan de forma discreta (matricial), como una función que toma valores en un conjunto finito de puntos llamados píxeles. Por otra parte, la digitalización implica la expresión numérica de la información contenida en cada punto, digitalización propiamente dicha. Para una imagen en blanco y negro esto supone que la intensidad de cada píxel se expresa con un número. Frecuentemente, este número se registra con 8 bits, lo que permite 28 = 256 niveles de gris (más de los que es capaz de distinguir el ojo humano). La digitalización permite, por ejemplo, el envío de imágenes mediante un código binario, la alteración artificial del brillo o el contraste, y otras manipulaciones como transformadas, filtrado, etc., para conseguir fines muy variados como la mejora de la calidad de imagen, el reconocimiento de objetos, la cuenta de objetos, la identificación automatizada de formas, etc. En esta práctica vamos a captar imágenes mediante una cámara CCD que nos permitirá almacenar la imagen en el ordenador como un fichero de datos en un formato especial. Utilizaremos un programa de tratamiento de imágenes para leer el fichero y operar sobre la imagen digitalizada. • El primer objetivo de la práctica es familiarizarse con algunas de las operaciones básicas, lo que haremos en el apartado 3 de puesta a punto del sistema, de modo que podamos utilizarlas en el apartado siguiente. • El segundo objetivo es utilizar el procesado digital para las siguientes funciones, que se irán desarrollando en el apartado 4: A) Comprobar la homogeneidad de una fuente extensa aparentemente uniforme. Se trata de una pantalla difusora iluminada por detrás mediante tubos fluorescentes. A simple vista la iluminación parece homogénea. Sin embargo, si i) se identifica un mínimo en esa imagen y se resta a toda ella como valor constante y ii) se identifica posteriormente un máximo multiplicándose toda la imagen por un valor que lleva ese máximo hasta el “fondo de escala” de grises, habremos conseguido una nueva imagen en la que se han resaltado las pequeñas variaciones de iluminación que pudiera haber. B) Contar elementos iguales dentro e la imagen (un conjunto de discos opacos sobre un fondo luminoso más o menos uniforme). Al colocar un objeto opaco sobre la pantalla la imagen de ésta aparecerá oscura donde se encuentre la imagen del objeto. En consecuencia, la suma de intensidades sobre la pantalla disminuirá. Restando los valores totales para ambas situaciones obtenemos un valor numérico para la sombra de un objeto. Al colocar varios de estos objetos, y repetir la resta, ésta será un múltiplo aproximado del valor correspondiente a un objeto. Dicho entero es el número de objetos. C) Detectar un movimiento y medir su magnitud. Si se toma una imagen de un grupo de objetos colocados al azar, y se compara con la imagen resultante de haber movido alguno de ellos, podemos conocer cuál de estos objetos se ha movido y la magnitud relativa de este movimiento. 2-MATERIAL • Cámara CCD + Objetivo fotográfico. • PC de control. • Monitor Auxiliar. • Brazo de ampliadora. • Fuente extensa (fluorescente+difusor). • Objetos auxiliares (discos, monedas, clips, etc). Fig. 1 Esquema del montaje de toma de imágenes sobre una superficie luminosa. 3- PUESTA A PUNTO DE LA INSTALACIÓN En esta sección debemos conseguir en primer lugar que funcione el sistema de captura de imágenes y en segundo lugar conocer algunas de las funciones de manipulación de imagen que nos pueden resultar necesarias después. Antes de nada debemos comprobar que los elementos están conectados, incluida la cámara. Debemos encender la lámpara fluorescente. Podemos extender la imagen al monitor auxiliar (en propiedades/configuración) si no lo está. Se recomienda guardar las imágenes más interesantes generadas en este apartado. CÓMO TOMAR UNA IMAGEN Y GUARDARLA EN UN FICHERO: 1) Iniciamos el programa de captura y análisis de imágenes ImageJ haciendo clic en el icono del escritorio. 2) Para ver la imagen de la cámara en tiempo real: En el menú Plugins tomamos la opción Input/Output y selecionamos Twain6. Entonces aparece un cuadro de dispositivos de origen y se selecciona la cámara uEye. Al hacerlo aparecerá un menú de la cámara y una imagen en tiempo real, que se oculta y se muestra con los botones Hide(/Show) Preview. 3) Para ajustar el enfoque: Situamos un objeto auxiliar en la base de la ampliadora. Actuamos en el enfoque del objetivo de la cámara hasta ver una imagen nítida en la pantalla del ordenador. 4) Para obtener una imagen fija hacemos Still image (para volver a tiempo real el mismo boton indicará Live. 5) Para archivar una imagen primero pulsaremos Scan y después la guardaremos (Save as) en formato tiff con el nombre escogido, por ejemplo “imagen_0” y sucesivas (se puede crear una carpeta en el escritorio con el nombre del grupo de prácticas y guardar ahí las imágenes). La imagen se guarda por defecto en un formato de color (RGB). CÓMO OBTENER EL HISTOGRAMA DE UNA IMAGEN: El histograma de una imagen es un gráfico de barras donde los 256 niveles de gris se distribuyen en intervalos iguales (barras) indicando cuántos píxeles hay en la imagen con el nivel de gris dentro de cada intervalo. 1) Para abrir el fichero de una imagen: ir al menú File/Open… (también se puede arrastrar el fichero sobre la barra superior de la ventana de ImageJ). 2) En el menú Image hacemos Type>8-bit para convertir la imagen del formato de color (RGB color) al formato de niveles de gris (monocromo 8-bit). Los niveles de gris van de 0 (negro) a 255 (blanco). 3) Para obtener el histograma: Estando activa la ventana de la imagen, ir a Analyze/Histogram (o pulsar ctrl-H). 4) En la ventana del histograma aparece en número de píxeles de la imagen (Count), los valores máximo, mínimo, medio y modal de la intensidad (Max, Min, Mean y Mode). COMPARACIÓN DE DOS IMÁGENES: Vamos a comparar ahora los histogramas correspondientes a dos imágenes de la misma escena una enfocada y otra desenfocada. 1) Tomar la imagen enfocada de un objeto auxiliar y guardarla, por ejemplo como “imagen_0” (Para ello ajustar el enfoque en tiempo real, luego detener, capturar y guardar la imagen según lo explicado). 2) Tomar la imagen desenfocada del objeto auxiliar y guardarla en “imagen_1” (Es decir, volver a tiempo real, desenfocar la imagen girando el objetivo y observando sobre la pantalla la pérdida de nitidez en los contornos; Después capturar la imagen). 3) Convertir los dos ficheros a 8-bit (File/Open…; Type>8-bit). 4) Obtener los dos histogramas. Si el objeto auxiliar era de alto contraste (sólo tonos blancos y negros), en el primer histograma las barras se concentran en los niveles correspondientes al cero (negro) y a cierto valor máximo para nuestra imagen (blanco). En el segundo histograma veremos niveles intermedios de gris, ya que el desenfoque ha hecho aparecer niveles de gris en puntos que antes eran totalmente claros o bien totalmente oscuros. Si el objeto inicial presentaba otra distribución de tonos, puedes observar otras variaciones en el histograma, explicables siempre como efectos del desenfoque. Vamos a hacer una operación de resta entre las imágenes que hemos adquirido: 5) Hacemos: Process/Image Calculator… En la ventana que se abre rellenaremos lo siguiente, image1: imagen_0, operation: subtract, image2: imagen_1, y marcaremos la casilla Create New Window. Hacer clic en OK y el resultado aparecerá en una ventana nueva. (También podemos hacer la resta al revés: la desenfocada – la enfocada, que resultará ligeramente diferente). Al ser ambas imágenes muy parecidas, el resultado es una imagen con bajas intensidades. Los valores más importantes aparecerán donde las diferencias entre las imágenes eran mayores. En este caso será en los contornos, nítidos en imagen_0 y borrosos en imagen_1. (Lógicamente aparecen valores negativos, a los que automáticamente el sistema asigna el valor 0. Según sea el orden de la resta, estos valores quedarán en distintos lugares). Podemos probar a sumar las dos imágenes resta, y obtendremos una imagen con sus máximos de intensidad en los contornos. REALZADO DEL CONTRASTE: Vamos a realzar el contraste de la imagen desenfocada “imagen_1”. Esto lo podemos conseguir haciendo que los niveles de gris de la imagen, que se encuentran en el intervalo [Min, Max], pasen a ocupar todo el intervalo posible [0, 255]. 1) Primero observamos los valores de intensidad de la imagen en la ventana del Histograma: Count, Min, Max, Mean. 2) Count es el número de píxeles de la imagen y Mean el valor medio de la intensidad. Por tanto Count*Mean es la intensidad total en la imagen. Anotamos este valor Si. 3) Anotamos también el valor Min de intensidad mínima encontrada. Queremos que los niveles de gris que contiene nuestra imagen, que se encuentran en el intervalo [Min, Max], pasen a encontrarse en el intervalo [0, 255]. Eso lo conseguimos en dos pasos. 4) El primer paso es restar el valor Min a toda la imagen. Hacemos Process/Math/Subtract…, y en la casilla Value ponemos el valor de Min. (Si Min=0 no necesitamos este paso). La resta se va a notar en el histograma, ya que lógicamente arrancará de cero. Ejecutamos de nuevo Analyze/Measure (o Ctrl+M) para comprobar que Min=0 y ver el nuevo valor de Max. 5) Ahora damos el segundo paso para reescalar el intervalo. Hacemos el cociente (256 / Max), llamémosle C. (Si por ejemplo Max era 70, C=256/70=3.65). Ahora multiplicamos toda la imagen por ese valor: Process/Math/Multiply…, y en la casilla Value ponemos el valor de C. El resultado es la misma imagen pero con mayor contraste. 6) Para conocer la nueva intensidad total, volvemos a hacer Analyze/Measure (o Ctrl+M). Si la resta de Min en el paso 4 fue pequeña, el valor de Mean es el inicial multiplicado por C. 4- MÉTODO OPERATIVO A. Homogeneidad de una fuente extensa: A1. Comprobar que la cámara está enfocada sobre la fuente luminosa (colocando un objeto auxiliar que luego retiramos) y tomar una imagen y guardarla en un fichero (por ejemplo, “fondo_0”). A2. Abrir con ImageJ la imagen y convertirla a 8-bit (File/Open…; Type>8-bit). A3. Obtener el histograma de la imagen, que tendrá un pico muy pronunciado en una cierta intensidad. Analyze/Histogram (o pulsar ctrl-H). A4. Realzar el contraste de la imagen siguiendo el procedimiento del apartado anterior. A5. Vemos el aspecto final y comprobamos si se aprecia alguna forma en la distribución de luz de la fuente, resultado que contrastaremos con el profesor de prácticas. B. Cuenta de objetos: B1.- Se parte de una imagen enfocada de la pantalla luminosa, que guardamos en un fichero (por ejemplo “fondo”). Abrir con ImageJ la imagen y convertirla a 8-bit (File/Open…; Type>8-bit). B2.- Anotamos la suma de intensidades asociada a esta imagen I0: Analyze/Measure (o Ctrl+M). De la ventana Results, Count*Mean es la intensidad total en la imagen. (Para las operaciones posteriores bastaría el valor de Mean porque Count es igual en todas las imágenes). B3.- Colocamos un pequeño disco opaco (moneda) sobre la pantalla, y tomamos una nueva imagen, que guardamos en “disco_1”. Operamos igual que con la imagen anterior (no olvidar convertir a 8-bit) y anotamos la suma de intensidades asociada a esta imagen, I1. B4.- Colocamos un número arbitrario de discos N y capturamos una nueva imagen, que guardamos en “disco_N”. Operamos igual que con las imágenes anteriores y anotamos la suma de intensidades asociada a esta imagen, IN: B5.- Si la sensibilidad de la cámara se mantuviese constante de imagen a imagen (independiente de la cantidad de luz en la imagen), el número de discos podría obtenerse haciendo la operación (I0-IN)/(I0-I1), que lógicamente daría un valor aproximadamente entero (en otras palabras, el oscurecimiento producido por N discos sería N veces el oscurecimiento producido por 1 disco). Sin embargo, la sensibilidad de la cámara cambia adaptándose a la iluminación presente. Podemos comprobarlo al observar que la citada operación no sólo no produce el número entero deseado sino que puede producir valores absurdos (incluso negativos). B6.- Para solucionar este problema transformaremos las imágenes “fondo”, “disco_1” y “disco_N” en binarias, es decir, las transformaremos en imágenes que contengan sólo los valores mínimo y máximo de intensidad: 0 ó 255. Para binarizar la imagen “fondo” basta multiplicarla por un número C, tal que el resultado sea mayor que 255 para todos los píxeles. Al superar esa cifra el valor de la intensidad asignado a ese píxel será 255. En la duda podemos tomar C=300 y ya está. Para binarizar las imágenes de “disco_1” y “disco_N”, daremos los dos pasos de aumento de contraste pero para contraste máximo, es decir: 1) Restaremos a toda la imagen un valor de intensidad intermedio entre la parte del disco y la parte del fondo (este valor lo podemos obtener paseando el ratón por la imagen o observando los dos picos principales del histograma de grises). Esta operación asigna el valor 0 a los puntos del disco, y también reduce algo los del fondo, pero no me importa. 2) Seguidamente multiplicaremos toda la imagen por una constante suficientemente alta para que los puntos del fondo pasen a valer el máximo, 255. Como antes, en la duda puedes tomar cualquier valor >255, por ejemplo 300. Comprueba que has obtenido las imágenes saturadas y guárdalas. B7.- Con las imágenes saturadas ya podemos realizar la operación: N = (I0-IN)/(I0-I1). Este número será el número de objetos puestos sobre la mesa. Dicho número será tanto más aproximado a un entero cuanto más homogéneo sea el tamaño de los objetos. C. Movimiento de objetos: C1.- Se distribuyen los objetos aleatoriamente sobre la pantalla luminosa y se captura una imagen, que guardamos en “mov_0”. Abrir con ImageJ la imagen y convertirla a 8-bit (File/Open…; Type>8-bit). C2.- Avisamos al profesor de prácticas, que desplazará ligeramente alguno de los objetos. C3.- Se captura una nueva imagen, que se guarda en “mov_1”. Abrir la imagen y convertirla a 8-bit (File/Open…; Type>8-bit). C4.- Para comparar las dos imágenes las restamos, como queremos guardar el resultado en un fichero distinto hacemos: Process/Image Calculator…, en la ventana que se abre rellenar lo siguiente, image1: “mov_0”, operation: “subtract”, image2: “mov_1”, y marcar la casilla Create New Window. Hacer clic en OK y el resultado aparecerá en una ventana nueva. Obtendremos cero en todos los puntos que sigan igual de luminosidad, y valores distintos en aquellos puntos que hayan reducido o aumentado su luminosidad (al desplazarse un objeto, tapó la fuente en ciertos puntos y la destapó en otros). 5- CUESTIONES 1.- ¿Qué es el contraste? 2.- En el apartado 4A) ¿cómo se consigue que una fuente extensa sea homogénea? ¿Crees que se ha logrado en el caso que has analizado? 3.- (Apartado 4B) ¿Crees que con este método podríamos detectar automáticamente el hecho de que dos objetos están solapando (uno montado parcialmente sobre otro)? 4.- (Apartado 4B) ¿Valdría este método para objetos diferentes? ¿En qué casos podría servir? 5.- En el apartado 4C) ¿Sabrías decir cuál ha sido la magnitud aproximada de los desplazamientos detectados? ¿Con qué precisión puedes dar este valor? 6.- En el apartado 4C ¿Cómo medirías velocidades con un método similar?