Falko 的帖子无疑是规范的做法。但是,如果我可以建议一种更 numpy / Pythonic 的方式来做到这一点,我会让第一个维度是您想要的图像的索引,而第二个和第三个维度是图像的行和列,并且可以选择第四个维度是您想要的颜色通道。因此,假设您的图像尺寸为M x N,并且您有K 图像,您将创建一个长为K x M x N 或长为K x M x N x 3 的矩阵(对于彩色图像)。
因此,考虑到您当前的代码,numpy 中的简单单行代码可能是这样的:
data = np.array([mpimg.imread(name) for name in os.listdir('images/sample_images/')], dtype=np.float64)
因此,如果您想访问第 ith 图像,您只需执行data[i]。这将独立工作于图像是 RGB 还是灰度...所以通过 data[i],您将获得 RGB 图像或灰度图像,具体取决于您决定使用什么来打包数组。
但是,您需要确保所有图像都是一致的……也就是说,它们都是彩色的或全是灰度的。
但是,为了向您展示这是可行的,让我们尝试使用 5 x 5 x 3“RGB”图像,其中每个图像从 0 开始并增加到 K-1,在这种情况下 K 将是 10:
data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)
让我们看一个示例运行(在 IPython 中):
In [26]: data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)
In [27]: data.shape
Out[27]: (10, 5, 5, 3)
In [28]: img = data[0]
In [29]: img
Out[29]:
array([[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]])
In [30]: img.shape
Out[30]: (5, 5, 3)
In [31]: img = data[7]
In [32]: img
Out[32]:
array([[[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.]],
[[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.]],
[[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.]],
[[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.]],
[[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.],
[ 7., 7., 7.]]])
In [33]: img.shape
Out[33]: (5, 5, 3)
在上面的示例运行中,我创建了示例数据数组,它是我们预期的10 x 5 x 5 x 3。我们有 10 个5 x 5 x 3 矩阵。接下来,我提取出第一个“RGB”图像,正如我们预期的那样,它全为 0,大小为5 x 5 x 3。我还提取了第八个切片,我们都得到了我们期望的 7,大小为5 x 5 x 3。
显然,选择您认为最好的答案,但我个人会采用上述路线,因为索引到您的数组以获取正确的图像更简单 - 您让维度广播为您完成工作。