模板匹配算法

from:https://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864

模板匹配(Template Matching)算法

模板匹配(Template Matching)是圖像識別中最具代表性的方法之一。它從待識別圖像中提取若干特征向量與模板對應的特征向量進行比較,計算圖像與模板特征向量之間的距離,用最小距離法判定所屬類別。模板匹配通常事先建立好標準模板庫。

一、簡單計算樣本之間距離的方法

在工作過程中遇到一個判斷樣本距離的方法,先把他記錄如下:?

循環計算待測樣本和訓練集中已知樣本之間的距離,比較所有的距離值,找出與待測樣本最近的已知樣品,其中所對應的樣本所屬的類別就是待測樣本X所屬的類別。

c實現代碼如下:

<span style="color:#000000"><code>/****************************************
*參數:
*   src:待匹配特征向量
*   template:模板向量
*返回值:
*   int:返回匹配結果;-1:無匹配項
*意義:
*   輸入待匹配特征向量,輸出匹配結果*****************************************/
#define NFeature 25 //特征個數
#define NSample  10 //樣本個數
int templateMatching(double src[], double template[][NFeature])
{double d[11] = {0.0}, temp, mind = 10.0; //匹配度int flag = -1, i, j;for(j = 0; j < NSample; j++) {for(i = 0; i < NFeature; i++) {temp = pow(src[i] - template[j][i], 2);d[j] += temp;}d[j] = sqrt(d[j]);if(mind > d[j]) {mind = d[j];flag = j;            }}return flag;
}
</code></span>

不足之處

以上算法有一個很大的問題,就是當特征向量值順序改變之后,計算結果有很大的變化。例如:?
B = {1, 2, 3, 4}; A1 = {4, 3, 2, 1}; A2 = {1,2,3,4}。A1與B匹配,結果為{3*3+1*1+1*1+3*3} = 20;A2與B匹配,結果為{0+0+0+0} = 0;很明顯特征向量A1與A2是相同的,在實際圖像識別過程中有可能造成:一個圖像旋轉了一定角度,就無法識別出來。所以,這個算法只適合同方向的物體匹配,例如車牌字符識別等。

總結:

1. 只適合恒定方向特征匹配,例如車牌中的字符特征匹配

二、Hausdorff距離匹配

Hausdorff是描述兩組點之間相似程度的一種度量,它是集合和集合之間距離的一種定義形式。下面我們慢慢講解Hausdorff算法的過程。

- 點到點集的距離

- A集合到B集合的直接Hausdorff距離

還是以上面的例子為例來說明。例如:B = {1, 2, 3, 4}, A1 = {4, 3, 2, 1}, A2 = {1 ,2, 3, 4};A1與B匹配:Max{0, 0} = 0; A2與B的匹配:Max{0, 0} = 0;可以看到匹配的結果是:A1與A2是相同的,即使他們特征元素的順序打亂了。一樣可以把他們都正確匹配出來。?
這里寫圖片描述?
如圖所示,X1、X2與T是一樣的特征向量,只是順序打亂了,但是匹配都是0;匹配效果還是很好的。X3是隨機生成的其他的特征向量。?
代碼:

下面按照最一般的情況,計算待測特征向量X與某一樣本T的匹配度。特征元素為有理數。

<span style="color:#000000"><code>/********************************************************參數:X:輸入特征向量數組T:模板庫中某一樣本特征向量n: 特征向量個數返回值:返回匹配結果函數意義:通過輸入待測特征向量和模板特征向量,計算出待測特征向量的匹配度,數值越小,匹配程度越高。式中的距離范式是特征元素之間的差值絕對值。    ***************************************************/
double charrecognize(double X[], double T[], int n) 
{int i,j;double d[2] = {0.0};//存儲X-->T的Hausdorff和T-->X的Hausdorff值double minTemp = 1000.0, sum;//計算X-->T的Hausdoff值for(i = 0; i < n; i++) {minTemp = 1000.0;for(j = 0; j < n; j++) {sum = fabs(X[i] - T[j]);if(sum < minTemp)minTemp = sum;      }d[0] += minTemp;        }//計算T-->X的Hausdorff值for(j = 0; j < n; j++) {minTemp = 1000.0;for(i = 0; i < n; i++) {sum = fabs(T[j] - X[i]);if(sum < minTemp)minTemp = sum;}d[1] += minTemp;        }//返回較大值if(d[0] > d[1])return d[0];return d[1];
}
</code></span>

當我們匹配要求特定方向、特定位置的圖片時,其實也可以用Hausdorff距離進行特征匹配。?
這里寫圖片描述

如圖所示,第一幅圖是模板圖片,后面都是要與模板進行匹配的圖像。

  1. 第一幅圖像是模板的copy,計算出的數值為:50500.
  2. 第二幅圖像在模板的基礎之上進行向左向右移動了一個像素:80254.
  3. 第三幅圖像是把模板旋轉了45°,計算出來的結果是:195405.

