Ejercicios para practicar numpy y optimización con scipy

LA-CoNGA 2021

Ejercicio elaborado por Eduardo E. Escalante R.

TAREA 3 (ejercicios-clase-05-datos)

1. La conversión de una imagen de color a escala de grises se puede hacer de varias formas.

El pixel $(1,1,1)$ representa el blanco y el $(0,0,0)$ el negro en RGB. Entonces, cuanto más grandes son los valores de los canales, más "blanco" es el pixel y viceversa.

Por eso, una forma simple para hacer la conversión consiste en sacar el promedio de los canales y usar eso como la intensidad. De hecho, esto es lo que implementaremos en nuestras celdas jupyter:

  1. Las imágenes se codifican como matrices. En particular, las imágenes de intensidad o escala de grises se codifican como una matriz de dos dimensiones, donde cada número representa la intensidad de un pixel. Las imágenes se codifican como matrices. En particular, las imágenes de intensidad o escala de grises se codifican como una matriz de dos dimensiones, donde cada número representa la intensidad de un pixel. Lo que significa que cualquiera de estas matrices que generamos se puede visualizar como una matriz. Para visualizar imágenes, usamos el módulo pyplot de la librería matplotlib.

2. Busqueda y visualización de la imagen

2.1. Primero ubiquemos y visualicemos la imagen con la función imshow del modulo pyplot que nos permite visualizar matrices, que invocaremos como plt.imshow, y recibe la imagen como parámetro. Debido a que pyplot intenta ajustar los colores automaticamente de una imagen, vamos a pasarle como parámetros también vmin=0,vmax=1. Estos se conocen como keyword parameters o parámetros por palabra clave de python.

2.2. Para leer imágenes utilizaremos el módulo *io* de la librería `skimage`. En ese módulo disponemos de la función `imread` para leer imágenes de un archivo (y también la función `imsave` para escribirlas a un archivo) esta función nos permite leer imagenes tanto en blanco y negro como en color.

2.3. En este caso, tenemos tres dimensiones. La primera y segunda de tamaños 789, 1184 corresponden a la cantidad de pixels de la imagen. La última, de tamaño 3, contiene los tres canales *R (red), G (green) y B (blue)* de la imagen.

Entonces cada trio $(r,g,b)$ que representa un pixel se reemplaza por su promedio $(r+g+b)/3$

Podemos ver cada canal individualmente, como si el canal fuera una imagen en escala de grises, para ver la intensidad de cada canal.

pyplot.figure crea una nueva figura con los atributos dados en los parámetros, donde figsize define el tamaño de la figura en pulgadas.

Recorte un sector de la imagen conteniendo una estrella individual y ajuste una gaussiana 2D simétrica a la imagen de la estrella por mínimos cuadrados, incluyendo una constante aditiva (el cielo "vacio" brilla).

3. ¿Cómo recortar una imagen? Para recortar una imagen vamos a tratar a esta como una matriz, para ello emplearemos indexación de Numpy, de donde escogeremos las filas y columnas que deseemos recortar de la imagen.

Planteando algo como lo siguiente: imagen[fila inicial : fila final, columna inicial : columna final]

4. Histograma de la imagen

Los histogramas son distribuciones que describen la frecuencia con las que se presentan los valores de intensidad (pixeles) de una imagen. Tomando como ejemplo una imagen típica a escala de grises de $8$ bits el histograma adoptará valores comprendidos entre $0$ y $255$ ya que $2^{8}=256$. Cada valor del histograma contiene el numero de pixeles correspondientes a esa intensidad.

Evidentemente el histograma no proporciona información acerca del origen de los pixeles que lo conforman. Esto significa que se pierde la informacion de la relación espacial que tenian los pixeles en la imagen, por lo que resulta imposible reconstruir una imagen a partir de su histograma.

El histograma muestra importantes caracteristicas de una imagen:

Por ejemplo el contraste y el rango dinamico, los cuales son problemas atribuidos a la captación de la imagen que es necesario resolver para que puedan ser analizados con mejor claridad propiedades de la imagen en bloques de procesamiento posterior; los errores de iluminación son reconocidos en el histograma, por lo que la region final o inicial de la escala de intensidad no es utilizada, mientras que las otras regiones del histograma son ocupadas por valores de intensidad de pixeles

Como contraste se entiende el campo de valores de intensidad de una imagen concreta que son utilizados, es decir, una imagen con contraste completo utiliza un intervalo completo de niveles de intensidad definidos para la imagen y bajo el termino de dinámica se entiende el número de pixeles diferentes que son utilizados en la imagen. El caso ideal resulta cuando es utilizado el rango completo de valores de intensidad disponibles, utilizando asi su maximo rango dinamico. Una dinamica alta representa una ventaja ya que se reduce el riesgo de perder calidad a traves de las siguientes etapas del procesamiento. Por esta razon las camaras digitales y los escaner profesionales tienen una resolucion mayor a los 8 bits, normalmente de 12 a 14 bits, aunque los elementos de despliegue tengan resoluciones normales con 256 valores de intensidad.

Tomemos una 2da estrella y hagamos el mismo tratamiento