Python中Image与Ndarray互转及np.array与np.asarray区别解析

程一诺
程一诺
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Python中PIL Image与NumPy Ndarray的相互转换方法,对比keras相关API实现。重点分析np.array与np.asarray在内存拷贝行为上的差异,通过源码揭示img_to_array与array_to_img的实现原理,帮助开发者在模型处理中优化内存使用。

Python中Image与Ndarray互转及np.array与np.asarray区别解析

在Python图像处理中,将PIL的Image对象转换为NumPy的Ndarray是常见操作。


import numpy as np
from PIL import Image

img = Image.open(filepath)
img_convert_ndarray = np.array(img)
ndarray_convert_img= Image.fromarray(img_convert_ndarray )


# np.array(object) 这个函数很强大啊,看源码里面给的注释
# object : array_like
#      An array, any object exposing the array interface, an object whose
#      __array__ method returns an array, or any (nested) sequence.

此外,Keras库也提供了专用的API接口来完成此类转换任务。


from keras.preprocessing.image import img_to_array, array_to_img

但在深入查看相关源码后,可以发现这些高层封装函数的底层实现逻辑其实高度一致。

具体而言,img_to_array()函数内部调用的是np.asarray(),而反向转换的array_to_img()则依赖于Image.fromarray()方法。

需要区分的是,np.array()用于创建一个新的Ndarray对象,而np.asarray(object)则是将现有对象转换为Ndarray格式。两者在内存处理机制上存在关键差异。


np.asarray(a):
  return np.array(a,copy=False)

# 而np.array()里copy默认为True,那这有什么区别呢?
import numpy as np

  a = np.array([1, 2])
  b = np.asarray(a)
  c = np.asarray(a)
  print(type(b), type(c), b is c) # True
  e = np.array(a)
  f = np.array(a)
  print(type(e), type(f), e is f) # False

  a = [1, 2]
  b = np.asarray(a)
  c = np.asarray(a)
  print(type(b), type(c), b is c) # False
  e = np.array(a)
  f = np.array(a)
  print(type(e), type(f), e is f) # False

以上内容涵盖了Python实现Image和Ndarray互相转换的核心要点,供读者参考与实践。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表