使用PIL保存损坏的图像

时间:2017-02-07 16:06:23

标签: python image numpy python-imaging-library

我遇到了一个问题,即操纵图像像素会导致图像被损坏...

因此,我使用PIL打开图像,然后将其转换为NumPy数组:

image = Image.open("myimage.png")
np_image = np.asarray(image)

然后,我转置图片,将其从[x][y][channel]转换为[channel][x][y]

pixels = np.transpose(np_image, (2, 0, 1))

如果我将此图像转换回[x][y][channel],请从此阵列创建PIL图像,然后保存图像:

image1 = np.transpose(pixels, (1, 2, 0))
image2 = Image.fromarray(image1, 'RGB')
image2.save('image2.png')

然后保存的图像与" myimage.png"。

相同

但是,如果不是上面的代码,我首先将pixels分配给图像数组中的元素:

images = np.zeros([10, 3, 50, 50]) # The images are 50x50 with 3 channels
images[0] = pixels
image3 = np.transpose(images[0], (1, 2, 0))
image4 = Image.fromarray(image3, 'RGB')
image4.save('image4.png')

然后" image4.png"已经腐败了。它看起来如下:

enter image description here

而#34; myimage.png"实际上是:

enter image description here

那么为什么我直接转置pixels时保存图像,保存的图像是预期的,但是当我将pixels设置为数组{{1}中的第一个元素时},然后转置此图像,保存的图像已损坏?

谢谢!

1 个答案:

答案 0 :(得分:2)

numpy.zeros创建的默认数据类型是浮点数,所以

images = np.zeros([10, 3, 50, 50])

创建一个浮点数组。然后在作业中

images[0] = pixels

pixels中的值被转换为浮点数,以便将它们存储在images中,因此image3是一个浮点数组。这会影响保存相应图像时存储在PNG文件中的值。我不知道PIL / Pillow在给定浮点阵列时遵循的规则,但显然这不是理想的行为。

要解决此问题,请使用与images相同的数据类型创建np_image(最有可能是numpy.uint8):

images = np.zeros([10, 3, 50, 50], dtype=np_image.dtype)