我有几张不同的图像,我想将图像的每个透明像素更改为不同的颜色。
我找到了一种提取图像透明像素的所有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]
如何更改此像素?
答案 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)
示例图片:
它是一排三个透明的红色像素,周围是一个不透明的灰色边框,宽度为一个像素。很小...
答案 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值随机化。可能会比较慢,但会按预期工作!