法尔科的职位无疑是做这件事的典范。但是,如果我可以建议一种更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”图像,它的大小是5 x 5 x 3,和我们预期的一样都是0。我还提取了第八个切片,我们都得到了预期的7s,大小为5 x 5 x 3。
显然,选择你认为最好的答案,但我个人会按照上面的路线,因为索引到数组中以获取正确的图像更简单-你让dimension broadcasting为你做这项工作。