更改像素透明背景

时间:2018-08-25 12:30:00

标签: python image

我有几张不同的图像,我想将图像的每个透明像素更改为不同的颜色。

我找到了一种提取图像透明像素的所有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 :(得分: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)

示例图片

它是一排三个透明的红色像素,周围是一个不透明的灰色边框,宽度为一个像素。很小...

enter image description here

答案 1 :(得分: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值随机化。可能会比较慢,但会按预期工作!