I have a 2D array of RGBA values (Ex: [30, 60, 90, 255]) and I want to replace all white [255 255 255 255] with [0 0 0 0]. What is the simplest way to do this?
Using for loops I have tried assigning a new array to an index but the index does not change:
data = np.array(img)
for y in range(img.size[0]):
for x in range(img.size[1]):
if (data[x][y] == [255, 255, 255, 255]).all():
data[x][y] == [0, 0, 0, 0] # Doesn't change value at index?
Advertisement
Answer
You can use np.all to check all four values for each row and column:
>>> img = np.array([[[220, 119, 177, 145],
[255, 255, 255, 255]],
[[ 3, 67, 69, 74],
[ 1, 104, 120, 98]]])
Get the index mask with a boolean condition against [255, 255, 255, 255]:
>>> mask = np.all(img == [255, 255, 255, 255], axis=-1)
array([[False, True],
[False, False]])
At this point, you can either assign a four element list or one element using mask:
>>> img[mask] = 0
array([[[220, 119, 177, 145],
[ 0, 0, 0, 0]],
[[ 3, 67, 69, 74],
[ 1, 104, 120, 98]]])