NCC匹配
基於Normalized cross correlation(NCC)用來比較兩幅圖像的相似程度已經是一個常見的圖像處理手段。在工業生產環節檢測、監控領域對對象檢測與識別均有應用。NCC算法可以有效降低光照對圖像比較結果的影響。而且NCC最終結果在0到1之間,所以特別容易量化比較結果,只要給出一個閾值就可以判斷結果的好與壞。傳統的NCC比較方法比較耗時,雖然可以通過調整窗口大小和每次檢測的步長矩形部分優化,但是對工業生產檢測然后不能達到實時需求,通過積分圖像實現預計算,比較模板圖像與生產出電子版之間的細微差異,可以幫助企業提高產品質量,減少次品出廠率,把控質量。
一:NCC相關的數學知識
什么是NCC - (normalized cross correlation)歸一化的交叉相關性,是數學上統計兩組數據之間是否有關系的判斷方法,貌似搞大數據分析比較流行相關性分析和計算。正常的計算公式如下:
mxn表示窗口大小,這樣的計算復雜度就為O(m x n x M x N)。從上面公式就可以看出其中均值和平方和可以通過積分圖預計算得到,對於模板和目標圖像大小一致的應用場景來說
NCC的計算公式可以表示為如下:
其中根據積分圖像可以提前計算出任意窗口大小和與平方和,這樣就對
通過積分圖像建立起來窗口下面的待檢測圖像與模板圖像的和與平方和以及他們的交叉乘積五個積分圖索引之后,這樣就完成了整個預計算生成。依靠索引表查找計算結果,NCC就可以實現線性時間的復雜度計算,而且時間消耗近似常量跟窗口半徑大小無關,完全可以滿足實時對象檢測工業環境工作條件。
二:算法步驟
1. 預計算模板圖像和目標圖像的積分圖
2. 根據輸入的窗口半徑大小使用積分圖完成NCC計算
3. 根據閾值得到匹配或者不匹配區域。
4. 輸出結果
為了減小計算量,我們可以要把輸入的圖像轉換為灰度圖像,在灰度圖像的基礎上完成整個NCC計算檢測。我們這個給出的基於RGB圖像的NCC計算完整代碼,讀者可以在此基礎上修改實現單通道圖像檢測。
三: 運行結果:
輸入的模板圖像與待檢測圖像,左邊是模板圖像,右邊是待檢測圖像,左上角有明顯污點。圖像顯示如下:
輸入待檢測圖像與模板比較以及檢測計算出NCC的圖像顯示如下:
相比傳統的NCC計算方法,此方法的計算效率是傳統方法幾百倍提升,而且窗口越大效率提升越明顯,有人對此作出的統計如下:
可見基於積分圖快速NCC可以極大提升執行效率減少計算時間,實現窗口半徑無關NCC比較。
1、NCC 在可以解決
◆ 物體有輕微變形
◆ 圖像模糊、邊緣不清的圖片
◆ 圖片有紋理
2、特點
◆ 快速、基於灰度的匹配
◆ 魯棒性
◆ 模糊圖像
◆ 邊緣變形圖像
◆ 有紋理的圖像
◆ NCC 匹配支持光照變化的情況
3、NCC與形狀匹配的比較
NCC 優點
◆ 紋理
◆ 對焦不清
◆ 形狀輕微變形
形狀匹配優點
◆ 精度高
◆ 支持X/Y 方向縮放
◆ 支持物體遮擋
◆ 支持多模板
◆ 支持非線性光照變化
4、NCC匹配相關函數
創建
◆ create_ncc_model
查找
◆ find_ncc_model
讀寫
◆ read_ncc_model
◆ write_ncc_model
內存清除
◆ clear_ncc_model
◆ clear_all_ncc_models
其他
◆ get_ncc_model_params提取一個 NCC(歸一化算法,快速匹配)模型的參數
◆ get_ncc_model_origin提取一個 NCC(歸一化算法,快速匹配)模型的原點(參考點)
◆ set_ncc_model_origin設置一個 NCC(歸一化算法,快速匹配)模型的原點(參考點)
◆ determine_ncc_model_params 制定 NCC(歸一化算法,快速匹配)模型參數
create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID )
函數作用:
創建NCC模板,參數AngleStart和AngleExtent決定可能的旋轉范圍
參數列表:
Template(in):單通道圖像,它的區域可被創建為模板
NumLevels(in):金字塔的最大層級
AngleStart(in):模板的最小旋轉
AngleExtent(in):旋轉角度范圍
AngleStep(in):角度步長
Metric(in):匹配標准
ModelID(out):模板句柄
可能前置項:
draw_region, reduce_domain, threshold
可能后置項:
find_ncc_model, get_ncc_model_params, clear_ncc_model, write_ncc_model, set_ncc_model_origin, set_ncc_model_param
可能替代項:
create_shape_model, create_scaled_shape_model, create_aniso_shape_model, create_template_rot
find_ncc_model( Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score )
函數作用:
用於NCC模板匹配。
參數AngleStart和AngleExtent決定被搜尋模板的角度旋轉范圍。搜索的角度旋轉范圍不適用於模運算2*pi。
如果create_ncc_model使用AngleStart=-20和AngleExtent=40,而find_ncc_model用AngleStart=350和AngleExtent=20,該模板不會被找到,即使角度是重疊的(在模數運算法則內)。如果想要找到該模板,需將find_ncc_model的AngleStart置為-10。
參數MinScore決定被匹配到的實例最小分數,該值越大,算法速度越快。
參數NumMatches表示被找到的實例最大數,如果大於NumMatches的實例被找到,只有最佳的NumMatches個實例返回。如果小於NumMatches個的實例被找到,則找到幾個就幾個,因此MinScore的優先級大於NumMatches。
參數列表:
Image(in):單通道圖像,它的區域可被創建為模板
ModelID(in):模板句柄
AngleStart(in):模板的最小旋轉
AngleExtent(in):旋轉角度范圍
MinScore(in):被找到的模板最小分數
NumMatches(in):被找到的模板個數
MaxOverlap(in):被找到的模板實例最大重疊部分
SubPixel(in):亞像素級別標志,true,false
NumLevels(in):金字塔層級數
Row(out):被找到的模板實例行坐標
Column(out):被找到的模板實例列坐標
Angle(out):被找到的模板實例的旋轉角度
Score(out):被找到的模板實例的分數
可能前置項:
create_ncc_model, read_ncc_model, set_ncc_model_origin
可能后置項:
clear_ncc_model
可能替代項:
find_shape_model, find_scaled_shape_model, find_aniso_shape_model, find_shape_models, find_scaled_shape_models, find_aniso_shape_models, best_match_rot_mg