Pillow图像对象和numpy数组之间的转换会改变维度

24
我正在使用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)

为什么要改变维度?

3个回答

17

我的数组可能是列主序,而numpy中的数组是行主序。

使用in_data = in_data.T来转置Python数组。

建议使用matplotlibimshow函数检查in_data以确保图片看起来正确。

但您知道吗,matplotlib带有自己的加载函数,可以直接给您提供numpy数组?请参阅:http://matplotlib.org/users/image_tutorial.html


np.asarray(im, order='F')也是可能的 - bartolo-otrit

6

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

in_data = in_data.T

但是,如果你正在处理 RGB 图像,你需要确保转置操作只沿着两个轴进行:

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

0

实际上,这是因为大多数图像库提供的图像与numpy数组相比是转置的。我认为这是因为你按行编写图像文件,所以第一个索引(假设为x)表示行号(因此x是垂直轴),第二个索引(y)表示行中后续像素(因此y是水平轴),这与我们日常的坐标感觉相反。

如果您想正确处理它,需要记住编写:

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

因此:

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

这也适用于3D图像。但我不能保证所有图像库都是如此 - 只是我使用过的这些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接