Python - 将图像读入图像矩阵

时间:2015-08-18 16:08:08

标签: python arrays image-processing matrix

我试图将多个rgb图像读入一个矩阵,使得矩阵维度为(image_size,image_size,index),例如: data [:,:,1]应检索第一张图像。

data = np.zeros((image_dim, image_dim, numImages), dtype=np.float64)
for fname in os.listdir('images/sample_images/'):
       name='....'
       image=mpimg.imread(name)
       data = np.append(data, image)
return data

image.shape =(512,512,3) data.shape =(512,512,100)

除了np.append给我留下一个空数据数组这一事实外,还有另一种方法可以将图像数组值附加到大数据矩阵中吗?

提前致谢

3 个答案:

答案 0 :(得分:6)

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)

因此,如果要访问i th 图像,只需执行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

显然,选择你认为最好的答案,但我个人会采用上述路线作为索引到你的阵列中以获得正确的图像更简单 - 你让尺寸广播为你做的工作。

答案 1 :(得分:3)

最好使用dstack在第三维中堆叠数组:

data = np.zeros((3, 3, 0))
for i in range(5):
    image = np.random.rand(3, 3, 1)
    data = np.dstack((data, image))
print data.shape

输出:

(3, 3, 5)

注意:这里我假设每个(随机)图像都有一个通道。如果你有RGB图像,你最终会得到3倍的结果通道,即形状(3, 3, 15)

答案 2 :(得分:1)

如何从磁盘读取图像到NumPy 4D矩阵(用于机器学习):

首先,实用方法(我的14x64px图像各有3个通道,图像形状(14,64,3)):

def read_image(image_path):
    # cv2.IMREAD_COLOR 
    # cv2.COLOR_BGR2GRAY 
    image = cv2.imread(image_path, cv2.IMREAD_COLOR)
    #print("image shape", image.shape)
    #plt.imshow(image, cmap='gray')
    #plt.show()
    return np.array(image)

接下来,我将所有图像放入一个4维NumPy矩阵中:

training_features = np.array([read_image(path) for path in image_paths])

得到的矩阵形状(5626,14,64,3),它有5626个14x64px的彩色图像。