Replace image pixel color on condition in Python

Viewed 1725

I have an RGBA image where I have to find if any pixel has red value < 150 and to replace such pixels to black. I am using following code for this:

import numpy as np
imgarr = np.array(img)
for x in range(imgarr.shape[0]):
    for y in range(imgarr.shape[1]):
        if imgarr[x, y][0] < 150:    # red value < 150
            imgarr[x, y] = (0,0,0,255)

However, this is a slow loop and I am sure it can be optimized using some function such as numpy.where, but I am not able to fit it in this code. How can this be solved?

2 Answers

For one channel image, we can do as follow

out_val = 0
gray = cv2.imread("colour.png",0)

gray[gray<value] = out_val

Use np.where with the mask of comparison against the threshold -

img = np.asarray(img)
imgarr = np.where(img[...,[0]]<150,(0,0,0,255),img)

We are using img[...,[0]] to keep the number of dims as needed for broadcasted assignment with np.where. So, another way would be to use img[...,0,None]<150 to get the mask that keeps dims.

Related