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!