【问题标题】:Conversion between Pillow Image object and numpy array changes dimensionPillow Image 对象和 numpy 数组之间的转换改变了维度
【发布时间】:2017-12-16 18:19:11
【问题描述】:

我正在使用 Pillow 和 numpy,但是在 Pillow Image 对象和 numpy 数组之间的转换有问题。

当我执行以下代码时,结果很奇怪。

im = Image.open(os.path.join(self.img_path, ifname))
print im.size
in_data = np.asarray(im, dtype=np.uint8)
print in_data.shape

结果是

(1024, 768)
(768, 1024)

为什么尺寸会改变?

【问题讨论】:

    标签: python arrays numpy python-imaging-library pillow


    【解决方案1】:

    我可能是列优先的,而 numpy 中的数组是行优先的

    in_data = in_data.T转置python数组

    可能应该使用matplotlibimshow 检查in_data 以确保图片看起来正确。

    但是你知道 matplotlib 自带加载函数,可以直接为你提供 numpy 数组吗?见:http://matplotlib.org/users/image_tutorial.html

    【讨论】:

    • np.asarray(im, order='F') 也是possible
    【解决方案2】:

    如果您的图像是灰度的,请执行以下操作:

    in_data = in_data.T
    

    但如果您使用的是 rbg 图像,您需要确保转置操作仅沿两个轴:

    in_data = np.transpose(in_data, (1,0,2))
    

    【讨论】:

      【解决方案3】:

      实际上这是因为大多数图像库为您提供了与 numpy 数组相比经过转置的图像。这是(我认为)因为您逐行编写图像文件,所以第一个索引(比如说x)指的是行号(所以x是垂直轴)和第二个索引(y)指的是行内的后续像素(所以y是横轴),这违背了我们日常的坐标感。

      如果你想正确处理它你需要记住写:

      image = library.LoadImage(path)
      array = (library.FromImageToNumpyArray(image)).T
      

      因此:

      image = library.FromNumpyArrayToImage(array.T)
      library.WriteImage(image, path)
      

      这也适用于 3D 图像。但我不保证所有图像库都是这种情况 - 只是我使用的这些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 2014-07-19
        • 2021-01-03
        相关资源
        最近更新 更多