为什么np.concatenate()可以用于类'PIL.Image.Image'?

时间:2019-11-21 02:56:51

标签: python numpy python-imaging-library

我正在阅读某人的transform.py,其中有一段代码确实使我感到困惑。在这里:

np.concatenate(img_group, axis=2)

但是,这里的img_group<class 'PIL.Image.Image'>的序列,我浏览了np.concatenate()的文档,它告诉我:enter link description here

  

numpy.concatenate((a1,a2,...),axis = 0,out = None)   沿现有轴连接一系列数组。   参数:   a1,a2,…: array_like序列   数组必须具有相同的形状,除了与轴对应的尺寸(默认为第一个)。

我尝试了一些示例,例如:

x = Image.open('flows/v_ApplyEyeMakeup_g08_c01/frame/img_00001.jpg').convert('RGB')
y = Image.open('flows/v_ApplyEyeMakeup_g08_c01/frame/img_00002.jpg').convert('RGB')
z = np.concatenate([x,y], axis=2)

然后它起作用了! znumpy.ndarray类型,其大小为(240,320,6)。但是,<class 'PIL.Image.Image'>似乎不是array参数所需的np.concatenate()类型,所以我想知道它是如何工作的?

2 个答案:

答案 0 :(得分:1)

Numpy对array-like个对象进行操作。这是关于什么构成数组相似性的问题的link。 python对象类似于数组的一种方法是实现#include<iostream> #include<vector> using namespace std; int main(){ vector<int> A = {1,2,3,4,5}; cout << A[1]; return 0; } 方法。这正是PIL.Image所做的。

答案 1 :(得分:0)

如果您查看source for PIL.Image,将看到它具有名为__array_interface__的属性,并且其下方的注释是:

#numpy数组接口支持

我的猜测是numpy使用此属性将图像转换为数组,因此能够将其作为一个数组进行处理。

也是Image对象“ array_like”的属性。参见__array_interface__