1.算法原理
SAD(Sum of absolute differences)是一种图像匹配算法。基本思想:差的绝对值之和。此算法常用于图像块匹配,将每个像素对应数值之差的绝对值求和,据此评估两个图像块的相似度。该算法快速、但并不精确,通常用于多级处理的初步筛选。
公式如下:
2.基本流程
输入:两幅图像,一幅LeftImage,一幅RightImage且两幅图像已经校正实现行对准
对左图,依次扫描,选定一个像素点:
(1)以该像素点为中心构造一个公式小窗口,类似于卷积核;
(2)用窗口覆盖左边的图像,选择出窗口覆盖区域内的所有像素点;
(3)同样用窗口覆盖右边的图像并选择出覆盖区域的像素点;
(4)左边覆盖区域减去右边覆盖区域,并求出所有像素点灰度差的绝对值之和;
(5)移动右边图像的窗口,重复(3)-(4)的处理(这里有个搜索范围,超过这个范围跳出);
(6)找到这个范围内SAD值最小的窗口,即找到了左图锚点的最佳匹配的像素块。
3.matlab程序
clear all
clc
left=double(rgb2gray(imread('C:\Users\Administrator\Desktop\scene1.row1.col1.ppm'))); %读取左图,并转换成灰度图
right=double(rgb2gray(imread('C:\Users\Administrator\Desktop\scene1.row1.col2.ppm'))); %读取右图,并转换成灰度图
[m n]=size(left);
w=4; %窗口半径
dmax=16; %最大偏移距离,同样也是最大深度距离
shicha=ones(m,n);
shicha=shicha*3; %给视差图所有位置赋一个较大的初始视差值,避免图像扫描的空缺
for i=1+w:1:m-w %图像的行
for j=1+w:1:n-w %图像的列
min=5000; tmpd=0; tmp=0;diff=[];
for d=0:1:dmax %视差允许范围
if(j+w+d<=n) %窗口的列不能超出图片的范围
lwin=left(i-w:i+w,j-w+d:j+w+d); %左图子窗口
rwin=right(i-w:i+w,j-w:j+w); %右图子窗口
diff=abs(rwin-lwin); %以右图为基准图
tmp=sum(sum(diff(:))); %窗口内所有灰度值之差求和
end
if(tmp<min) %计算出的代价之,与最初设定的一个最大代价值比较
min=tmp;
tmpd=d;
end
end
shicha(i,j)=tmpd; %将视差存入空间视差矩阵中
end
end
imshow(shicha,[]); %显示视差图
这是第一次发布博客,程序可能还有不完善的地方欢迎指导修正。后续还有SGM半全局算法等。