Skip to content

Instantly share code, notes, and snippets.

@Dietr1ch
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dietr1ch/0e9ad090466cffd237d8 to your computer and use it in GitHub Desktop.
Save Dietr1ch/0e9ad090466cffd237d8 to your computer and use it in GitHub Desktop.
Funciones como parámetros
# 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