Last active
August 29, 2015 14:13
-
-
Save Dietr1ch/0e9ad090466cffd237d8 to your computer and use it in GitHub Desktop.
Funciones como parámetros
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Probablemente encuentren que esto es algo extraño, pero | |
# luego se darán cuenta que permite expresar las ideas | |
# de manera muy clara y concisa. | |
# Usando funciones pueden lograr que su codigo separe la | |
# iteración sobre toda la imagen de lo que hay que hacer. | |
# Eso permite que escriban el loop que recorre la imagen una | |
# sola vez y que terminen simplificando el problema de cambiar | |
# toda la imagen por el de cambiar un solo pixel. | |
def ejemplo(img): | |
imagenComp = aplicarFuncion(img, complementoRGB) | |
return imagenComp | |
# Este va a ser el loop sobre toda la imagen, necesitamos | |
# que a cada pixel se le calcule un nuevo valor. | |
# | |
# El cálculo del nuevo valor va a ser hecho por una función | |
# que (dentro de 'aplicarFuncion') no se conoce, pero que | |
# quien quiera llamar a 'aplicarFuncion' tiene que entregar | |
# | |
# La función tiene esta firma: | |
# (imagen, posY, posX) -> pixel_xy | |
# | |
# Notar que se entrega la imagen completa y la posición | |
# del pixel nuevo, así que 'f' tiene la opción de acceder | |
# cualquier parte de la imagen, con lo que se pueden mirar | |
# las vecindades para calcular filtros más generales, como | |
# mediana, blur, derivada (detección de bordes) y | |
# convoluciones | |
def aplicarFuncion(img, f): | |
# Calcular el tamaño de la imagen | |
alto = len(img) | |
ancho = len(img[0]) | |
# Crear una nueva imagen | |
# (si modificamos img, llamadas de 'f' subsecuentes van | |
# usar otros colores) | |
fImg = matrizNone(ancho, alto) # Esta función no es de python, está definida al final | |
# Calcular 'f(imagen)' y retornarlo | |
for j in range(alto): | |
for i in range(ancho): | |
fImg[j][i] = f(img, j , i) # Acá están llamando a la función que reciben como parámetro (f)! | |
return fImg | |
# Devuelve un pixel con el complemento en RGB del color, | |
# muchas veces llamado inverso) | |
# | |
# Es importante notar que esta función se ve mucho más | |
# clara que si tratasen de hacer todo de una sola vez. | |
# Además permite que el resto de su código se vea más | |
# limpio, ya que no va a tener que arrastrar este código | |
# (y todos sus índices) | |
def complementoRGB(imagen, y, x): | |
pixel = imagen[y][x] | |
# Hay formas más elegantes de hacer esto, pero no es | |
# la idea complicarnos acá | |
r = 255-pixel[0] | |
g = 255-pixel[1] | |
b = 255-pixel[2] | |
return (r, g, b) | |
# Utilidades (Funciones no muy interesantes que hacen cosas útiles) | |
# ========== | |
# Crea una matriz de (ancho X alto) llena con None | |
def matrizNone(ancho, alto): | |
return matrizInicializada(ancho, alto, None) | |
# Crea una matriz de (ancho X alto) con 'valorInicial' en | |
# cada posición. | |
def matrizInicializada(ancho, alto, valorInicial): | |
matriz = [] | |
for i in range(alto): | |
fila = [] | |
for j in range(ancho): | |
fila.append(valorInicial) | |
matriz.append(fila) | |
return matriz | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment