reshape and transpose

图像打印的应用

目标: 将多张图片按照指定行列输出
前置知识: reshape对数据的存储顺序不做改变,transpose会对数据的保存顺序做出改变。
感性理解:
本文中以200张28×28的图片辅助理解,希望输出中每列有20张图片,每行有10张图片。

  1. 对多张灰度图片而言,其在内存中的保存形式为连续逐行(按照图片顺序,每张图片像素点从左到右,从上到下依次保存),假设此时数据形状为长度为[200×28×28]的行向量。
     
  2. 将一张图片看做最小操作单元,并对其进行reshape操作,可将其表示形状为[-1, rows, 28, 28]的张量(简单理解为四维数据),其中第0轴表示样本数量,第1轴表示该图片的行标,第二轴表示该图片的列标, 同时第二轴和第三轴联合起来表示了图片。
    x = np.reshape(x, [-1, x, 28, 28])  
    
    因为本例中,希望转置后的输出为每行有10张图片,那么表示转置前有10行数据,既rows=10,代码中为x=10
     
  3. 在以图片为基本单元构成的矩阵中,通过transpose(转置)将图片矩阵进行改变,并实现在图片数据的存储层次的改变。只将表示位置的第一第二轴进行互换,实现手段为:
    x = np.transpose(x, [0, 2, 1, 3])   # [-1, 28, x, 28]
    
     
  4. 此时的图片可以看成形状为 [m/x, 28*x, 28] 的张量(图片矩阵), 其中m为总的图片数量,在使用Opencv时,因imshow()或imwrite()对输入数据格式的要求,需要做进一步reshape()
    x = np.reshape(x, [20, 28*10, 28])   # 本行可省略,只是为了便于理解
    x = np.reshape(x, [-1, 28*10])
    

Test:

  1. 输出图片 20 × 10
    imgs = np.reshape(imgs, [-1, 10, 28, 28])
    imgs = np.transpose(imgs, [0, 2, 1, 3])
    # imgs = np.reshape(imgs,[20, 28*10, 28])
    imgs = np.reshape(imgs, [-1, 28*10])
    

    

  1. 输出图片 5 × 40
    imgs = np.reshape(imgs, [-1, 40, 28, 28])
    imgs = np.transpose(imgs, [0, 2, 1, 3])
    # imgs = np.reshape(imgs,[20, 28*10, 28])
    imgs = np.reshape(imgs, [-1, 28*40])
    

    

储存及其更深层次的理解

未完待续...

posted @ 2020-06-28 16:05  LexiCalibur  阅读(222)  评论(0)    收藏  举报