如何用Python将12张图片拼接为4×3网格?寻求更优方案
将12张图片拼接为4×3网格的更优实现方法
你的当前代码只是把所有图片横向拼接成了一行,并没有实现4×3的网格布局。下面提供两种更高效、更简洁的实现方式:
方法一:用Numpy批量拼接(适合numpy数组格式的图片)
如果你的图片都是numpy数组(形状为(高度, 宽度, 通道数)),可以利用numpy的reshape和批量concatenate操作替代循环,效率更高:
import numpy as np # 确保所有图片尺寸一致,exr_files_list是长度为12的numpy数组列表 # 将图片列表重塑为4行3列的结构,形状变为(4, 3, h, w, c) grid_array = np.array(exr_files_list).reshape(4, 3, *exr_files_list[0].shape) # 先横向拼接每行的3张图(axis=3对应宽度方向),得到4张行图,形状为(4, h, 3w, c) row_stitched = np.concatenate(grid_array, axis=3) # 再纵向拼接4张行图(axis=1对应高度方向),得到最终4×3网格,形状为(4h, 3w, c) stitched_exrs = np.concatenate(row_stitched, axis=1)
这种方式避免了循环里的重复拼接操作,numpy的批量处理在性能上比循环更有优势,尤其是图片数量较多时。
方法二:用PIL库拼接(代码更简洁直观)
如果可以使用PIL库,代码会更易读,处理图片格式也更灵活:
from PIL import Image # 假设exr_files_list是PIL Image对象列表,如果是numpy数组可先转换:Image.fromarray(img) # 按4行3列分组 row_groups = [exr_files_list[i*3 : (i+1)*3] for i in range(4)] # 横向拼接每行的3张图片 row_images = [Image.hconcat(group) for group in row_groups] # 纵向拼接所有行,得到最终网格图 stitched_exrs = Image.vconcat(row_images) # 如需转回numpy数组,可执行:np.array(stitched_exrs)
PIL的hconcat和vconcat方法直接封装了拼接逻辑,代码更简洁,还能自动处理图片尺寸(如果有尺寸不一致的情况,建议先统一缩放)。
内容的提问来源于stack exchange,提问作者Ahmad Uzzam Masood
相关产品推荐
相关产品推荐

