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.
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.
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í:
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.
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.
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.