Sajid Khan
Sajid Khan

Reputation: 47

How do you change the color of specified pixels in an image?

I want to be able to detect a certain area of pixels based on their RGB values and change them to some other color (not black/white).

I have tried changing these values in the code, but my resulting images always show black pixels replacing the specified locations: pixelMap[i,j]= (255,255,255)

from PIL import Image
im  = Image.open('Bird.jpg')
pixelMap = im.load()

img = Image.new(im.mode, im.size)
pixelsNew  = img.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
        toup = pixelMap[i,j]
        if(int(toup[0]>175) and int(toup[1]<100 and int(toup[2])<100) ):
             pixelMap[i,j]= (255,255,255)
        else:
             pixelsNew[i,j] = pixelMap[i,j]
img.show()

Upvotes: 2

Views: 2255

Answers (2)

Mark Setchell
Mark Setchell

Reputation: 208107

You will find that iterating over images with Python loops is really slow and should get in the habit of using Numpy or optimised OpenCV or skimage code.

So, starting with this image:

enter image description here

from PIL import Image
import numpy as np

# Open image
im = Image.open('bird.jpg')

# Make into Numpy array
imnp = np.array(im)

# Make all reddish pixels white
imnp[(imnp[:,:,0]>170) & (imnp[:,:,1]<100) & (imnp[:,:,2]<100)] = [255,255,255] 

 # Convert back to PIL and save
Image.fromarray(imnp).save('result.jpg')

enter image description here

Upvotes: 3

Rotem
Rotem

Reputation: 32144

It looks like a tiny bug:

Instead of: pixelMap[i,j]= (255,255,255)
Use: pixelsNew[i,j] = (255,255,255)

Upvotes: 0

Related Questions