【问题标题】:Python - read images into image matrixPython - 将图像读入图像矩阵
【发布时间】:2015-08-18 16:08:07
【问题描述】:

我正在尝试将多个 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 给我留下一个空数据数组这一事实之外,还有其他方法可以将图像数组值附加到大数据矩阵吗?

提前致谢

【问题讨论】:

    标签: python arrays image-processing matrix


    【解决方案1】:

    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。

    显然,选择您认为最好的答案,但我个人会采用上述路线,因为索引到您的数组以获取正确的图像更简单 - 您让维度广播为您完成工作。

    【讨论】:

    • 是的,这似乎是一个非常好的方法,谢谢。同样,我在从数据中检索单个图像时遇到问题:img = data[0],颜色似乎有点不对劲,它不应该给我原始图像吗?
    • 我没有 mpimg 方面的经验,所以我不能肯定地告诉你。它也可能是您选择在图像中加载的数据类型。您可以发布图像的快照吗?发布原始版本和关闭版本。
    • @jenpaff - 太棒了!没问题。
    • 我收到以下错误代码 ValueError: setting an array element with a sequence.
    • @Spandy 除非我看到你做了什么,否则我无法发表评论。您是否有问题发布或在某个地方我可以看到您在做什么?
    【解决方案2】:

    您最好使用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)。

    【讨论】:

    • 这似乎很有效。那么我将如何从数据中检索单个图像?我试过data[:,:,:3],但它不会以正确的颜色保存原始图像。
    • @jenpaff - 不,您使用data[:,:,i],其中i 是您想要的图像索引。那是为了灰度。如果你有RGB的情况,你会做data[:,:,3*i:3*(i+1)]
    【解决方案3】:

    如何将图像从磁盘读取到 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 彩色图像。

    【讨论】:

    • 这和我上面的回答有什么不同吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2013-03-29
    • 2016-08-06
    相关资源
    最近更新 更多