将二进制PNG文件从PIL图像对象转换为numpy数组时,无论原始图像是否反转,这些值都是相同的。
例如,这两个图像都会生成相同的numpy数组。
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也会被反转。他们为什么一样?
答案 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)