【问题标题】:concatenate images from a matrix of images从图像矩阵连接图像
【发布时间】:2019-02-16 10:10:30
【问题描述】:

我有 4 张图片,每张图片的宽度和高度均为 8。它们属于形状为 [4,8,8] 的矢量。我将图像向量重塑为形状为[2,2,8,8] 的图像矩阵。

如何连接矩阵内部的图像以生成单个图像,使形状变为[16,16]?我希望将图像连接起来,以保持它们在矩阵中的 x,y 位置 - 本质上只是将单独的图像拼接成一个图像。

我觉得这很容易在 numpy 中完成,甚至可能在 tensorflow 中完成,但我愿意接受任何好的 Python 解决方案。

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    您可以像这样使用np.hstack 两次(稍微小一点的数组以使它们可打印):

    import numpy as np
    
    original = np.array([[np.arange(16).reshape(4,-1)]*2]*2)
    combined = np.hstack(np.hstack(original))
    print(combined)
    

    给出:

    [[ 0  1  2  3  0  1  2  3]
     [ 4  5  6  7  4  5  6  7]
     [ 8  9 10 11  8  9 10 11]
     [12 13 14 15 12 13 14 15]
     [ 0  1  2  3  0  1  2  3]
     [ 4  5  6  7  4  5  6  7]
     [ 8  9 10 11  8  9 10 11]
     [12 13 14 15 12 13 14 15]]
    

    【讨论】:

      【解决方案2】:

      您可以将numpy.concatenate 与不同的轴一起使用。这是一个使用 4 个形状为 [2 2] 的图像的简化版本示例,它会生成一个 [4 4]resulting 图像:

      import numpy as np
      
      a = np.array([[1, 2], [3, 4]])
      b = np.array([[5, 6], [7, 8]])
      c = np.array([[9, 10], [11, 12]])
      d = np.array([[13, 14], [15, 16]])
      
      ab = np.concatenate((a, b), axis=1)
      cd = np.concatenate((c, d), axis=1)
      abcd = np.concatenate((ab, cd), axis=0)
      
      >>> print(abcd)
      array([[ 1,  2,  5,  6],
             [ 3,  4,  7,  8],
             [ 9, 10, 13, 14],
             [11, 12, 15, 16]])
      >>> print(abcd.shape)
      (4, 4)
      

      只需将此代码调整为适合您的代码,而不是使用a, b, c, d 按张量的第一维连接图像,类似于np.concatenate((t[0], t[1]), axis=1)t 您的形状张量[4 8 8]

      否则,正如其他答案所建议的那样,您可以使用两次 numpy.hstack 函数两次,但我认为它的行为不是那么容易阅读,即使代码更少。

      【讨论】:

        【解决方案3】:

        我不建议这样做,因为它几乎不可读,但只是为了进行 numpy 练习,您可以只使用 reshape()transpose() 方法制作图像网格。

        import numpy as np
        
        w_img = 3
        h_img = 2
        n_img = 4
        
        images = (np.array([a + b for a in 'abcd' for b in '123456'])
                    .reshape(n_img, h_img, w_img))
        
        # A batch of 4 images 3x2
        print(images)
        #[[['a1' 'a2' 'a3']
        #  ['a4' 'a5' 'a6']]
        #
        # [['b1' 'b2' 'b3']
        #  ['b4' 'b5' 'b6']]
        #
        # [['c1' 'c2' 'c3']
        #  ['c4' 'c5' 'c6']]
        #
        # [['d1' 'd2' 'd3']
        #  ['d4' 'd5' 'd6']]]
        
        # Making 2x2 grid
        w_grid = 2
        h_grid = 2
        
        grid = images.reshape(h_grid, w_grid, h_img, w_img)  # axes: h_grid, w_grid, h_img, w_img
        grid = grid.transpose([0, 2, 1, 3])                  # axes: h_grid, h_img, w_grid, w_img
        grid = grid.reshape(4, 6)                            # axes: (h_grid * h_img), (w_grid * w_img)
        
        print(grid)
        #[['a1' 'a2' 'a3' 'b1' 'b2' 'b3']
        # ['a4' 'a5' 'a6' 'b4' 'b5' 'b6']
        # ['c1' 'c2' 'c3' 'd1' 'd2' 'd3']
        # ['c4' 'c5' 'c6' 'd4' 'd5' 'd6']]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多