Filtro sepia con Python e imageio - Programación para modificar imágenes

Filtro de sepia a imagen con Python

Hoy te enseñaré a aplicar el filtro de sepia a una imagen utilizando programación y manipulación a nivel de pixeles en una imagen usando Python.

No vamos a usar librerías para la transformación, vamos a leer cada nivel de color de cada pixel y transformarlo para tener un filtro sepia.

Todo esto lo haremos recorriendo la matriz de pixeles; al final podremos convertir una imagen a modo sepia con Python.

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.

Transformando pixel en sepia

Vamos a centrarnos en el título del post: convertir imagen a sepia con Python. En este caso debemos aplicar simples transformaciones matemáticas a cada pixel, quedando así:

  • Sepia rojo = 0.393 ∗ Original rojo + 0.769 ∗ Original verde + 0.189 ∗ Original azul
  • Sepia verde = 0.349 ∗ Original rojo + 0.686 ∗ Original verde + 0.168 ∗ Original azul
  • Sepia azul = 0.272 ∗ Original rojo + 0.534 ∗ Original verde + 0.131 ∗ Original azul

Entonces básicamente es extraer los 3 niveles de color RGB, luego multiplicar, modificar el pixel o bit en cuestión (y luego hacerlo por cada pixel en la imagen) y guardar la imagen.

Nota: existe la posibilidad de que el valor sepia se pase del rango de 255 (recuerda que las BMP tienen niveles de color del 0 al 255) así que si nos pasamos de ese valor debemos modificarlo para que sea 255.

Función en Python

Ahora veamos el código. Simplemente recorremos la fila de pixeles de la imagen; dentro de cada fila recorremos el pixel. En ese pixel extraemos sus niveles de color, hacemos operaciones y guardamos:

def sepia(nombre_imagen):
    matriz = leer_imagen(nombre_imagen)
    ancho = len(matriz[0])
    alto = len(matriz)
    for y in range(alto):
        for x in range(ancho):
            pixel = matriz[y][x]
            original_rojo = pixel[0]
            original_verde = pixel[1]
            original_azul = pixel[2]
            sepia_rojo = round(0.393*original_rojo +
                               0.769*original_verde+0.189*original_azul)
            sepia_verde = round(0.349*original_rojo +
                                0.686*original_verde+0.168*original_azul)
            sepia_azul = round(0.272*original_rojo +
                               0.534*original_verde+0.131*original_azul)
            pixel_sepia = [sepia_rojo, sepia_verde, sepia_azul]
            for indice in range(len(pixel_sepia)):
                if pixel_sepia[indice] < 0:
                    pixel_sepia[indice] = 0
                elif pixel_sepia[indice] > 255:
                    pixel_sepia[indice] = 255
            matriz[y][x] = pixel_sepia
    return matriz

Estoy recorriendo la imagen en las líneas 5 y 6, luego extraigo el pixel en la línea 7. Más adelante extraigo los 3 niveles de color en las líneas 8 a 10.

Después hago las operaciones matemáticas para el modo sepia, ajusto los colores por si se pasan del 255 o están bajo 0 en la línea 18 a 22 y asigno el pixel sepia en la línea 23.

Poniendo todo junto

El código Python completo que toma una imagen y le aplica el filtro de sepia queda como se ve a continuación:

"""
    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 sepia(nombre_imagen):
    matriz = leer_imagen(nombre_imagen)
    ancho = len(matriz[0])
    alto = len(matriz)
    for y in range(alto):
        for x in range(ancho):
            pixel = matriz[y][x]
            original_rojo = pixel[0]
            original_verde = pixel[1]
            original_azul = pixel[2]
            sepia_rojo = round(0.393*original_rojo +
                               0.769*original_verde+0.189*original_azul)
            sepia_verde = round(0.349*original_rojo +
                                0.686*original_verde+0.168*original_azul)
            sepia_azul = round(0.272*original_rojo +
                               0.534*original_verde+0.131*original_azul)
            pixel_sepia = [sepia_rojo, sepia_verde, sepia_azul]
            for indice in range(len(pixel_sepia)):
                if pixel_sepia[indice] < 0:
                    pixel_sepia[indice] = 0
                elif pixel_sepia[indice] > 255:
                    pixel_sepia[indice] = 255
            matriz[y][x] = pixel_sepia
    return matriz


guardar_imagen("travel_sepia.bmp", sepia(NOMBRE_IMAGEN))

Al ejecutarlo y tener la imagen podemos ver que se genera la nueva con el filtro sepia, todo esto hecho por nuestras manos modificando cada pixel:

Filtro sepia con Python e imageio - Programación para modificar imágenes
Filtro sepia con Python e imageio – Programación para modificar imágenes

Para terminar te dejo con más tutoriales de Python en mi blog.

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 *