双目立体视觉中的彩色SAD(Sum of Absolute Differences)算法是一种基于颜色信息的匹配方法,通过计算左右图像中对应像素块的颜色差异绝对值和来估计视差。
一、算法原理
-
核心思想
在左右图像中,以每个像素为中心构造一个滑动窗口,计算窗口内所有像素的RGB三通道颜色差绝对值之和(即SAD值),通过搜索最小SAD值确定最佳匹配位置,进而计算视差。
-
公式
对于左图窗口 LLL和右图窗口 RRR,SAD值定义为:

其中,www为窗口半径,ddd为视差范围,k=1,2,3k=1,2,3k=1,2,3对应RGB三通道。
二、实现步骤
-
输入预处理
-
读取左右彩色图像,转换为双精度类型。
-
确保两图已校正(行对准),且尺寸一致。
-
-
参数设置
-
窗口大小(如 5×5,半径 w=2)。
-
最大视差范围 dmax(通常为图像宽度的5%~10%)。
-
-
视差计算
-
遍历左图每个像素,构造滑动窗口。
-
在右图对应行范围内滑动窗口,计算SAD值。
-
记录最小SAD值对应的视差,生成视差图。
-
-
后处理
-
对视差图进行中值滤波或双边滤波,消除噪声。
-
可选:通过视差-深度公式转换为深度图。
-
三、MATLAB代码实现
matlab
% 读取左右彩色图像
left = im2double(imread('left.png'));
right = im2double(imread('right.png'));
[m, n, ~] = size(left);
% 参数设置
w = 2; % 窗口半径
d_max = 64; % 最大视差
window_size = 2*w + 1;
% 初始化视差图
disparity_map = inf(m, n);
% 遍历图像(排除边界)
for i = w+1 : m-w
for j = w+1 : n-w
% 构造左图窗口
left_win = left(i-w:i+w, j-w:j+w, :);
% 在右图搜索范围内滑动窗口
min_sad = inf;
best_d = 0;
for d = 0 : d_max
if j - d - w < 1
break;
end
right_win = right(i-w:i+w, j-d-w:j-d+w, :);
% 计算三通道SAD
sad = 0;
for k = 1:3
diff = left_win(:,:,k) - right_win(:,:,k);
sad = sad + sum(abs(diff(:)));
end
% 更新最小SAD和最佳视差
if sad < min_sad
min_sad = sad;
best_d = d;
end
end
disparity_map(i, j) = best_d;
end
end
% 归一化视差图并显示
disparity_map = uint8(normalize(disparity_map, 0, 1, 'range'));
imshow(disparity_map);
title('视差图');
参考代码 双目立体视觉彩色SAD算法 www.youwenfan.com/contentcsr/99026.html
四、优化与改进
-
加速方法
-
积分图加速:预计算积分图以快速计算窗口内差异和。
-
并行计算 :利用MATLAB的
parfor或GPU加速(如gpuArray)。
-
-
抗噪处理
-
对输入图像进行高斯滤波,减少噪声影响。
-
在SAD计算中引入权重(如中心像素权重更高)。
-
-
多尺度匹配
- 先在大窗口下粗匹配,再在小窗口内精匹配,提升边缘精度。
五、应用场景
-
自动驾驶:实时生成深度图用于障碍物检测。
-
机器人导航:结合SLAM技术实现环境建模。
-
3D重建:通过视差图恢复场景三维结构。
六、参考文献
-
双目图像融合算法(SAD原理与MATLAB实现)
-
立体匹配核心算法(SAD、SSD等)
-
彩色SAD算法的卷积优化
-
匹配代价计算(AD、SAD、Census对比)