Anda di halaman 1dari 11

ING1310 - Introduccin a la Computacin

Tarea 2
Fecha de Entrega: martes 27 de octubre hasta las 23:59.

1. Introduccin
En esta tarea aprenders sobre procesamiento bsico de imgenes en Python. Adems de co-
nocer cmo representa una imagen el computador. El objetivo de la tarea es que apliques todo el
conocimiento que has aprendido durante el curso, en especial la materia de listas, arreglos y grficos.

2. Explicacin Previa
Para poder trabajar con imgenes es necesario entender como se representa una imagen en un
programa, y cmo se puede operar sobre ella.
En palabras sencillas, una imagen es una matriz donde cada celda representa un color. Cada una
de estas celdas es conocida como pixel. Ahora bien, cada color est representado por tres valores
enteros, uno que representa la intensidad de rojo, otro la intensidad de verde y el ltimo la intensidad
de azul, esto se conoce como el modelo RGB (por las siglas en ingls RedGreenBlue). La intensidad
de cada color va entre 0 y 255, siendo el nmero la cantidad de color. Por ejemplo, el blanco es
[255255255], el negro es [000] (ausencia de color), el amarillo es la mezcla entre rojo y verde, por lo
que estara representado por [2552550]. Para ms detalles se recomienda el siguiente link:

http://en.wikipedia.org/wiki/RGB

(a) Imagen (b) Pixeles

Figura 1: Una imagen como la de la izquierda est compuesta por pixeles, como los que se ven en
la figura de la derecha.

Para la tarea debers utilizar el anexo que se incluye al final del enunciado, donde se explica en
detalle cmo leer, mostrar y guardar una imagen en Python.
Al leer una imagen desde un archivo con Python obtendremos un arreglo tridimensional, donde
las dos primeras dimensiones tendremos la posicin del pixel y en la tercera las intensidades de rojo,
verde y azul del pixel respectivamente.

1
2

1 (0,0) (0,1) (0,2)

0 (1,0) (1,1) (1,2)


0 1 2 3
Figura 2: Representacin de una imagen de 2x3 pixeles y la disposicin de ellos.

En la Figura 2, podemos ver una representacin de una imagen de 2x3 pixeles, y como estos
pixeles se ubican en un arreglo en Python.
2

1 [0 0 0] [0 0 255] [255 255 0]

0 [255 255 255] [255 0 0] [0 255 0]


0 1 2 3
Figura 3: Representacin de una imagen de 2x3 pixeles y las intesidades de ellos.

En la Figura 3, podemos ver una representacin de una imagen de 2x3 pixeles, y las intensidades
que poseen cada uno.

Si leemos las imgenes que aparecen en la Figura 2 y Figura 3, la representacin grfica de los
arreglos se vera de la siguiente manera:

fig2 = [[[ 0. 0. 0.] fig3 = [[[ 0. 0. 0.]


[ 255. 255. 255.] [ 0. 0. 255.]
[ 0. 0. 0.]] [ 255. 255. 0.]]

[[ 255. 255. 255.] [[ 255. 255. 255.]


[ 0. 0. 0.] [ 255. 0. 0.]
[ 255. 255. 255.]]] [ 0. 255. 0.]]]

2
3. Descripcin del men
(0,5 puntos) A continuacin se detalla el men que debe incluir tu tarea y que acciones debe
realizar. El men tiene un contexto de que existe una imagen en memoria y esta va cambiando a
medida que el usuario le aplica rotaciones o filtros. Despus de finalizar cada accin el programa
debe volver al men principal. Adems, despus de aplicarle una rotacin o un filtro a la imagen
debe preguntarle al usuario si desea guardar la imagen, y en caso afirmativo debe preguntarle el
nombre del archivo con el cul quedar guardada la imagen (0,2 puntos, los cuales ya estn incluidos
en cada tem).

1. Mostrar Imagen (1,0 punto) Muestra la imagen en pantalla.

Figura 4: Imagen original mostrada a travs de Python.

2. Aplicar rotacin (1,0 punto) Muestra al usuario los grados en que puede rotar la imagen
en sentido horario.

1. 90
2. 180
3. 270

3
Figura 5: Imagen original rotada en 90.

3. Aplicar filtro Muestra al usuario los distintos filtros que puede aplicarle a una imagen.

1. Escala de grises (1,0 puntos)


