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:
Para terminar te dejo con más tutoriales de Python en mi blog.