Python: PIL replace a single RGBA color

If you have numpy, it provides a much, much faster way to operate on PIL images.

E.g.:

import Image
import numpy as np

im = Image.open('test.png')
im = im.convert('RGBA')

data = np.array(im)   # "data" is a height x width x 4 numpy array
red, green, blue, alpha = data.T # Temporarily unpack the bands for readability

# Replace white with red... (leaves alpha values alone...)
white_areas = (red == 255) & (blue == 255) & (green == 255)
data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed

im2 = Image.fromarray(data)
im2.show()

Edit: It’s a slow Monday, so I figured I’d add a couple of examples:

Just to show that it’s leaving the alpha values alone, here’s the results for a version of your example image with a radial gradient applied to the alpha channel:

Original: alt text

Result: alt text

Leave a Comment