En el modelo RGB obtenemos gris cuando las tres intensidades son iguales, es decir,
tenemos 256 tonalidades distintas de grises. Una forma de transformar una imagen a
escala de grises es tomar el promedio de las intensidades del pixel original y asignar
ese valor a todas las intensidades del nuevo pixel. Por ejemplo, si tenemos [40 120
200], el nuevo pixel quedara representado por [120 120 120].

Figura 6: Imagen original en escala de grises.

4
2. Sepia (1,0 punto)
Para aplicar filtro sepia a una imagen, el nuevo pixel viene dado por la siguiente
frmula:
rojoNuevo = (rojoOriginal * .393) + (verdeOriginal * .769) + (azulOriginal * .189)
verdeNuevo = (rojoOriginal * .349) + (verdeOriginal * .686) + (azulOriginal * .168)
azulNuevo = (rojoOriginal * .272) + (verdeOriginal * .534) + (azulOriginal * .131)
En caso de que alguna de las nuevas intensidades sobrepase el valor 255, este queda
como 255.

Figura 7: Imagen original aplicado filtro sepia.

5
3.1. Bonus (1,0 punto)
Para poder acceder al bonus debe primero realizar el item Mostrar histograma.
3. Negativo (0,3 puntos)
Para aplicar filtro negativo, las intensidades del nuevo pixel, sern la diferencia entre
255 y el valor de la intensidad original. Por ejemplo, si tenemos [50 80 170], el nuevo
pixel quedara [205 175 85].

Figura 8: Negativo de imagen original.

4. Relieve (0,7 puntos)


Para aplicar filtro relieve, en primer lugar deben transformar la imagen a escala de
grises. Luego aplicar la siguiente frmula para generar los nuevos pixeles:

nuevaImagen[i][j] = G[i][j] K

Donde:
G[i][j] corresponde a la matriz de 3x3 formada por los valores de las intensidades
de los pixeles que rodean al pixel [i][j], siendo este el central.

2 1 0

K corresponde a la matriz de 3x3 definida por: 1 1 1
0 1 2
La es la convolusin
operatoria entre dos matrices, que se define como:
a b c 1 2 3

d e f * 4 5 6 = (1*a)+(2*b)+(3*c)+(4*d)+(5*e)+(6*f)+(7*g)+(8*h)+(9*i)
g h i 7 8 9
Observaciones:
a) Si el valor de la convolusin es menor a 0, esta toma el valor 0.
b) Si el valor de la convolusin es mayor a 255, esta toma el valor 255.

6
c) Al identificar la matriz G[i][j], esta debe referirse a los valores originales de la
imagen en escala de grises.
d) La matriz G debe ser de 3x3, luego los pixeles de los bordes de la imagen nueva
quedan sin modificaciones con respecto a la original.

Figura 9: Imagen original con filtro de relieve

7
4. Mostrar histograma (1,5 puntos) Un histograma de una imagen ilustra en un grfico
cmo estn distribuidos los pxeles de la imagen mostrando la cantidad de pxeles en cada
nivel de intensidad del color. Al mostrar los detalles de las sombras (en la parte izquierda),
los medios tonos (en el centro) y las iluminaciones (en la parte derecha), el histograma es una
buena manera de apreciar, de un vistazo, si una fotografa est muy oscura o muy clara.
Lo que debes mostrar es una figura con tres grficos, uno para cada intensidad (rojo, verde y
azul) mostrando las frecuencias de cada uno. Donde, en el eje horizontal, van los valores de 0
a 255, y en el eje vertical la frecuencia de cada valor. Para una mejor lectura de los grficos,
los valores del eje vertical lo limitaremos para que vaya desde 0 hasta el mximo valor de la
frecuencia entre las intensidades de rojo, verde y azul, para los valores entre 10 y 245 del eje
horizontal. Si luego de calcular el mximo, este tiene valor 0 (pasara con una foto que tiene
pixeles blancos y negros), se fija el valor como la mxima frecuencia entre 0 y 255.

Figura 10: Histograma imagen original.

5. Salir Termina la aplicacin.

8
4. Men del programa
Esto es un ejemplo de cmo debera ser la estructura y flujo de tu programa.

Bienvenido a PhotoPython!
1. Cargar una imagen
2. Salir
Ingrese una opcin: 1

Cargar Imagen
Ingrese ruta de la imagen: bob.png
Imagen cargada con xito!