三幅圖像雖然是一樣的,只是位置和角度偏移了一些,出現的結果偏差卻很大。這并非說明Hausdorff距離算法性能不佳,只是上述實驗中的“特征選擇”限定了Hausdorff距離算法對偏移和旋轉過于敏感,也正是因為有了這種敏感,也更容易區分“非匹配項”。當我們圖像特征限定在某一方向和位置時,Hausdorff將表現出優異的區分性能。例如:字符模板限定在“字符重心在圖片重心,不旋轉”,待測樣本也如此限定。

代碼流程

  1. 待測樣本為二值化特征向量X, 模板為二值化特征向量T;
  2. 從上到下,從左到右,逐個像素掃描樣本。如果為255(特征點),記錄坐標P(x, y);如果為0,跳過。
  3. 在模板上,以P(x, y)為中心的3*3的鄰域內,搜索255(特征點),尋找與P(x, y)最近的點,并計算最近距離;如果3*3域內沒有255(特征點),就認為距離為一個設定的較大點(例如:5.0)。
  4. 把所有計算的距離累加到樣本至模板的距離D(X, T);
  5. 以同樣的方法計算模板至樣本的距離D(T, D);
  6. 取D = Max{D(X, T), D(T, X)},作為匹配的結果。

    <span style="color:#000000"><code>/****************************************
    參數:X:樣本二值圖,只包含特征信息T:模板二值圖,只包含特征信息
    返回值:double:返回匹配度,越低越匹配
    意義:以樣本二值圖特征像素坐標作為特征點進行
    匹配。
    *****************************************/
    double charrecognise(Mat X, Mat T) 
    {int i, j, m, n;double distemp = 5.0, distemp1, distsum, distsum1;//樣本到模板的距離distsum = 0.0;for(i = 0; i < X.cols; i++) {for(j = 0; j < X.rows; j++) {if(X.at<uchar>(i, j) == 255) {distemp = 5.0;for(m = i - 3; m <= i + 3; m++) {for(n = j - 3; n <= j + 3; n++) {if(m < 0) m = 0;if(m > X.cols) m = X.cols;if(n < 0) n = 0;if(n > X.rows) n = X.rows;if(T.at<uchar>(m, n) == 255) {distemp1 = sqrt(pow((double)m - i, 2) + pow((double)n - j, 2));if(distemp1 < distemp) distemp = distemp1;}}}}distsum += distemp;}}//模板到樣本的距離distsum1 = 0.0;for(i = 0; i < T.cols; i++) {for(j = 0; j < T.rows; j++) {if(T.at<uchar>(i, j) == 255) {distemp = 5.0;for(m = i - 3; m <= i + 3; m++) {for(n = j - 3; n <= j + 3; n++) {if(m < 0) m = 0;if(m > T.cols) m = T.cols;if(n < 0) n = 0;if(n > T.rows) n = T.rows;if(X.at<uchar>(m, n) == 255) {distemp1 = sqrt(pow((double)m - i, 2) + pow((double)n - j, 2));if(distemp1 < distemp) distemp = distemp1;}}}distsum1 += distemp;}}}if(distsum > distsum1)return distsum;return distsum1;
    }
    </code></span>

總結

  1. Hausdorff距離算法能無視特征元素的順序進行匹配。
  2. Hausdorff距離算法對以位置為特征元素的特征向量進行匹配時,效果很差,但是對匹配條件加以限定還是可以達到很好的區分效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458189.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于linux用戶權限的理解

創建用戶useradd 用戶名創建用戶組groupadd 組名查看用戶Idid 用戶修改文件權限chmod 777 文件名或目錄-R 遞歸修改用戶數組chown 屬主&#xff1a;屬組 文件名或目錄名-R 遞歸轉載于:https://blog.51cto.com/1979431/1833512

IMEI串號

IMEI串號就是國際移動設備身份碼&#xff0c;是電子設備的唯一身份證&#xff0c;由于它的唯一性&#xff0c;它可以用來查詢電子設備的保修期還有產地&#xff0c;可以說用處直逼人民的身份證啊&#xff01; 在撥號鍵盤頁面 輸入【*#06#】五個字符轉載于:https://www.cnblogs…

立體匹配十大概念綜述---立體匹配算法介紹

from&#xff1a;https://blog.csdn.net/wintergeng/article/details/51049596 一、概念 立體匹配算法主要是通過建立一個能量代價函數&#xff0c;通過此能量代價函數最小化來估計像素點視差值。立體匹配算法的實質就是一個最優化求解問題&#xff0c;通過建立合理的能量函數…

zjnu1730 PIRAMIDA(字符串,模擬)

Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 E Sample Output 1 0 2 1 1題意&#xff1a;給你一個長度小于等于10^6的字符串&#xff0c;然后每次讓它循環鋪蓋&#xff0c;構成層數為n的塔&#xff0c;讓你求得第i層塔中某個字符的個數。 思路&#xff1a;首先要…

ICP算法理解

from&#xff1a;https://blog.csdn.net/linear_luo/article/details/52576082 1 經典ICP ICP的目的很簡單&#xff0c;就是求解兩堆點云之間的變換關系。怎么做呢&#xff1f;思路很自然&#xff0c;既然不知道R和t(針對剛體運動)&#xff0c;那我們就假設為未知量唄&#xf…

