Python中如何将处理后的图像补丁正确插回原图并解决广播报错
问题原因分析
- 变量覆盖:你最初读取的全图数据存储在
img变量中,执行img = img[ind:ind+L,ind:ind+L]后,img已经被替换为裁剪后的补丁数组,全图原始数据直接丢失。 - 赋值逻辑颠倒:最后一行代码试图把尺寸为16898x16898的补丁,塞进尺寸只有15362x15362的
img_done数组的对应切片里,二者尺寸不匹配触发广播错误,同时你搞反了「待插入的全图容器」和「处理好的补丁」的赋值关系。
修复方案
第一步:修正基础插入逻辑
首先保留原图备份,理清变量对应关系,即可解决广播报错问题,基础修正代码如下:
import numpy as np import rasterio as rio import imageio # 读取原图,保留全图备份,不要修改这个变量 with rio.open('path/to/image') as src: ori_img = src.read(1) ind = 1536 L = 16898 # 裁剪补丁,用单独变量存储,不修改原图 patch = ori_img[ind:ind+L, ind:ind+L].copy() ## 这里运行你的补丁处理逻辑,处理后的补丁存在processed_patch中 processed_patch = 你的处理函数(patch) processed_patch = processed_patch.astype(np.uint8) # 生成最终结果的基础数组,直接复制原图 result_img = ori_img.copy() # 把处理好的补丁插到对应位置 result_img[ind:ind+L, ind:ind+L] = processed_patch
第二步:实现边缘平滑无伪影过渡
直接硬插补丁会留下明显的拼接边界,我们可以给补丁边缘加羽化过渡带,用渐变权重融合补丁和原图边缘,消除伪影:
# 定义羽化带宽,可根据实际显示效果调整,示例设为30像素 feather_width = 30 # 生成和补丁同尺寸的alpha权重蒙版,初始值全为1 alpha = np.ones((L, L), dtype=np.float32) # 给四个边缘做渐变过渡,角落处取两次渐变的最小值避免权重异常 # 上边缘 alpha[:feather_width, :] = np.linspace(0, 1, feather_width)[:, None] # 下边缘 alpha[-feather_width:, :] = np.linspace(1, 0, feather_width)[:, None] # 左边缘 alpha[:, :feather_width] = np.minimum(alpha[:, :feather_width], np.linspace(0, 1, feather_width)[None, :]) # 右边缘 alpha[:, -feather_width:] = np.minimum(alpha[:, -feather_width:], np.linspace(1, 0, feather_width)[None, :]) # 按权重融合处理后的补丁和原图对应区域 ori_patch = ori_img[ind:ind+L, ind:ind+L] fused_patch = (processed_patch * alpha + ori_patch * (1 - alpha)).astype(np.uint8) # 插入融合后的补丁得到最终结果 result_img[ind:ind+L, ind:ind+L] = fused_patch
内容的提问来源于stack exchange,提问作者standbybee
相关产品推荐
相关产品推荐