Imagen: bob.png
1. Mostrar imagen
2. Aplicar rotacin
3. Aplicar filtro
4. Mostrar histograma
5. Salir
Ingrese una opcin: 2

Imagen: bob.png
Aplicar rotacin
1. 90
2. 180
3. 270
4. Volver
Ingrese una opcin: 1

Imagen rotada en 90 grados.


Desea guardar la imagen(s/n)? n

4.1. Interaccin con el usuario


Su programa debe validar que la opcin ingresada es una dentro del rango de opciones permitidas.
En caso de que no lo sea, debe mostrarle un mensaje acorde al usuario y dejar que ingrese una vlida
nuevamente.

9
5. Evaluacin y Entrega
Fecha de entrega: martes 27 de octubre hasta las 23:59, segn la hora del servidor de la pgina
del curso en https://saf.uandes.cl/ing/. Por ningn motivo se aceptarn tareas atrasadas.
Formato de entrega: Subir un solo archivo comprimido con todo el cdigo fuente de
su programa al mdulo de tareas de la pgina del curso en https://saf.uandes.cl/ing/, con
el nombre de archivo Tarea2-RUT.zip el cual deber contener los archivos de cdigo fuente en
Python (los .py), reemplazando RUT por su nmero de RUT sin puntos ni guin. Por ejemplo,
si su Rut es 18.123.122-K, el nombre de archivo debe ser Tarea2-18123122k.zip.
Aquellas tareas que no compilen, es decir, que no sea posible ejecutarlas, o produzcan errores al
hacerlo, tendrn como mximo nota 3,0 en la tarea. Debe asegurarse de que su tarea sea descargable
de forma ntegra (todos los archivos .py)

6. Consideraciones
El trabajo en las tareas es estrictamente individual, por lo que cuide su tarea para que no sea
copiada parcial o ntegramente por otros. Todas las tareas entregadas sern comparadas por un
sistema automtico de deteccin de plagios. Cualquier copia ser penalizada, recibiendo el mismo
castigo tanto quien copia como quien permite que le copien. Tambin es considerada copia cualquier
ayuda externa recibida directamente en la tarea, sin importar si proviene de un alumno del curso,
de la universidad, o de otro lugar. El castigo ser establecido por el Consejo de la Facultad, siendo
como mnimo un 1,0 de promedio en el curso.

10
7. Anexo
7.1. Leer una imagen desde un archivo
El mtodo leerImagen recibe la ruta de la imagen como string y devuelve un arreglo tridimen-
sional representando la imagen en el disco. Por ejemplo, el parmetro rutaImagen podra tomar los
siguientes valores: bob.png, magenes/bob.png.
Se recomienda utilizar imgenes con extensin png ya que es el tipo de imgenes que acepta nati-
vamente matplotlib sin ninguna librera externa.
Es posible que algunas imgenes png contengan un cuarto valor para representar un pixel, inten-
te evitar esas imgenes. NO puede utilizar libreras externas a las que hemos visto en clases, en
particular, PIL y Pillow.

1 from numpy import *


2 import matplotlib.image as mpimg
3 import matplotlib.pyplot as plt
4
5 def leerImagen(rutaImagen):
6 imagen = mpimg.imread(rutaImagen)
7 return imagen * 255

El mtodo mostrarImagen toma un arreglo tridimensional representando a una imagen, cmo


el que devuelve el mtodo leerImagen, y lo muestra en una ventana.

7.2. Mostrar una imagen desde un arreglo tridimensional

1 from numpy import *


2 import matplotlib.image as mpimg
3 import matplotlib.pyplot as plt
4
5 def mostrarImagen(imagen):
6 plt.imshow(imagen / 255, interpolation='none ')
7 plt.show ()

El mtodo guardarImagen toma un string con la ruta en que se guardar la imagen y un


arreglo tridimensional representando a una imagen, cmo el que devuelve el mtodo leerImagen,
y guarda la imagen al disco. Por ejemplo, el parmetro rutaImagen podra tomar los siguientes
valores: bob.png, magenes/bob.png.

7.3. Guardar una imagen desde un arreglo tridimensional

1 from numpy import *


2 import matplotlib.image as mpimg
3 import matplotlib.pyplot as plt
4
5 def guardarImagen(rutaImagen , imagen):
6 mpimg.imsave(rutaImagen , imagen / 255)

11

Anda mungkin juga menyukai