En este post de trabajo con imágenes en Python te mostraré cómo aplicar un reflejo horizontal a una imagen, de modo que podamos voltear la imagen de manera horizontal. Para ello vamos a trabajar con los pixeles de la imagen.
La asignación dice así:
Con este filtro queremos lograr el mismo resultado que un espejo, por lo que cualquier píxel ubicado al izquierdo ahora deberá estar en el derecho y viceversa. Se mantendrán todos los píxeles originales, solo que están organizados de manera diferente.
Entonces veamos cómo hacerlo usando Python, numpy e imageio.
Requisitos
Necesitas Python y PIP. Cuando tengas pip instala numpy e imageio con: pip install numpy imageio
No es obligatorio usar numpy (pero el ejercicio sí lo requiere, así que lo he usado), basta con imageio para obtener los pixeles de la imagen como una matriz así como lo hice cuando trabajé con esteganografía en Python.
Vamos a trabajar con una imagen BMP pero cualquier imagen que pueda ser convertida a matriz debería funcionar.
El algoritmo
Con el enfoque que vamos a usar para aplicar el espejo o reflejo horizontal a una imagen con Python básicamente trabajaremos con una matriz.
Esta matriz es de 2 dimensiones, y cada valor que tiene a su vez es una lista con 3 valores que representan el Red, Green y Blue del pixel.
Entonces haremos lo que hacíamos hace tiempo con C para invertir una cadena (para que notes cómo algoritmos tan simples sirven para cosas más complejas), que es recorrer la matriz desde el inicio hasta la mitad, y en cada paso intercambiar el extremo actual por el extremo opuesto.
De modo que vamos a ir fila por fila. Y en cada fila vamos a tomar el pixel 1 para intercambiarlo con el último pixel, luego el segundo pixel con el penúltimo y así hasta llegar a la mitad.
Código para reflejo horizontal en Python
Lo que expliqué anteriormente para modificar la imagen y girarla como si fuera un espejo queda así en código Python:
def reflejo_horizontal(nombre_imagen):
matriz = leer_imagen(nombre_imagen)
ancho = len(matriz[0])
alto = len(matriz)
for y in range(alto):
for x in range(int(ancho/2)):
indice_opuesto = ancho - x - 1
opuesto = matriz[y][indice_opuesto]
actual = matriz[y][x]
matriz[y][indice_opuesto] = actual
matriz[y][x] = opuesto
return matriz
Y para usarlo necesitamos unas funciones que convierten la imagen a matriz. Entonces el código completo queda así:
"""
https://parzibyte.me/blog
"""
import numpy as np
import imageio
NOMBRE_IMAGEN = "travel.bmp"
def leer_imagen(ruta):
return np.array(imageio.imread(ruta), dtype='int').tolist()
def guardar_imagen(ruta, matriz):
return imageio.imwrite(ruta, np.array(matriz, dtype="uint8"))
def reflejo_horizontal(nombre_imagen):
matriz = leer_imagen(nombre_imagen)
ancho = len(matriz[0])
alto = len(matriz)
for y in range(alto):
for x in range(int(ancho/2)):
indice_opuesto = ancho - x - 1
opuesto = matriz[y][indice_opuesto]
actual = matriz[y][x]
matriz[y][indice_opuesto] = actual
matriz[y][x] = opuesto
return matriz
guardar_imagen("travel_reflejo.bmp", reflejo_horizontal(NOMBRE_IMAGEN))
Al ejecutarlo funciona correctamente y con cualquier tipo de imágenes, siempre y cuando sea un BMP de 24 bits.
De este modo podemos aplicar un reflejo horizontal a una imagen usando únicamente Python, modificando los pixeles de la imagen.
Por aquí te dejo más tutoriales de Python.