SGM(Semi-Global Matching)、BM(Block Matching)和SAD(Sum of Absolute Differences)都是用于计算立体匹配(Stereo Matching)的经典算法。在 MATLAB 中,可以通过以下步骤实现这些算法来计算视差图:
数据准备:
Block Matching (BM) 算法:
Sum of Absolute Differences (SAD) 算法:
Semi-Global Matching (SGM) 算法:
实现算法:
可视化结果:
通过以上步骤实现 BM、SAD 和 SGM 算法,在 MATLAB 中可以对立体图像进行立体匹配并得出视差图,进而实现深度信息的获取和立体视觉应用。
立体匹配算法是计算机视觉中用于解决立体视觉问题的一种重要技术。它的目标是确定左右两幅图像中对应像素之间的视差,从而实现深度信息的获取和三维重建。下面对几种常见的立体匹配算法进行综述:
区域匹配算法:
局部优化算法:
全局优化算法:
以上仅列举了几种常见的立体匹配算法,实际应用中还有许多衍生算法和混合算法,如SGM-BM算法、SGM-SAD算法等。不同的算法适用于不同的场景和需求,选择合适的立体匹配算法是提高匹配精度和稳定性的关键。
SGM(Semi-Global Matching)是一种常用的立体匹配算法,通过全局优化来提高立体匹配的准确性。下面是 SGM 立体匹配算法的原理:
能量函数定义:
能量计算:
聚合过程:
最小路径计算:
后处理:
时间复杂度优化:
通过以上原理,SGM 立体匹配算法在全局一致性的基础上,结合数据项和平滑项的能量最小化方法来实现高精度的立体匹配,适用于提取深度信息、三维重建等立体视觉任务。
代码:
L= imread('C:\Users\16023\Desktop\例程\L00.png');%红外图 R= imread('C:\Users\16023\Desktop\例程\R00.png'); figure(1);imshowpair(L,R,'montage');title('1左右红外图');
代码:
DR = [0 48];%视差值范围 DM = disparitySGM(L,R,'DisparityRange',DR,'UniquenessThreshold',20);%视差图 figure(2);imshow(DM);title('2立体匹配SGM视差图');
代码:
L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图 R= imread('C:\Users\16023\Desktop\例程\r1.png'); figure(1);imshowpair(L,R,'montage');title('1左右彩色图');
代码:
LL= rgb2gray(L);%彩图转换为灰度图 RR= rgb2gray(R); figure(2);imshowpair(LL,RR,'montage');title('2左右红外图');
代码:
DR = [0 48];%视差值范围 DM = disparitySGM(LL,RR,'DisparityRange',DR,'UniquenessThreshold',20);%视差图 figure(3);imshow(DM);title('3立体匹配SGM视差图');
BM(Block Matching)立体匹配算法是一种基于局部相关性的立体匹配算法,用于计算左右两幅图像之间的视差(disparity)。该算法通过在两幅图像中的对应区域内比较像素值的相似性来寻找最优匹配,以此确定视差值。
具体来说,BM算法将左图像划分成大小相同的块(block),然后在右图像中对应的位置上搜索与左图像块最相似的块,通过计算两个块之间像素值的差异来得到匹配的代价(cost)。最终,选择代价最小的块作为最佳匹配,其视差值即为左右图像之间的视差。
BM算法的优点是简单直观,易于实现,并且具有较好的鲁棒性。然而,由于其依赖局部像素的相似性进行匹配,对于纹理较少、重复区域较多的图像不够稳定,容易产生匹配错误。因此,在实际应用中,BM算法通常与其他更高级的立体匹配算法结合使用,以提高匹配精度和稳定性。
代码:
L= imread('C:\Users\16023\Desktop\例程\L00.png');%红外图 R= imread('C:\Users\16023\Desktop\例程\R00.png'); figure(1);imshowpair(L,R,'montage');title('左右红外图');
代码:
DR = [0 48];%视差值范围 DM = disparityBM(L,R,'DisparityRange',DR,'UniquenessThreshold',20);%视差图 figure();imshow(DM)
代码:
L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图 R= imread('C:\Users\16023\Desktop\例程\r1.png'); figure(1);imshowpair(L,R,'montage');title('左右红外图');
代码:
LL= rgb2gray(L);%彩图转换为灰度图 RR= rgb2gray(R);
代码:
DR = [0 48];%视差值范围 DM = disparityBM(LL,RR,'DisparityRange',DR,'UniquenessThreshold',20);%视差图 figure(2);imshow(DM)
SAD(Sum of Absolute Differences)立体匹配算法是一种基于像素值的相似性来查找最佳匹配的立体匹配算法。该算法的原理是计算左右两幅图像之间每个像素的绝对差异,并将所有差值相加到得到一个代价(cost)值,然后选择代价最小的像素作为最佳匹配。
具体来说,SAD算法首先选择一个目标像素在左图像中的邻域区域,然后在右图像中在相同位置和大小的区域内搜索与左图像区域最相似的区域。对于每个可能的匹配,算法计算左右两个区域之间每个像素值的绝对差值,并将所有差值相加得到一个代价值。最终选择代价最小的区域作为最佳匹配,并将该区域的中心像素的视差作为左右图像之间的视差。
SAD算法的优点是简单易懂,计算量较小,并且对噪声具有较好的稳定性。然而,由于SAD算法只考虑像素值的差异,对于存在纹理重复和遮挡的图像场景,容易出现匹配错误。因此,在实际应用中,通常需要结合其他算法来提高立体匹配的精度和鲁棒性。
代码:
LI=imread('C:\Users\16023\Desktop\例程\L00.png');%左视图 RI=imread('C:\Users\16023\Desktop\例程\R00.png');%右视图 figure(1);imshowpair(L,R,'montage');title('左右红外图');
代码:
[m n]=size(LI);%视图大小 w=3; %窗口边长 depth=10; %最大偏移距离/最大深度距离 IMG=zeros(m,n); for i=1+w:m-w for j=1+w+depth:n-w tmp=[];%空数组 LW=LI(i-w:i+w,j-w:j+w); for k=0:-1:-depth RW=RI(i-w:i+w,j-w+k:j+w+k); diff=LW-RW; tmp=[tmp sum(abs(diff(:)))]; end [a IMG(i,j)]=min(tmp); %获得最小位置的索引 end end figure(3);imshow(IMG,[]);title('SAD视差图');
代码:
L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图 R= imread('C:\Users\16023\Desktop\例程\r1.png'); figure(1);imshowpair(L,R,'montage');title('左右彩色图');
代码:
LI= rgb2gray(L);%彩图转换为灰度图 RI= rgb2gray(R); figure(2);imshowpair(LI,RI,'montage');title('左右红外图');
代码;
[m n]=size(LI);%视图大小 w=3; %窗口边长 depth=10; %最大偏移距离/最大深度距离 IMG=zeros(m,n); for i=1+w:m-w for j=1+w+depth:n-w tmp=[];%空数组 LW=LI(i-w:i+w,j-w:j+w); for k=0:-1:-depth RW=RI(i-w:i+w,j-w+k:j+w+k); diff=LW-RW; tmp=[tmp sum(abs(diff(:)))]; end [a IMG(i,j)]=min(tmp); %获得最小位置的索引 end end figure(3);imshow(IMG,[]);title('SAD视差图');
SGM(Semi-Global Matching)是一种基于全局优化的立体匹配算法,与BM(Block Matching)和SAD(Sum of Absolute Differences)算法相比具有更高的匹配精度和鲁棒性。以下是它们之间的比较:
精度:SGM算法通过全局优化方法来考虑整个图像区域的一致性,能够更准确地估计视差值,尤其在纹理重复和遮挡情况下效果更好。相比之下,BM和SAD算法局限于局部像素的匹配,容易受到噪声和纹理重复的影响,匹配精度较低。
鲁棒性:SGM算法通过全局优化可以提高算法的稳健性,对图像噪声和遮挡有更好的抵抗能力。BM和SAD算法在复杂场景下易产生匹配错误,对边缘和纹理丰富的区域匹配效果较好。
计算复杂度:SGM算法的计算复杂度较高,因为需要对整个图像进行全局优化。BM和SAD算法计算速度较快,适合实时性要求较高的应用。
综上所述,SGM算法在匹配精度和鲁棒性方面优于BM和SAD算法,适合对立体匹配有较高要求的应用场景。而BM和SAD算法则更适合计算简单、实时性要求较高的情况下使用。在实际应用中,可以根据具体需求选择合适的算法。