Respuesta

15

Si numpy está disponible en su máquina, trate de hacer algo como:

import numpy as np 
from PIL import Image 

im = Image.open('fig1.png') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2 = 255, 255, 255 # Value that we want to replace it with 

red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2] 
mask = (red == r1) & (green == g1) & (blue == b1) 
data[:,:,:3][mask] = [r2, g2, b2] 

im = Image.fromarray(data) 
im.save('fig1_modified.png') 

Utilizará un poco (3x) más memoria, pero debe ser considerablemente (~ 5x, pero más para imágenes más grandes) Más rápido.

También tenga en cuenta que el código anterior es un poco más complicado de lo que debería ser si solo tiene imágenes RGB (y no RGBA). Sin embargo, este ejemplo dejará la banda alfa sola, mientras que una versión más simple no tendría.

4

acabo ocurrió con esta solución:

import Image 
im = Image.open("MyImage.png") 
width, height = im.size 
colortuples = im.getcolors() 
mycolor1 = min(colortuples)[1] 
mycolor2 = max(colortuples)[1] 
pix = im.load() 
for x in range(0, width): 
    for y in range(0, height): 
     if pix[x,y] == mycolor1: 
      im.putpixel((x, y), mycolor2) 
im.save('MyImage.png') 

Aunque putpixel no es rápido, parece ser lo suficientemente rápido para mí.

+0

Probablemente no hace una diferencia de velocidad prudente, pero se puede hacer 'pix [x, y] = mycolor2' en lugar de utilizar' im.putpixel() '. – zeekay

+0

Intenté esto, pero me sale un error debido al modo ('r') en el que abrí la Imagen. Intenté 'Image.open (" MyImage.png "," w ")', pero no funciona. No tengo idea de cómo podría usar 'pix [x, y] = mycolor2' –

+0

no estoy seguro de por qué no funcionaría, quizás un error? – zeekay

2

Esta es una modificación de la respuesta de Joe Kington anterior. A continuación, se muestra cómo hacer esto si su imagen también contiene un canal alfa.

import numpy as np 
import Image 

im = Image.open('fig1.png') 
im = im.convert('RGBA') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2, a2 = 255, 255, 255, 255 # Value that we want to replace it with 

red, green, blue, alpha = data[:,:,0], data[:,:,1], data[:,:,2], data[:,:,3] 
mask = (red == r1) & (green == g1) & (blue == b1) 
data[:,:,:4][mask] = [r2, g2, b2, a2] 

im = Image.fromarray(data) 
im.save('fig1_modified.png') 

Me tomó mucho tiempo para encontrar la manera de conseguir que funcione. Espero que ayude a alguien más.

0

Esta solución usa glob para editar todos los png en una carpeta, eliminar un color y cambiarlo por otro, pero usa RGBA.

import glob 
from PIL import Image 

old_color = 255, 0, 255, 255 
new_color = 0, 0, 0, 0 

for path in glob.glob("*.png"): 
    if "__out" in path: 
     print "skipping on", path 
     continue 

    print "working on", path 

    im = Image.open(path) 
    im = im.convert("RGBA") 
    width, height = im.size 
    colortuples = im.getcolors() 

    pix = im.load() 
    for x in xrange(0, width): 
     for y in xrange(0, height): 
      if pix[x,y] == old_color: 
       im.putpixel((x, y), new_color) 

    im.save(path+"__out.png") 

Es una modificación de https://stackoverflow.com/a/6483549/541208

Cuestiones relacionadas