如何直接将图片加载为numpy ndarray?替代已弃用的scipy.misc.imread
解决方法:无需额外转换直接获取numpy数组的替代方案
你提到的问题确实是scipy.misc.imread弃用后常见的小困扰,除了OpenCV,这里有几个优雅的方案可以直接加载图片为numpy.ndarray:
方案1:使用imageio的兼容接口
imageio的新版默认imread返回封装后的Image对象,但它保留了兼容旧行为的v2接口,直接调用就能得到numpy数组:
import imageio img = imageio.v2.imread('./myimage.jpg') type(img) >>> numpy.ndarray
这个接口完全复刻了旧scipy方法的行为,甚至支持相同的参数(比如flatten),迁移成本很低。
方案2:使用Matplotlib的图片读取函数
Matplotlib的imread方法从一开始就直接返回numpy数组,用法和你之前的scipy代码几乎一致:
# 两种导入方式都可以 from matplotlib import image as mpimg img = mpimg.imread('./myimage.jpg') # 或者通过pyplot导入 import matplotlib.pyplot as plt img = plt.imread('./myimage.jpg') type(img) >>> numpy.ndarray
需要注意的是,Matplotlib读取jpg时默认会将像素值归一化到0-1之间(浮点数类型),而scipy和imageio默认返回0-255的整数类型,如果需要和旧行为完全一致,可以加上参数:
img = mpimg.imread('./myimage.jpg', format='jpg')
这样就能得到uint8类型的数组了。
方案3:Pillow配合numpy的简洁写法
虽然你提到显式转换不够优雅,但Pillow其实可以和numpy结合得很简洁,一行代码就能完成:
from PIL import Image import numpy as np img = np.asarray(Image.open('./myimage.jpg')) type(img) >>> numpy.ndarray
np.asarray比np.array更轻量(不会复制数据,只是创建数组视图),如果你的图片较大,这个写法在性能上反而更友好。
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

