我遇到一个问题,即操作图像像素会导致保存损坏的图像...
因此,我使用 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”相同。
但是,如果我首先将 像素
分配给图像数组中的元素,而不是上面的代码:
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”已损坏。其显示如下:
而“myimage.png”实际上是:
那么为什么当我直接转置pixels
时保存图像,保存的图像是符合预期的,但是当我将pixels
设置为第一个元素时数组images
,然后转置此图像,保存的图像已损坏?
谢谢!
最佳答案
numpy.zeros 创建的默认数据类型是浮点型,因此
images = np.zeros([10, 3, 50, 50])
创建一个 float 组。然后在作业中
images[0] = pixels
pixels
中的值被转换为浮点,以便将它们存储在 images
中,因此 image3
是一个 float 组。这会影响保存相应图像时存储在 PNG 文件中的值。我不知道 PIL/Pillow 在给定 float 组时遵循的规则,但显然这不是这里所需的行为。
要解决此问题,请使用与 np_image
相同的数据类型创建 images
(很可能是 numpy.uint8
):
images = np.zeros([10, 3, 50, 50], dtype=np_image.dtype)
关于python - 正在使用 PIL 保存损坏的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094568/