У меня есть несколько разных изображений, в которых я хочу изменить каждый прозрачный пиксель изображения на другой цвет.
Я нашел способ извлечь все значения RGB прозрачных пикселей изображения как таковые:
data[data[:,:,3]==0,:3][0]
Теперь, когда я пытаюсь назначить другой массив этому пикселю, он не работает:
data[data[:,:,3]==0,:3][0] = np.array([255,0,255])
print(data[data[:,:,3]==0,:3][0])
Out[1]: [0 0 0]
Как изменить этот пиксель?
Обновленный ответ
Из вашего комментария видно, что вам нужно больше гибкости, чем я понял из вашего вопроса. Попробуй это:
In [85]: im = np.array(Image.open('image.png').convert('RGBA'))
In [86]: for x in np.argwhere(im[:,:,3]==0):
...: im[x[0],x[1],:]=np.random.randint(0,255), np.random.randint(0,255), np.random.randint(0,255), np.random.randint(0,255)
Оригинальный ответ
Я думаю, вы имеете в виду это:
In [32]: im = np.array(Image.open('image.png').convert('RGBA'))
In [33]: im
Out[33]:
array([[[126, 126, 126, 255], <--- grey pixel
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255]],
[[126, 126, 126, 255],
[255, 0, 0, 0], <--- transparent pixel
[255, 0, 0, 0], <--- transparent pixel
[255, 0, 0, 0], <--- transparent pixel
[126, 126, 126, 255]],
[[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255]]], dtype=uint8)
In [34]: im[im[:,:,3]==0]=(1,2,3,4)
In [35]: im
Out[35]:
array([[[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255]],
[[126, 126, 126, 255],
[ 1, 2, 3, 4],
[ 1, 2, 3, 4],
[ 1, 2, 3, 4],
[126, 126, 126, 255]],
[[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255],
[126, 126, 126, 255]]], dtype=uint8)
Образец изображения:
Это ряд из трех прозрачных красных пикселей, окруженных непрозрачной серой границей шириной в один пиксель. Это довольно мало...
Хотя векторная операция может быть доступна для того, что я пытался достичь, решение, которое я нашел для работы, выглядит следующим образом.
for h in range(0,data.shape[0]):
for w in range(0,data.shape[1]):
if data[h, w][3] == 0:
data[h, w] = np.random.randint(0,255), np.random.randint(0,255), np.random.randint(0,255), 255
Это проходит через каждый пиксель изображения, затем проверяет, прозрачен ли этот пиксель или нет, и если он рандомизирует значения RGB этого пикселя. Может быть, довольно медленно, но работает по назначению!