Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Representación de imágenes
Una imagen digital es representada por una matriz de píxeles.
Píxel
Un píxel es la unidad mínima de representación de color de una imagen digital. Aunque existen
distintos modelos de colores para representar píxeles, para los propósitos de este trabajo usaremos
el modelo de color RGB (Red Green Blue). Dicho modelo, como su nombre lo indica, representa a
un píxel como la intensidad de cada uno de estos tres componentes, la cual va de 0 a 255. Entonces,
podemos decir que un píxel es representado por tres números enteros en el rango de 0 a 255,
donde cada número representa al componente rojo, verde y azul, en ese orden.
Guarda el contenido de la imagen perro.jpg en una hipermatriz de tres dimensiones llamada img. Si
perro es una imagen de 1600x900 píxeles (se lee de 1600px de ancho por 900px de alto) al llamar a
la función size sobre img tendríamos lo siguiente:
>> size(img)
ans =
900 1600 3
El número tres podría decirse que indica que la imagen está representada por tres matrices de
900 filas x 1600 columnas, cada matriz representa a un color del sistema RGB. Por ejemplo, si
quisieramos acceder al componente verde del pixel en la posición (1,1) escribiríamos:
>> img(1,1,2)
Nos mostraría la imagen que habíamos leído previamente. Use este comando en conjunto con
subplot para mostrar múltiples imágenes en una sola figura.
Procesamiento de imágenes
Escala de grises
Si un píxel está representado por la intensidad de rojos, verdes y azules: ¿Cómo se representan las
imágenes a escala de grises? Esto se obtienen calculando solo la intensidad de la luz y existen
distintos métodos para lograr esto.
Método simple
En el método simple solo calculamos el promedio de la intensidad de cada componente.
grises(P RGB)=( PR + P G + PB )/3=P R∗0.3333+ PG∗0.3333+ P B∗0.3333
Por ejemplo, si tenemos el píxel PRGB=(255, 165, 0). Su intensidad gris sería 140.
Ilustración 2: Foto original y foto convertida a escala de grises usando el método simple.
Método ponderado
Aquí se usa un promedio ponderado, este método suele dar mejores resultados. Los pesos dados a
continuación son los especificados en el estándar CIE 1931:
grises(P RGB)=P R∗0.2126+ PG∗0.7152+ PB∗0.0722
Por ejemplo, si tenemos el píxel PRGB=(255, 165, 0). Su intensidad gris sería 172 (redondeando).
Ilustración 3: Foto original y foto convertida a escala de grises usando el método ponderado.
Binarización
La binarización es el proceso mediante el cual una imagen se reduce a dos colores únicamente:
blanco y negro. Cuáles píxeles son cambiados a blanco y cuáles a negro lo decide un umbral. Este
un umbral es un número arbitrario; un umbral común para empezar es de 100.
La binarización se efectúa después de convertir una imagen a escala de grises. El método para
binarizar es el siguiente:
{
binarizar ( p g)=
255
0
si
si
p g≥u
p g <u
Donde pg es un píxel gris y u es el umbral. 255 es el código del negro y 0 es el código del blanco.
Por ejemplo, si tenemos el píxel gris pg=(140) y el umbral u=120, entonces binarizar(pg)=255
Histogramas
Un histograma es una gráfica que representa la frecuencia de una variable en forma de barras.
Histogramas de color
Una de las maneras más comunes de obtener información sobre una imagen es calcular un
histograma de color. Dicho histograma nos mostraría cómo están distribuidos los colores en una
imagen (frecuencia de las intensidades). Ahora, como sabemos que una imagen consiste de tres
componentes (RGB) lo común es graficar los tres histogramas en una misma figura.
Graficando un histograma
Dado que un histograma cuenta cuántas veces aparece cada intensidad en la imagen, la forma de
una matriz deja de ser necesaria; deberíamos aplanar la matriz mxn para facilitar el procesamiento,
es decir, convertirla a un vector de longitud m*n. Para aplanar utilizamos la función reshape.
Supongamos que tenemos una imagen img2 de 50x40 píxeles (50px de ancho por 40px de alto), al
llamar a size tendríamos:
>> size(img2)
ans =
40 50 3
Entonces deberíamos obtener un vector de longitud 2000 para cada uno de los tres componentes,
usando la función reshape. Una vez tengamos los vectores, llamamos a la función hist, la cual
calcula el histograma de un vector y lo grafica:
>> size(img_rojo_aplanado)
ans =
1 2000
>> hist(img_rojo_aplanado)
Como un histograma está compuesto de barras que representan los intervalos de los valores, la
función hist automáticamente grafica 10 barras como intervalos si no especificamos número de
barras. Si quisiéramos que hubiera una barra por cada intensidad de color (las intensidades van de 0
a 255):
>> hist(img_rojo_aplanado, 256)
Normalización
Habíamos mencionado que los histogramas son una herramienta útil para describir una imagen, por
lógica, también deberían servirnos para comparar imágenes. Supongamos que tenemos una imagen
A de 50x40 píxeles y otra imagen B de 5000x4000 pixeles, ambas son la misma foto pero con
distinto nivel de detalle. A pesar de ser la misma foto esencialmente, sus histogramas serían
completamente distintos por el hecho de que su tamaño resulta en frecuencias muy distintas.
Un histograma relativo o normalizado es aquel que expresa las frecuencias en términos de
porcentajes, es decir, como decimales entre 0 y 1. Entonces, el método de normalizar una intensidad
específica i sería:
normalizar (i)=i/número total de pixeles de laimagen
Para calcular un histograma relativo, una manera de proceder es usar la función hist para que le
calcule el histograma sin graficarlo, Ud. se encarga de normalizarlo y luego grafica su histograma
normalizado usando la función bar:
>> h=hist(img_rojo_aplanado, 256);
>> # normalizamos al histograma
>> bar(h_norm)
Comparando imágenes
Llegamos a la parte más interesante; aquí juntaremos todo lo que hemos realizado anteriormente.
Existen muchos métodos de comparar imágenes, de hecho, es toda un área de investigación.
Nosotros utilizaremos un método simple, que es el de comparar los histogramas de dos imágenes.
{
igual si euclid (hist a ,hist b)=0s
similitud (hist a ,hist b)= similar si 0<euclid (hist a , hist b)≤u s
distintas si euclid( hist a , hist b )> us
Donde hista y histb son los histogramas normalizados de las dos imagenes binarizadas a comparar,
respectivamente. Euclid es la distancia euclidiana entre los dos histogramas y us es un umbral
arbitrario. En resumen, mientras más grande sea la distancia, menos parecidas son las
imágenes. El umbral us es un número arbitrario, Ud. debe experimentar con distintos umbrales y
elegir uno que le dé buenos resultados.
Actividades
El puntaje de cada ejercicio está al comienzo del enunciado, entre paréntesis:
1. (4) Muestre una figura con tres histogramas de frecuencia, uno por cada componente RGB.
El histograma del componente rojo deber usar barras rojas, el del verde, barras verdes y así
sucesivamente. Utilice la función hist con 256 bins. Su eje x debe ir de 0 a 256. (Vea la
ilustración 6)
2. (3) Lo mismo de arriba pero use histogramas normalizados. Cree su propia función de
normalización. (Vea la ilustración 7)
3. (2) Convierta la imagen a escala de grises usando el método simple y muestre el resultado.
Su función debe ser vectorizada. (Vea la ilustración 2)
4. (1) Convierta la imagen a escala de grises usando el método ponderado y muestre el
resultado. Su función debe ser vectorizada. (Vea la ilustración 3)
5. (2) Binarice la imagen. Pruebe con distintos valores de umbral y anote qué umbral le dio
mejores resultados. (Vea la ilustración 4)
6. (5) Compare la similitud de dos imágenes ingresadas. (Revise la sección “Comparando
Imágenes”)
Los ejercicios anteriores suman el 20, los ejercicios a continuación son extra:
7. (3) Convierta la imagen a escala de grises con cualquiera de los dos métodos pero utilice
for. Dese cuenta que esta versión es extremadamente lenta. OJO: dependiendo de sus
cálculos puede que esté generando una matriz de double, la cual no funciona con imshow
(aparece en blanco), asegúrese de convertir cada intensidad a uint8.
8. (3) Cree su propia función que calcule el histograma de una imagen.
9. (4) Cree un programa que compare una imagen A con todas las imágenes de una carpeta e
imprima la distancia a cada una.
10. (1) Gire una imagen 180 grados.
Recomendaciones
• No trabaje con imágenes que pesen más de 1MB.
• Existe una manera sencilla de reemplazar todos los elementos de una matriz. Por ejemplo:
>> M(M==0)=50;
El comando anterior cambia todos los elementos iguales a cero de la matriz M a cincuenta.
Funciones útiles
Utilice el comando help seguido del nombre de la función para saber más.
• uigetfile, muestra un diálogo de selección de un archivo, devuelve su ruta
• imread, lee una imagen dada una ruta
• imshow, muestra una imagen
• hist, calcula el histograma de frecuencia de un vector y lo grafica
• reshape, cambia las dimensiones de una matriz
• bar, muestra una gráfica de barras