1.概念: sad(sum of absolute differences)是一種影象匹配演算法。基本思想:差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速、但並不精確,通常用於多級處理的初步篩選。
2.步驟:(1)構造乙個小視窗,類似於卷積核;
(2)用視窗覆蓋左邊的影象,選擇出視窗覆蓋區域內的所有畫素點;
(3)同樣用視窗覆蓋右邊的影象並選擇出覆蓋區域的畫素點;
(4)左邊覆蓋區域減去右邊覆蓋區域,並求出所有畫素點灰度差的絕對值之和;
(5)移動右邊影象的視窗,重複(3)-(4)的處理(這裡有個搜尋範圍,超過這個範圍跳出);
(6)找到這個範圍內sad值最小的視窗,即找到了左圖錨點的最佳匹配的畫素塊。
3.說明:用sad演算法可以得出左右影象的視差,若再一步處理就可以得到深度圖,深度與視差存在反比的關係,我們可以簡單體會一下:將手指頭放在離眼睛不同距離的位置,並輪換睜、閉左右眼,可以發現手指在不同距離的位置,視覺差也不同,且距離越近,視差越大,其中距離的遠近就是深度了。而且可以注意到,當你用左眼看手指時,手指在你眼中的靠右位置,而用右眼看時,手指在你眼中靠左的位置。兩隻眼分別看到的影象是一樣大的,如果用(x,y)表示左眼檢視中某個位置的座標,那麼相應的該位置右眼檢視的座標應該為(x-d,y),其中d為視差。這時(x,y)和(x-d,y)就是最佳匹配點。但是實際情況我們並不知道d是多少。sad演算法就給出了如何求d.
sad演算法的思想:只需我們按視差搜尋範圍從0開始搜尋,找到左右影象最匹配的點,對應的視差值就確定了。那麼怎麼確定最佳匹配點呢?試想一下,如果視差為0,也就是左右影象一樣,那麼這個點上下左右區域對應的點都應該相同,所以畫素相減後都為0,由於視差的存在(簡單理解為從不同的角度看物體,由於光照的影響畫素值也會發生改變),該點上下左右區域的畫素值不會完全相等,但是我們依然可以利用這個思想,設定乙個小視窗,在左右兩幅圖中計算其畫素值差的絕對值之和。假如視差搜尋範圍為0-50,那麼就會得到51個結果。若在某個視差值d下該絕對值之和最小,那麼d就為該中心點對應的視差。再由視差與深度的關係就可以得到深度圖。
關於sad演算法的opencv實現**有很多,這裡給出兩個:
#include
"iostream"
#include
"opencv2/opencv.hpp"
#include
"iomanip"
using
namespace std;
using
namespace cv;
class
sadsad
(int _winsize,
int _dsr)
:winsize
(_winsize)
,dsr
(_dsr)
mat computersad
(mat &l, mat &r)
;//計算sad
private
:int winsize;
//卷積核的尺寸
int dsr;
//視差搜尋範圍};
mat sad::
computersad
(mat &l, mat &r)
} point minloc;
//point資料型別為二維點物件,有橫縱xy兩個座標
minmaxloc
(mm,
null
,null
,&minloc,
null);
//返回mm最小值的座標
int loc = minloc.x;
//取最小值座標的橫座標x值,即為對應的列序號,也就是相應的視差值
//int loc=dsr-loc;
disparity.at<
char
>
(i, j)
= loc *16;
//*16只是為了方便顯示
}double rate =
double
(i)/
(width)
;//cout << "已完成" << setprecision(2) << rate * 100 << "%" << endl; //處理進度
}return disparity;
}
接下來這個可以執行,就是**比較粗暴,不是很容易理解。
#include
#include
#include
#include
#include
using
namespace std;
using
namespace cv;
const
int n =7;
//視窗大小:2*n+1
const
int range =
150;
//視差範圍
void
sad(uchar* limg,
uchar* rimg,
uchar* oimg,
int w,
int h)}if
(cost < bestcost)
oimg[y*w + x]
= bestdisparity*4;
}}}}
intmain()
imr =
imread
("im6.png",0
);if(imr.
empty()
) imo.
create
(iml.rows, iml.cols, cv_8uc1)
;sad
(iml.data, imr.data, imo.data, iml.cols, iml.rows)
;namedwindow
("left"
, window_autosize)
;namedwindow
("right"
, window_autosize)
;namedwindow
("output"
, window_autosize)
;imwrite
("11.png"
, imo)
;imshow
("output"
, imo)
;imshow
("left"
, iml)
;imshow
("right"
, imr)
; clock_t endtime =
clock()
;printf
("%d\n"
,(endtime - starttime));
cout <<
(endtime - starttime)
<< endl;
waitkey(0
);return0;
}
立體匹配SAD演算法matlab實現
sad sum of absolute differences 是一種影象匹配演算法。用公式表示為 sad u,v sum選擇最小值。基本思想 差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速 但並不精確,通常用於多級處理的初步篩...
SAD立體匹配演算法的PYTHON實現
這是第一次發csdn部落格,因為在機器視覺的學習中csdn幫助了我很多,那麼我也應該為csdn社群做一些貢獻,所以本文將介紹我用python實現的sad匹配演算法。sad演算法是立體匹配演算法中,隸屬於區域性區域匹配演算法中的乙個演算法,原理是從左圖中找出乙個小視窗,利用極線約束,在 右圖中同一行中...
立體匹配 立體匹配過程
立體匹配就4個步驟 匹配代價計算,代價聚合,計算視差,視差精化 匹配代價計算 一般是通過計算左右兩圖對應畫素3個通道的灰度值差來決定匹配代價的,常用的就是基於畫素點匹配代價計算,一般有ad,sd,tad什麼的,基於區域的匹配代價計算一般有sad,ssd,stad之類的。匹配代價計算會生成乙個disp...