视差图像的灰度范围保持波动



我一直在进行立体摄影测量,以使用OpenCV查找深度数据。我做了校准,得到了内在、外在和失真参数,以找到视差图。使用这些参数,我校正了图像,并使用它们来找到视差图。但是对象的视差图中的灰色保持从低到高的值波动,即在0-255之间。我一直试图通过改变照明条件并在此基础上重新校准相机来解决这个问题,但它仍然在发生。我不明白我应该改变什么参数才能得到合适的视差图。在此方面提供任何帮助都将不胜感激。我附上了一张图片,其中方形方框的颜色保持波动,即使它在同一平面上,距离相机相同。图像链接

视差图的代码如下:

def depth_map(self,imgL,imgR(:

window_size = 3  
left_matcher = cv2.StereoSGBM_create(
minDisparity=-1,
numDisparities=5*16,  
blockSize=window_size,
P1=8 * 3 * window_size,  # determines smoothness of the disparity map
P2=32 * 3 * window_size, # determines smoothness of the disparity map
disp12MaxDiff=12,         
uniquenessRatio=10,       # value should be in the range 5-15
speckleWindowSize=50,     # value should be between 50-200
speckleRange=32,          
preFilterCap=63,          
mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY
)
right_matcher = cv2.ximgproc.createRightMatcher(left_matcher)
# FILTER Parameters
lmbda = 80000
sigma = 1.3
visual_multiplier = 6
wls_filter = cv2.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
wls_filter.setLambda(lmbda)
wls_filter.setSigmaColor(sigma)
displ = left_matcher.compute(imgL, imgR)  # .astype(np.float32)/16
dispr = right_matcher.compute(imgR, imgL)  # .astype(np.float32)/16
displ = np.int16(displ)
dispr = np.int16(dispr)
filteredImg = wls_filter.filter(displ, imgL, None, dispr)  
filteredImg = cv2.normalize(src=filteredImg, dst=filteredImg, beta=0, alpha=255, norm_type=cv2.NORM_MINMAX);
filteredImg = np.uint8(filteredImg)
return filteredImg

由于模糊性和噪声,它会波动。那些颜色平平的区域彼此无法区分。块匹配算法的结果受随机机会(噪声(的支配,因为图片中没有给出稳定结果的结构。

尝试模块中的其他算法。你没有提供你的代码,所以我只能这么说。