我正在使用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)
为什么维度会发生变化?
发布于 2013-09-26 06:53:09
im可能以列为主,而numpy中的数组是以行为主
执行in_data = in_data.T
以转置python数组
也许应该用matplotlib
的imshow
检查in_data,以确保图片看起来是正确的。
但是你知道matplotlib有它自己的加载函数,可以直接给你numpy数组吗?请参阅:http://matplotlib.org/users/image_tutorial.html
发布于 2016-03-17 03:06:58
如果您的图像是灰度图像,请执行以下操作:
in_data = in_data.T
但是,如果您正在处理rbg图像,则需要确保转置操作仅沿两个轴进行:
in_data = np.transpose(in_data, (1,0,2))
发布于 2017-12-16 18:19:12
实际上,这是因为与numpy数组相比,大多数图像库提供的图像都是转置的。这是(我认为)因为你逐行编写图像文件,所以第一个索引(假设x
)指的是行号(所以x
是垂直轴),第二个索引(y
)指行中的后续像素(所以y
是水平轴),这与我们日常的坐标意义相反。
如果你想正确地处理它,你需要记住写:
image = library.LoadImage(path)
array = (library.FromImageToNumpyArray(image)).T
因此:
image = library.FromNumpyArrayToImage(array.T)
library.WriteImage(image, path)
这也适用于3D图像。但我不能保证所有的图像库都是这样的--只有我用过的图像库。
https://stackoverflow.com/questions/19016144
复制相似问题