使用Python通过变形网格生成畸变图像时输出不全,如何排查代码问题?
代码问题诊断及修复方案
你代码的问题主要出在以下几个地方:
- 缩进错误:扰动计算的核心代码缩进层级错误,导致只有最后一次顶点扰动生效,其余所有循环内的扰动都被覆盖
# 原错误代码(缩进层级在for循环外) msmv = mv * np.expand_dims(wt, axis=1) perturbed_mesh = perturbed_mesh + msmv # 修正:把这两行缩进一层,放到for k in range(nv)的循环内部
- 映射源图像错误:你给原图加了padding得到带黑边的
img,生成的扰动网格也是基于加padding后的尺寸nh、nw,但调用cv2.remap时传入的是原始无padding的src_img,尺寸不匹配导致映射区域越界
# 原错误代码 dst = cv2.remap(src_img, xs, ys, cv2.INTER_CUBIC) # 修正:改用加了padding的img作为映射源 dst = cv2.remap(img, xs, ys, cv2.INTER_CUBIC)
- 边界裁剪不完整:你只限制了扰动后的坐标不大于图像高宽,没有限制不小于0,负数坐标会被
cv2.remap判定为无效区域,渲染为黑色
# 原错误代码 perturbed_mesh[:, 0] = np.where(perturbed_mesh[:, 0] > height, height, perturbed_mesh[:, 0]) perturbed_mesh[:, 1] = np.where(perturbed_mesh[:, 1] > width, width, perturbed_mesh[:, 1]) # 修正:补充下限判断,直接用clip更简洁 perturbed_mesh[:, 0] = np.clip(perturbed_mesh[:, 0], 0, height-1) perturbed_mesh[:, 1] = np.clip(perturbed_mesh[:, 1], 0, width-1)
- 顶点索引取值错误:
create_grid函数中随机选顶点的索引取错了,np.shape(ms)[0]才是顶点总数,原代码取了np.shape(ms)[1]会导致索引越界
# 原错误代码 vidx = np.random.randint(np.shape(ms)[1]) # 修正 vidx = np.random.randint(np.shape(ms)[0])
- 扰动次数可能为负:
nv = np.random.randint(20) - 1会出现nv=-1的情况,此时不会执行任何扰动操作,可修改为nv = np.random.randint(1,20)保证每次都有扰动效果。
内容的提问来源于stack exchange,提问作者Ronghui Zhan
相关产品推荐
相关产品推荐

