【问题标题】:Image.fromarray changes sizeImage.fromarray 改变大小
【发布时间】:2015-11-15 21:24:57
【问题描述】:

我有想要存储到图像中的数据。我创建了一个宽度为 100 高度为 28 的图像,我的矩阵具有相同的形状。当我使用Image.fromarray(matrix) 时,形状会发生变化:

from PIL import Image

img = Image.new('L', (100, 28))
tmp = Image.fromarray(matrix)
print(matrix.shape) # (100, 28)
print(tmp.size) # (28, 100)
img.paste(tmp, (0, 0, 100, 28) # ValueError: images do not match

当我使用img.paste(tmp, (0, 0)) 时,对象被粘贴到图像中,但缺少以 x 值 28 开头的部分。

为什么尺寸会改变?

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    PIL 和 numpy 有不同的索引系统。 matrix[a, b] 给您 x 位置 b 和 y 位置 a 的点,但 img.getpixel((a, b)) 给您 x 位置 a 和 y 位置 b 的点。因此,当您在 numpy 和 PIL 矩阵之间进行转换时,它们会切换它们的维度。要解决此问题,您可以对矩阵进行转置 (matrix.transpose())。

    以下是正在发生的事情:

    import numpy as np
    from PIL import Image
    
    img = Image.new('L', (100, 28))
    img.putpixel((5, 3), 17)
    
    matrix = np.array(img)
    
    print matrix[5, 3] #This returns 0 
    
    print matrix[3, 5] #This returns 17
    
    matrix = matrix.transpose()
    print matrix[5, 3] #This returns 17
    
    print matrix[3, 5] #This returns 0
    

    【讨论】:

    • 当你的数组像 RGB 图像一样有 3 维时,那么这个 transpose() 方法会像这样 (3, 28, 100) 改变它,这显然是错误的。
    【解决方案2】:

    NumPy 和 PIL 有不同的索引系统。因此 (100, 28) numpy 数组将被解释为宽度为 28 和高度为 100 的图像。

    如果您想要一个 28x100 的图像,那么您应该为您的图像实例交换尺寸。

    img = Image.new('L', (28, 100))
    

    如果你想要一个 100x28 的图像,那么你应该转置 numpy 数组。

    tmp = Image.fromarray(matrix.transpose())
    

    更一般地说,如果您使用 RGB,则可以使用 transpose() 仅交换前两个轴。

    >>> arr = np.zeros((100, 28, 3))
    >>> arr.shape
    (100, 28, 3)
    >>> arr.transpose(1, 0, 2).shape
    (28, 100, 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多