模板影象 以視窗滾動的方式 在源影象中 掃一遍。
具體運算公式如下:
r(i,j) = dsigmast / (dsigmat * dsigmas) 對應上公式; r(i,j)=[0,1]
m ,n 模板大小
對於公式的解釋:
dsimgmast -- 在 在原圖(i ,j) 位置 模板影象每個畫素與對應原影象素的積 的和)
dsigmat -- 模板影象每個畫素的積 的和
dsigmas -- 在原圖(i,j)位置,模板影象對應的原圖的每個畫素的積的和
r(i,j)最大的位置就是最匹配的位置。
/*函式:normalizegraymatch
功能:歸一化灰度值匹配
引數:src 原圖
template 模板
point 匹配的位置左上角
返回值: 0 --- 未找打匹配物件
其他 --- 返回匹配位置相似度
*/double normalizegraymatch(iplimage * src , iplimage * temp , cvpoint & point)
}double r = 0 ;
double dsigmas ;
double dsigmast ;
unsigned char piexlt,piexls;
double dmaxr = -1 ;
int nmaxheight = -1 ;
int nmaxwidht = -1 ;
for (int i = 0 ; i < nsrcheight - ntheight +1 ; ++ i )
}r = dsigmast / ( sqrt(dsigmas) * sqrt(dsigmat) ) ;
if (r > dmaxr )
}}if (dmaxr != -1)
return 0 ;序貫相似性檢測法匹配 ssda -- similarity sequential dectection algorithm
前面的歸一化積相關匹配演算法計算量很大,原因在於搜尋視窗在源影象上進行滑動,每滑動一次就要做一次匹配運算,除了匹配的點外在其他匹配點做了『無用功』,導
致了匹配演算法的計算量上公升。所以,一旦發現所在的參考位置為非匹配點,就丟棄不再計算,立刻換到新的參考點計算,可以大大加速匹配過程。
ssda演算法過程:
1.定義絕對誤差:
其中:模板對應原圖(子圖)的灰度平均值
模板的灰度平均值
2.取乙個不變閾值
3.掃面原圖每個畫素點待匹配點對應的模板子圖,根據1中的公式據算絕對誤差,當累加值超過閾值時停止累加,停止此模板子圖的掃瞄,記錄帶匹配點的位置和累加次數
4,迴圈 3 直到掃瞄完全圖
5,累加次數最少的畫素點就為最佳匹配點
對於序貫相似相演算法有很多可以優化的地方, 比如 第三步 掃瞄子影象素的時候 可以用 隔行 列 掃瞄 , 第二部 閾值可以改為自動閾值等等,不過這裡的優化有能
怎麼樣呢 還是很慢呀,還是期待後面的演算法吧。
/*函式:ssdamatch
引數:src --- 源影象 in
temp -- 匹配模板 in
point -- 匹配位置 out
threshold -- 閾值 in
返回值:累加次數
限制: 8位灰度圖
*/int ssdamatch(iplimage * src , iplimage * temp , cvpoint & point , int threshold)
}dsigmat /=ntempsize ;
double dsigmas = 0 ;
double dbr =0; //誤差
long lr = 0; //誤差累積次數
long maxr =0; //最大累積次數
int nmaxheight = 0 ; //最大累計次數 對應匹配位置 (左上角)
int nmaxwidht = 0 ;
for (int i = 0 ; i < nsrcheight - ntheight +1 ; ++i)
}dsigmas /=ntempsize ;
//計算誤差 一旦超過閾值則拋棄不再計算
for (int k = 0 ; k < ntheight ; ++ k)
if (dbr>=threshold)
break;
}//取達到threshold 累加最多的 位置
if ( lr >maxr )
}} point.x = nmaxwidht ;
point.y = nmaxheight ;
return lr;基於特徵的匹配
利用灰度資訊匹配的方法主要缺陷是計算量過大,對影象的灰度變換很敏感,尤其是非線性的光照變化,此外,對目標的旋轉、變形以及遮擋也比較敏感,為
了克服這些缺點,可以利用影象的特徵進行匹配,由於影象的特徵點比畫素點要少很多,大大減少了匹配過程的計算量,同時,特徵點的匹配度量值對位置的
變化比較敏感,可以大大的提高匹配的精度。而且,特徵點的提取過程可以減少雜訊的影響,對灰度變化、影象形變以及遮擋等有較好的適應能力。
不變矩匹配法 tm演算法 具有平移、旋轉、尺寸不變性
p+q>=2
歸一化公式:
演算法過程:計算 分別計算模板和原圖的7個不變矩 ,根據歸一化公式得出相似度。
double momentmatch(unsigned char * src , unsigned char * temp ,int nwidth , int nheight ,int nwidthstep )
return r = dsigmast / sqrt( dsigmas * dsigmat) ;/*
函式:calbarycenter
功能:計算重心矩
引數:pdata -- 影象資料 in
nwidth -- 寬 in
nheight -- 高 in
nwidthstep -- 步長 in
nbarycenterx -- 重心座標 out
nbarycentery
*/void calbarycenter(unsigned char * pdata , int nwidth , int nheight ,int nwidthstep , int &nbarycenterx , int &nbarycentery)
}nbarycenterx =(int) (m10 / m00 +0.5);
nbarycentery = (int)(m01/ m00 + 0.5);/*
函式:calcentermoment
功能:計算中心矩
引數:pdata --- 影象資料 in
nwidth -- 寬 in
nheight -- 高 in
nwidthstep -- 步長 in
nbarycenterx -- 重心矩 in
nbarycentery
ip -- 階數 in
jq返回值:中心距值
*/double calcentermoment(unsigned char * pdata , int nwidth , int nheight ,int nwidthstep ,
double nbarycenterx , double nbarycentery,int ip,int jq)
}//for l
}//for l
//計算匹配誤差
dbmatch = ( dsigmast + abs(na-nb)) /(na +nb);
if (dbmatch < dbminmatch)
} // for j
} //for i
point.x = nmatchwidth;
point.y = nmatchheight;
free(ptdist);
free(ptdata);
return dbminmatch;5.最小均方誤差匹配法
最小均方誤差匹配方法是利用影象中的對應特徵點,通過解特徵點的變換防長來計算影象間的變換引數。
基本原理:最小均方誤差匹配方法是以模板中的特徵點構造矩陣x ,影象子圖中的特徵點構造矩陣y ,求解矩陣x 到矩陣y 的變換矩陣, 其中誤差
最小的位置為最佳匹配位置
影象間的仿變換方程:
原點為中心旋轉 平移
仿變換引數為
構建影象矩陣 x
y最小均方誤差的原理是求解
其中
排序演算法 歸納總結
一 直接插入排序 氣泡排序和簡單選擇排序是最基本的排序方法,它們主要用於元素個數n n 10000 不是很大的情形。它們的平均複雜度均為o n 2 實現也比較簡單。1 直接插入排序對於規模很小的元素序列 n 25 非常有效。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需...
查詢演算法和排序演算法的歸納總結
查詢演算法 有序查詢 時間複雜度 o n 二分查詢 時間複雜度 o logn 有序查詢演算法實現 public int search int searcher 二分查詢演算法實現 public int binary search int searcher return 1 排序演算法 氣泡排序 時間...
Halcon中模板匹配方法的總結歸納
基於元件的模板匹配 應用場合 元件匹配是形狀匹配的擴充套件,但不支援大小縮放匹配,一般用於多個物件 工件 定位的場合。演算法步驟 1.獲取元件模型裡的初始控制項 gen initial components 引數 modelimage input 初始元件的 initialcomponents ou...