Изменить пиксели прозрачного фона - PullRequest
0 голосов
/ 25 августа 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

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

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

0 голосов
/ 25 августа 2018

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

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

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)

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

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...