2016-8-2更新日志

1.修正版本管理器資源文件名 不能正確拉取 91Resource 文件下的資源的問題2.修正商城購買物品不計算負重的問題3.修正拾取疊加物品 只計算一個物品的重量的問題4.游戲參數-> 游戲選項2->增加物品使用間隔5.修正冷酷不加技能點的BUG6.自定義UI開放測試[目前只能針對熱血傳…

字符流緩沖區的使用之BufferedWriter和BufferedReader

從字符輸入流中讀取文本&#xff0c;緩沖各個字符&#xff0c;從而實現字符、數組和行的高效讀取&#xff0c;代碼中使用了輸入緩沖區的特有的方法&#xff1a;readLine(),獲取一行文本數據 import java.io.BufferedReader; import java.io.FileNotFoundException; import java…

圖像處理的灰度化和二值化

from&#xff1a;http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html 在圖像處理中&#xff0c;用RGB三個分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即紅、綠、藍三原色來表示真彩色&#x…

結合 category 工作原理分析 OC2.0 中的 runtime

絕大多數 iOS 開發者在學習 runtime 時都閱讀過 runtime.h 文件中的這段代碼: struct objc_class {Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class super_class OBJC2_UNAVAILABLE;const char *name …

獲取子元素

1、純css 獲取子元素 #test1>div {background-color:red;}#test1 div {font-size:14px;}#test1>div:first-child {color:#ccc;} <div id"test1"><div>性別</div><div>男</div></div> 因1示例中為#test1下的子元素 #test1…

JPG PNG GIF BMP圖片格式的區別

類型優點缺點應用場景相同圖片大小比較BMP無損壓縮&#xff0c;圖質最好文件太大&#xff0c;不利于網絡傳輸 152KGIF動畫存儲格式最多256色&#xff0c;畫質差 53KPNG可保存透明背景的圖片畫質中等 202KJPG文件小&#xff0c;利于網絡傳輸畫質損失車牌識別84K BMP BMP&…

EasyUI左右布居

<!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head runat"server"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>首頁</title> <li…

44.Android之Shape設置虛線、圓角和漸變學習

Shape在Android中設定各種形狀&#xff0c;今天記錄下&#xff0c;由于比較簡單直接貼代碼。 Shape子屬性簡單說明一下:   gradient -- 對應顏色漸變。 startcolor、endcolor就不多說了。 android:angle是指從哪個角度開始變.solid -- 填充。stroke -- 描邊。corners -- 圓角…

幾種邊緣檢測算子的比較Roberts,Sobel,Prewitt,LOG,Canny

from&#xff1a;https://blog.csdn.net/gdut2015go/article/details/46779251 邊緣檢測是圖像處理和計算機視覺中的基本問題&#xff0c;邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。這些包括&#xff1a;深度上的…

django 初試

/*************************************************************************************** django 初試* 說明&#xff1a;* 昨天打搭了dgango的服務器&#xff0c;今天學一下怎么來輸出一個hello world出來。* * …

淺析“高斯白噪聲”,“泊松噪聲”,“椒鹽噪聲”的區別

from&#xff1a;https://www.jianshu.com/p/67f909f3d0ce 在圖像處理的過程中&#xff0c;一般情況下都進行圖像增強&#xff0c;圖像增強主要包括“空域增強”和“頻域增強”&#xff0c; 空域增強包括平滑濾波和銳化濾波。 平滑濾波&#xff0c;就是將圖像模糊處理&#x…

HttpClient通過Post上傳文件(轉)

在之前一段的項目中&#xff0c;使用Java模仿Http Post方式發送參數以及文件&#xff0c;單純的傳遞參數或者文件可以使用URLConnection進行相應的處理。 但是項目中涉及到既要傳遞普通參數&#xff0c;也要傳遞多個文件&#xff08;不是單純的傳遞XML文件&#xff09;。在網上…

數字圖像處理:各種變換濾波和噪聲的類型和用途總結

摘自http://imgtec.eetrend.com/blog/4564 一、基本的灰度變換函數 1.1圖像反轉 適用場景&#xff1a;增強嵌入在一幅圖像的暗區域中的白色或灰色細節&#xff0c;特別是當黑色的面積在尺寸上占主導地位的時候。 1.2對數變換&#xff08;反對數變換與其相反&#xff09; …

Java 開發環境部署

1.下載Java開發環境工具包JDK&#xff0c;下載地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 下載后&#xff0c;雙擊jdk應用程序&#xff0c;根據提示完成安裝&#xff0c;安裝過程中可以自定義安裝目錄等信息&#xff0c;這里我選擇…

枚舉enum、NS_ENUM 、NS_OPTIONS

2019獨角獸企業重金招聘Python工程師標準>>> enum 了解位移枚舉之前&#xff0c;我們先回顧一下C語言位運算符。 1 << : 左移,比如1<<n,表示1往左移n位&#xff0c;即數值大小2的n次方; 例如 : 0b0001 << 1 變為了 0b0010 2 >> : 右…