python - 正在使用 PIL 保存损坏的图像

标签 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”相同。

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

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

而“myimage.png”实际上是:

enter image description here

那么为什么当我直接转置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/

相关文章:

python - Python 中的约束线性回归

python - 从具有特定模式的 txt 文件创建 Pandas DataFrame

html - 在图像上叠加链接,允许调整图像大小

image - 保存 jsignature 图像不再透明

swift - 翠鸟无法为 UIButton 设置图像

python - 如何使 numba(nopython=true) 处理元素数量未知的一维 numpy.ndarray 输入

python - 追加具有不同第一维度的 numpy 数组

python - 元类的 "__call__"和实例的 "__init__"的关系?

python - 检测列表中的相同值

python - 检查项目符号点是否在列表中