在PIL /枕头中使用二进制PNG图像

时间:2018-03-30 18:27:50

标签: python numpy python-imaging-library

将二进制PNG文件从PIL图像对象转换为numpy数组时,无论原始图像是否反转,这些值都是相同的。

例如,这两个图像都会生成相同的numpy数组。

t image t inverted image

import numpy as np
from PIL import Image
t = Image.open('t.png')
t_inverted = Image.open('t_inverted.png')
np.asarray(t)
np.asarray(t_inverted)

np.asarray(t)np.asarray(t_inverted)的输出为:

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 1, 1, 0, 0, 1, 1, 0, 1],
       [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)

我预计0和1也会被反转。他们为什么一样?

1 个答案:

答案 0 :(得分:4)

这两个PNG文件都是索引。它们包含相同的数据数组,只有您看到的值0和1,但这些值不是像素的颜色。它们应该是调色板的索引。在第一个文件中,调色板是

 Index     RGB Value
   0    [  0,   0,   0]
   1    [255, 255, 255]

在第二个文件中,调色板是

 Index     RGB Value
   0    [255, 255, 255]
   1    [  0,   0,   0]

问题是当Image对象转换为numpy数组时,不使用调色板,只返回索引数组。

要解决此问题,请使用convert()对象的Image方法将格式从索引调色板转换为RGB颜色:

t = Image.open('t.png')
t_rgb = t.convert(mode='RGB')
arr = np.array(t_rgb)