当我在numpy数组上使用PIL转换时图像颜色丢失(图像)

时间:2017-09-18 23:35:05

标签: python image numpy python-imaging-library

我正在尝试使用带有numpy数组的PIL然后找到主色。首先,我的图像是一个numpy数组(28,28),不能从文件中读取。我使用以下代码从该图像中获取主色。

from PIL import Image
import numpy as np
myimage=np.random.randint(255,size=(28,28))
image = Image.fromarray(myimage,mode="P") # I use mode=P because if I didn't I will get an error in the next line.
result = image.convert('P', palette=Image.ADAPTIVE, colors=1)
result.putalpha(0)
colors = result.getcolors()

现在colors总是黑色[(784,(14,14,14,0)],但是,如果我将myimage保存到文件并使用image=Image.open(myimage.png),我会得到正确的colors=[(5807904, (222, 158, 23, 0))]。任何想法为什么会发生这种情况以及如何解决它。我之前没有将图像保存到文件的原因是效率测量,因为我有数千个图像在其中循环。

谢谢,

1 个答案:

答案 0 :(得分:0)

使用您的代码生成的图像不包含颜色数据,因此难怪您不会得到它们。应使用以下内容创建image

# note the final '4' indicating the number of channels
# 4 for RGBA, 3 for RGB, 1 for grayscale
myimage = np.random.randint(255, size=(28, 28, 4))
image = Image.fromarray(myimage, mode='RGBA')

现在模拟带有alpha通道的随机彩色图像。

现在剩下的代码对我来说是一个谜,因为我不确切地知道你的期望,但是从我对从磁盘加载的图像和模拟数据的测试中我得到了类似的结果:< / p>

from PIL import Image
import numpy as np
import scipy.misc

# for reproducible results
np.random.seed(0)

def _calc(pil_image):
    result = pil_image.convert(mode='P', palette=Image.ADAPTIVE, colors=1)
    result.putalpha(0)
    colors = result.getcolors()
    print(colors)

myimage = np.random.randint(255, size=(28, 28, 3))
image = Image.fromarray(myimage, mode='RGBA')
_calc(image)

myimage = np.random.randint(255, size=(28, 28, 4))
image = Image.fromarray(myimage, mode='RGBA')
_calc(image)

myimage = scipy.misc.face(False)
image = Image.fromarray(myimage, mode='RGB')
_calc(image)


import urllib.request

urllib.request.urlretrieve(
    'https://www.python.org/static/img/python-logo.png',
    'python-logo.png')
image = Image.open('python-logo.png')
_calc(image)

我得到了,我相信是正确的:

[(784, (6, 0, 0, 0))]
[(784, (7, 0, 0, 0))]
[(786432, (111, 118, 102, 0))]
[(23780, (254, 254, 254, 0))]