Cambio de valor de color de píxel en PIL

Necesito cambiar el color de píxel de una imagen en python. Excepto el valor de píxel (255, 0, 0) rojo, necesito cambiar cada valor de color de píxel a negro (0, 0, 0). Intenté el siguiente código pero no ayudó.

from PIL import Image im = Image.open('A:\ex1.jpg') for pixel in im.getdata(): if pixel == (255,0,0): print "Red coloured pixel" else: pixel = [0, 0, 0] 

Vea este wikibook: https://en.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels

Modificando ese código para que se ajuste a su problema:

 pixels = img.load() # create the pixel map for i in range(img.size[0]): # for every pixel: for j in range(img.size[1]): if pixels[i,j] == (255, 0, 0): pixels[i,j] = (0, 0 ,0) 

Esta es la forma en que usaría PIL para hacer lo que quieres:

 from PIL import Image imagePath = 'A:\ex1.jpg' newImagePath = 'A:\ex2.jpg' im = Image.open(imagePath) def redOrBlack (im): newimdata = [] redcolor = (255,0,0) blackcolor = (0,0,0) for color in im.getdata(): if color == redcolor: newimdata.append( redcolor ) else: newimdata.append( blackcolor ) newim = Image.new(im.mode,im.size) newim.putdata(newimdata) return newim redOrBlack(im).save(newImagePath) 

Llevando la pregunta a un nivel extremo, aquí se muestra cómo cambiar aleatoriamente los canales en PIL (descuidando cualquier 0, lo que considero como fondo)

 rr, gg, bb = in_img.split() rr = rr.point(lambda p: 0 if p==0 else np.random.randint(256) ) gg = gg.point(lambda p: 0 if p==0 else np.random.randint(256) ) bb = bb.point(lambda p: 0 if p==0 else np.random.randint(256) ) out_img = Image.merge("RGB", (rr, gg, bb)) out_img.getextrema() out_img.show() 

¡Disfrutar!