如何用Python将分割后的图像瓦片拼接回原尺寸?
瓦片拼接方案
你的思路没问题:先收集同一imageN前缀的所有瓦片,再按tileN编号顺序拼接,但要注意分割时是按行优先生成的编号(第一行从左到右是tile0到tile5,第二行是tile6到tile11,以此类推),得按这个顺序把瓦片放回原图对应位置,还要还原1000x775的原图尺寸。
具体操作步骤
- 收集并排序瓦片:遍历瓦片文件夹,挑出对应前缀(比如
image0)的所有文件,然后按tile后面的数字从小到大排序,保证顺序和分割时一致。 - 算好行列数:原图高1000,瓦片高128,能切出7行完整瓦片(最后一行剩104像素没切);原图宽775,瓦片宽128,能切出6列完整瓦片(最后一列剩7像素没切),刚好对应你手里的42个瓦片(7×6)。
- 建空白原图容器:用OpenCV创建一个和原图尺寸一样的空白图,通道数和瓦片保持一致(彩色就3通道,灰度就1通道)。
- 按位置拼瓦片:逐个读取排序后的瓦片,根据编号算出它在原图里的行和列位置,把瓦片贴到对应区域就行。如果需要保留原图没被分割的剩余部分,最后再把原图的对应区域补进去。
可直接运行的拼接代码
import os import cv2 import numpy as np # 配置参数 tilesize_r = 128 tilesize_c = 128 original_height = 1000 original_width = 775 tile_dir = "你的瓦片文件夹路径" target_prefix = "image0" # 要拼接的图像前缀 # 收集并排序瓦片 tile_list = [f for f in os.listdir(tile_dir) if f.startswith(target_prefix) and f.endswith(".jpg")] # 按tile编号排序,确保顺序正确 tile_list.sort(key=lambda x: int(x.split("tile")[-1].split(".")[0])) # 创建空白结果图(假设是彩色图,灰度图把3改成1) merged_img = np.zeros((original_height, original_width, 3), dtype=np.uint8) tile_idx = 0 total_rows = original_height // tilesize_r total_cols = original_width // tilesize_c for row in range(total_rows): for col in range(total_cols): # 读取瓦片 tile_path = os.path.join(tile_dir, tile_list[tile_idx]) tile = cv2.imread(tile_path) # 计算在原图中的位置 start_y = row * tilesize_r end_y = start_y + tilesize_r start_x = col * tilesize_c end_x = start_x + tilesize_c # 把瓦片放到对应位置 merged_img[start_y:end_y, start_x:end_x] = tile tile_idx += 1 # 可选:补原图未分割的剩余区域(如果需要的话) # original_img = cv2.imread("你的原图路径") # merged_img[end_y:, :] = original_img[end_y:, :] # merged_img[:, end_x:] = original_img[:, end_x:] # 保存拼接好的图 cv2.imwrite(os.path.join(tile_dir, f"{target_prefix}_merged.jpg"), merged_img)
注意点
- 确保所有瓦片的通道数一致,别有的是彩色有的是灰度,不然拼接会报错。
- 如果后续修改了分割代码,把剩余区域也切成瓦片了,要重新计算行列数和位置。
- 路径要填对,不然找不到瓦片或者存不了结果。
内容的提问来源于stack exchange,提问作者Jaegermeister
相关产品推荐
相关产品推荐

