Изменить пиксели прозрачного фона

1

У меня есть несколько разных изображений, в которых я хочу изменить каждый прозрачный пиксель изображения на другой цвет.

Я нашел способ извлечь все значения 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]

Как изменить этот пиксель?

Теги:
image

2 ответа

1
Лучший ответ

Обновленный ответ

Из вашего комментария видно, что вам нужно больше гибкости, чем я понял из вашего вопроса. Попробуй это:

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)

Образец изображения:

Это ряд из трех прозрачных красных пикселей, окруженных непрозрачной серой границей шириной в один пиксель. Это довольно мало...

Изображение 174551

  • 0
    Это тесно связано с тем, что я ищу, но не совсем. В вашем примере, как бы я отрегулировал значения RGBA каждого пикселя отдельно? Таким образом, вместо того, чтобы изменять все прозрачные пиксели на (1,2,3,4), как я могу сделать так, чтобы у первого было, например, (1,2,3,4), у второго, например, (5,6,7) 8) и т. Д. Спасибо за ваш ответ!
  • 0
    Я обновил код, чтобы он был более гибким, чем я понял из вашего исходного вопроса.
Показать ещё 2 комментария
1

Хотя векторная операция может быть доступна для того, что я пытался достичь, решение, которое я нашел для работы, выглядит следующим образом.

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 этого пикселя. Может быть, довольно медленно, но работает по назначению!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню