使用DPT-Large生成Midas深度图时锐边出现异常线条的解决咨询
问题:DPT-Large生成深度图时缩放图像出现白色线条伪影
我使用DPT-Large模型生成深度图时,发现当输入缩放至600x413尺寸的图像时,生成的深度图背景山脉上方会出现白色小线条伪影;但输入原始尺寸(1148x790)的图像时无此问题。该问题在官方演示页面和本地克隆代码运行时均能复现。
我无法修改Midas模型本身,只能通过预处理或后处理操作来解决,希望得到可行的替代方案(不想仅依赖原始尺寸图像)。
可行解决方案
一、预处理优化:调整缩放逻辑
DPT模型的输入尺寸需要与内部特征图的下采样倍数(常见为8、16)对齐,600和413都不是这类倍数,容易导致特征拼接时出现伪影。
对齐缩放尺寸到模型兼容倍数:
将图像缩放至最近的、能被8或16整除的尺寸,比如把600x413调整为600x416(416是16的倍数),或者592x416(两者均为16的倍数)。示例代码:from PIL import Image img = Image.open("your_image.jpg") target_width = 600 # 计算对齐到16倍数的高度 target_height = (img.height * target_width // img.width + 15) // 16 * 16 resized_img = img.resize((target_width, target_height), Image.Resampling.LANCZOS)使用高质量缩放算法:
缩放时优先选择LANCZOS这类抗锯齿算法,避免低质量缩放带来的边缘失真被模型放大成伪影。
二、后处理修复:清除伪影
如果已经生成带伪影的深度图,可以通过简单图像处理操作去除白色线条:
模糊+阈值过滤:
先做轻度模糊消除细微噪点,再过滤异常高亮区域。示例代码:import cv2 import numpy as np depth_map = cv2.imread("depth_map.png", cv2.IMREAD_GRAYSCALE) # 轻度高斯模糊 blurred = cv2.GaussianBlur(depth_map, (3,3), 0) # 设定阈值,替换高亮线条为周围像素均值 threshold = 240 # 根据自身深度图亮度调整 mask = blurred > threshold depth_map[mask] = cv2.medianBlur(depth_map, 5)[mask] cv2.imwrite("fixed_depth_map.png", depth_map)形态学开运算:
通过先腐蚀再膨胀的操作,去除细小的高亮线条:import cv2 import numpy as np depth_map = cv2.imread("depth_map.png", cv2.IMREAD_GRAYSCALE) # 创建结构元素 kernel = np.ones((2,2), np.uint8) # 开运算清除伪影 fixed_depth = cv2.morphologyEx(depth_map, cv2.MORPH_OPEN, kernel) cv2.imwrite("fixed_depth_map.png", fixed_depth)
三、额外尝试
在官方示例的预处理环节,尝试给输入图像增加轻度高斯模糊,或者微调归一化参数,减少输入的高频噪声,也可能降低伪影出现的概率。
内容的提问来源于stack exchange,提问作者Laurent Claessens
相关产品推荐
相关产品推荐

