256×256图像分块拼接重建3840×2048原图问题排查
问题排查
1. 分块读取顺序错乱
你存储分块时的遍历顺序是:先水平方向逐列移动(col_i),再垂直方向逐行移动(row_i),生成的文件名按数字序号递增。但你读取时直接用glob.glob遍历文件,默认是字符串排序而非数字顺序,比如xxx_10.png会排在xxx_2.png之前,最终patches列表的顺序和你存储时的顺序完全不匹配,这是所有错误的核心根源。
2. sklearn重建全黑的原因
- 参数错误:你调用
reconstruct_from_patches_2d(input_patches, input_image)时,input_image还没有被定义为形状元组,参数错误导致重建输出无效,自然是全黑图像。 - 形状传反:numpy数组的维度顺序是
(高度, 宽度, 通道数),原图尺寸是3840(宽)×2048(高),正确形状应为(2048, 3840, 3),你后续定义的(3840,2048,3)宽高顺序完全颠倒,就算参数赋值正确也会重建失败。 - 通道不匹配:你用
cv2.imread读取的图像是BGR通道顺序,后续直接用Image.fromarray以RGB模式存储,通道反转也会导致颜色完全错乱。 - 顺序要求:
reconstruct_from_patches_2d要求输入的patches按**行优先(逐行逐列)**的顺序排列,你本身读取的patches顺序是乱的,就算参数完全正确也重建不出正确结果。
3. 手动拼接错误的原因
- 变量引用错误:你循环中使用的
img变量从未定义,你读取到的分块存储在input_patches中,形状为(120, 256, 256, 3),不存在x, y两个维度的索引,img[x, y, 0, ...]的索引方式完全错误。 - 形状定义错误:和前面的问题一致,你定义的
reconstructed_arr形状(3840,2048,3)宽高顺序颠倒,直接导致内容错位。 - 切片长度错误:你的分块尺寸是256,但是赋值时切片写的是
x_pos:x_pos + 512,会导致分块重叠覆盖或者越界。 - 数值类型错误:
reconstructed_arr默认是float64类型,直接用cv2.imwrite存储时,OpenCV会把大于1的浮点值全部判定为最大值255,小于1的判定为0,最终输出异常的灰度图像。 - 逻辑错误:
(input_image == reconstructed_arr).all()是完全无效的判断,input_image是形状元组,和numpy数组对比永远返回False。
修复思路
- 读取分块时按文件名的数字序号排序,示例代码:
img_paths = sorted(glob.glob(os.path.join(directory_path, "*.png")), key=lambda x: int(os.path.splitext(os.path.basename(x))[0].split('_')[-1]))
- 手动拼接时按分块的行列数遍历:3840/256=15列,2048/256=8行,共120块,按照和存储时对应的顺序填充即可。
- 注意通道转换:用OpenCV读取的图像要转RGB再用PIL存储,或者直接用OpenCV存储不需要转通道。
- 重建时确认参数正确:调用
reconstruct_from_patches_2d时第二个参数传入正确的形状元组(2048, 3840, 3)。
内容的提问来源于stack exchange,提问作者Matança de Porco
相关产品推荐
相关产品推荐

