我遇到了一个问题,即操纵图像像素会导致图像被损坏...
因此,我使用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"已经腐败了。它看起来如下:
而#34; myimage.png"实际上是:
那么为什么我直接转置pixels
时保存图像,保存的图像是预期的,但是当我将pixels
设置为数组{{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)