Reflejo horizontal (espejo) a imagen con Python e imageio - Trabajo con imágenes

Reflejo horizontal a imagen con Python

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.

Reflejo horizontal (espejo) a imagen con Python e imageio - Trabajo con imágenes
Reflejo horizontal (espejo) a imagen con Python e imageio – Trabajo con imágenes

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *