我正在使用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)
为什么尺寸会发生变化?
答案 0 :(得分:16)
我可能是列专业,而numpy中的数组是行主要
执行in_data = in_data.T
转置python数组
可能应该使用matplotlib
的{{1}}检查in_data,以确保图片看起来正确。
但是你知道matplotlib有自己的加载函数,直接为你提供numpy数组吗?请参阅:http://matplotlib.org/users/image_tutorial.html
答案 1 :(得分:5)
如果您的图片是灰度,请执行:
in_data = in_data.T
但如果您正在使用rbg图像,则需要确保转置操作仅沿两个轴:
in_data = np.transpose(in_data, (1,0,2))
答案 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图像。但我并不承诺这是所有图像库的情况 - 只是我使用过的。