将PIL Image转换为Numpy数组时为何形状维度顺序不一致?
关于NumPy数组与PIL Image的形状维度差异解析
你观察得太到位了!这确实是图像处理领域里一个容易踩坑的细节,不同库的设计逻辑导致了维度顺序的差异,咱们来掰扯清楚:
NumPy数组的维度逻辑:
NumPy处理图像时,采用(H, W)的格式,也就是先高度(垂直方向的像素行数),再宽度(水平方向的像素列数)。这其实完全贴合数组的索引习惯——你要定位一个像素,得先指定它在第几行(垂直位置),再指定第几列(水平位置),比如img_array[150, 300]就是取第150行、第300列的像素值。你的版本numpy 1.13.3当然也遵循这个规则。PIL Image的维度逻辑:
而PIL(Pillow)则是用(W, H)的顺序,这更贴近我们日常描述图像尺寸的习惯——比如我们说一张图是“1920×1080”,默认指的是宽度1920像素、高度1080像素,所以你调用image.size返回的结果就是(宽度, 高度),你的Pillow 4.1.1版本也是如此。
至于你提到的matplotlib能正确处理这一点,其实是因为matplotlib在底层做了自动适配:当你传入NumPy数组给plt.imshow()时,它会按照(H, W)的维度去解析;如果传入的是PIL Image对象,它会自动转换为符合自身渲染要求的维度顺序,所以不管你给哪种类型,都能正常显示,不用咱们手动调整维度,确实省了不少事。
内容的提问来源于stack exchange,提问作者MeadowMuffins
相关产品推荐
相关产品推荐

