图像打印的应用
目标: 将多张图片按照指定行列输出
前置知识: reshape对数据的存储顺序不做改变,transpose会对数据的保存顺序做出改变。
感性理解:
本文中以200张28×28的图片辅助理解,希望输出中每列有20张图片,每行有10张图片。
- 对多张灰度图片而言,其在内存中的保存形式为连续逐行(按照图片顺序,每张图片像素点从左到右,从上到下依次保存),假设此时数据形状为长度为[200×28×28]的行向量。
- 将一张图片看做最小操作单元,并对其进行reshape操作,可将其表示形状为[-1, rows, 28, 28]的张量(简单理解为四维数据),其中第0轴表示样本数量,第1轴表示该图片的行标,第二轴表示该图片的列标, 同时第二轴和第三轴联合起来表示了图片。
因为本例中,希望转置后的输出为每行有10张图片,那么表示转置前有10行数据,既rows=10,代码中为x=10x = np.reshape(x, [-1, x, 28, 28])
- 在以图片为基本单元构成的矩阵中,通过transpose(转置)将图片矩阵进行改变,并实现在图片数据的存储层次的改变。只将表示位置的第一第二轴进行互换,实现手段为:
x = np.transpose(x, [0, 2, 1, 3]) # [-1, 28, x, 28]
- 此时的图片可以看成形状为 [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:
-
输出图片 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])
-
输出图片 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])