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])
    
  2. 输出图片 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])
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值