首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pillow Image对象与numpy数组之间的转换改变维数

Pillow Image对象与numpy数组之间的转换改变维数
EN

Stack Overflow用户
提问于 2013-09-26 06:20:24
回答 3查看 21.4K关注 0票数 24

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

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

代码语言:javascript
复制
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

结果是

代码语言:javascript
复制
(1024, 768)
(768, 1024)

为什么维度会发生变化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-26 06:53:09

im可能以列为主,而numpy中的数组是以行为主

执行in_data = in_data.T以转置python数组

也许应该用matplotlibimshow检查in_data,以确保图片看起来是正确的。

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

票数 17
EN

Stack Overflow用户

发布于 2016-03-17 03:06:58

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

代码语言:javascript
复制
in_data = in_data.T

但是,如果您正在处理rbg图像,则需要确保转置操作仅沿两个轴进行:

代码语言:javascript
复制
in_data = np.transpose(in_data, (1,0,2))
票数 6
EN

Stack Overflow用户

发布于 2017-12-16 18:19:12

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

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

代码语言:javascript
复制
image = library.LoadImage(path)
array = (library.FromImageToNumpyArray(image)).T

因此:

代码语言:javascript
复制
image = library.FromNumpyArrayToImage(array.T)
library.WriteImage(image, path)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19016144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档