如何用NumPy将分块图像数组还原为单张图像数组?
解决图像分块重新合并的顺序问题
你的拆分逻辑是按行优先遍历分块:先遍历图像的行起始位置(x方向),再遍历列起始位置(y方向),所以tiles数组里的块顺序是:第一行的10个列块依次排列,接着是第二行的10个列块,以此类推。直接用reshape会因为numpy的行优先展开规则打乱块的排列,导致合并后的图像顺序错误。
方法一:分步拼接(直观易懂)
先将分块数组重塑为(10,10,549,549)的二维分块结构,再分别完成行内拼接和行间拼接:
import numpy as np # 将tiles转为numpy数组,假设原tiles是列表形式 tiles_array = np.array(tiles) # 重塑为10行×10列的分块结构 tiles_grid = tiles_array.reshape(10, 10, 549, 549) # 拼接每一行的所有分块(沿列方向) row_imgs = [np.concatenate(row_blocks, axis=1) for row_blocks in tiles_grid] # 拼接所有行图像(沿行方向) reconstructed_img = np.concatenate(row_imgs, axis=0) # 验证结果形状 print(reconstructed_img.shape) # 输出 (5490, 5490)
方法二:轴变换+Reshape(简洁高效)
通过调整数组轴的顺序,让分块的排列符合图像的行-列结构,再一次性reshape:
import numpy as np tiles_array = np.array(tiles) # 重塑为二维分块结构 → 调整轴顺序 → 直接reshape为原图尺寸 reconstructed_img = tiles_array.reshape(10,10,549,549).transpose(0,2,1,3).reshape(5490,5490)
轴变换说明:
- 原
reshape(10,10,549,549)的轴顺序是(行索引, 列索引, 块高度, 块宽度) transpose(0,2,1,3)将轴调整为(行索引, 块高度, 列索引, 块宽度),此时数组的结构完全匹配原图的行-列排列,后续reshape就能保证顺序正确。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

