Remplazar color en una imagen usando Pillow – Python

Pillow es una super libreria para el trabajo con imagenes en python que a su vez es un fork de otra super libreria llamada PIL.

Hace varios dias tenia que descargar / generar al rededor de 80 iconos de un color en particular estos, resulta que dicho color no era el que necesitaba :/ y tenia que cambiar estas 80 imagenes o descargarlas nuevamente, algo que no iba a pasar, pero bueno soy programador y pos recorde esta libreria Pillow :).

Instalacion

pip install Pillow

Pillow y PIL no pueden estar instalados en el mismo entorno, asi que a desinstalar PIL en caso de tenerla instalada.

Ahora como cambiar el color de un pixel usando Pillow

from PIL import Image

imagen = Image.load('imagen.jpg')

pixeles = im.load()

pixeles[0,0] = (33,150,243)

imagen.save("nueva_imagen.jpg")

De esta forma se cambia un el color a un pixel usando pillow y python.

Bueno, el caso de uso que me toco solucionar fue cambiar el color del icono y como estos eran iconos de un solo color, solo tenia que identificar el color en el píxel y si era el color que quería cambiar pues lo cambiaría. Bueno aquí mi solución.

#Ambos colores son colores aleatorios
color_actual = (33,150,243)
color_nuevo = (0,172,193)

icono = Image.open('icono.png')
icono = im.convert("RGBA")

pixels = im.load()

width, height = icono.size

for x in range(width):
    for y in range(height):
        r, g, b, a = pixels[x, y]
        
        if (r, g, b) == color_actual:
            pixels[x, y] = (color_nuevo[0], color_nuevo[1], color_nuevo[2], a)

icono.save("icono_nuevo_color.png")

Esta es una solución bien basica y funciona, pero puede ser mejor como todo en la vida, esta nueva solución mejorada utiliza la potencia de Numpy para trabajar con arreglos.

import Image
import numpy as np

color_nuevo = (0,172,193)
color_actual = (33,150,243)

icono = Image.open('icono.png')
icono = im.convert("RGBA")

data = np.array(icono)
data[(data == color_actual).all(axis = -1)] = color_nuevo

icono_nuevo = Image.fromarray(data, 'RGBA')
icono_nuevo.save('nuevo_icono.png')

Esta solución la encontre en StackOverflow

Espero que este tutorial le sea de ayuda a mas de uno. 🙂

Referencia

Pillow
Numpy