Sei sulla pagina 1di 10

Computación Aplicada – 2017-B 1 de 10

Segundo Examen Parcial


Modalidad de entrega
INDIVIDUAL O EN PARES
Un archivo comprimido en formato .zip con todos sus archivos. El nombre de su archivo
comprimido debe ser
ca_ex2_<CUI>.zip o ca_ex1_<CUI1>_<CUI2>.zip
Enviarlo al correo gustavo.puma.tejada@gmail.com con el asunto: CAB-EX2.
NO se considerarán trabajos con otro asunto.

Fecha límite de entrega


Domingo 19 de noviembre del 2017 a las 23:55

Fecha límite de presentación en clase


Miércoles 22 de noviembre.

Información sobre actos deshonestos


Se consideran actos deshonestos a:
• Presentar código realizado por terceros
• Copiar código fuente de otros compañeros y presentarlo
• Dejar que otros compañeros copien o compartir su código fuente
Los actos deshonestos resultarán en una calificación de cero sobre todo el trabajo sin
oportunidad a recuperar.
Lectura obligatoria: Aprende sobre el plagio y cómo evitarlo

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 2 de 10

Introducción – Comparador de Imágenes


Para este trabajo creará un rudimentario comparador de imágenes. Ud. deberá poder ingresar dos
imágenes y su programa deberá indicar si son similares o no.
Existen varios conceptos correspondientes al área de procesamiento de imágenes que
probablemente son nuevos para Ud., los cuales están explicados en las secciones a continuación.
Lea detenidamente.

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.

Ilustración 1: Creando colores con píxeles RGB. Fuente:


archive.xarazone

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 3 de 10

Leyendo y mostrando imágenes


Para leer una imagen utilizamos la función imread:
>> img=imread(‘ perro.jpg’ );

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)

Y si quisieramos acceder a toda la matriz del componente verde:


>> img(;, ;, 2)

Para finalizar, el comando que muestra una imagen es imshow


>> imshow(img)

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.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 4 de 10

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:

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 5 de 10

{
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

Ilustración 4: Foto original y foto binarizada con u=100.

Histogramas
Un histograma es una gráfica que representa la frecuencia de una variable en forma de barras.

Ilustración 5: Histograma de la distribución de edades entre una


población. Fuente: universoformulas.com

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.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 6 de 10

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)

Ilustración 6: Histogramas de intensidad de cada


componente RGB de una imagen 1296x792 píxeles.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 7 de 10

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)

Ilustración 7: Histogramas de intensidad normalizados de


cada componente RGB de una imagen 1296x792 píxeles.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 8 de 10

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.

Método simple de similitud


Para este método necesitamos los histogramas normalizados de la imagen binarizada. Las imágenes
son binarizadas porque nos interesa comparar forma, no color. Los histogramas son normalizados
para poder comparar imágenes de distintos tamaños.

{
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.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 9 de 10

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.

Mg. Gustavo H. Puma Tejada Examen Parcial 2


Computación Aplicada – 2017-B 10 de 10

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

Mg. Gustavo H. Puma Tejada Examen Parcial 2

Potrebbero piacerti anche