基於Normalized cross correlation(NCC)用來比較兩幅圖像的類似程度已是一個常見的圖像處理手段。在工業生產環節檢測、監控領域對對象檢測與識別均有應用。NCC算法能夠有效下降光照對圖像比較結果的影響。並且NCC最終結果在0到1之間,因此特別容易量化比較結果,只要給出一個閾值就能夠判斷結果的好與壞。傳統的NCC比較方法比較耗時,雖然能夠經過調整窗口大小和每次檢測的步長矩形部分優化,可是對工業生產檢測而後不能達到實時需求,經過積分圖像實現預計算,比較模板圖像與生產出電子版之間的細微差別,能夠幫助企業提升產品質量,減小次品出廠率,把控質量。算法
一:NCC相關的數學知識dom
什麼是NCC - (normalized cross correlation)歸一化的交叉相關性,是數學上統計兩組數據之間是否有關係的判斷方法,貌似搞大數據分析比較流行相關性分析和計算。正常的計算公式以下:函數
mxn表示窗口大小,這樣的計算複雜度就爲O(m x n x M x N)。從上面公式就能夠看出其中均值和平方和能夠經過積分圖預計算獲得,對於模板和目標圖像大小一致的應用場景來講大數據
NCC的計算公式能夠表示爲以下:優化
其中根據積分圖像能夠提早計算出任意窗口大小和與平方和,這樣就對spa
經過積分圖像創建起來窗口下面的待檢測圖像與模板圖像的和與平方和以及他們的交叉乘積五個積分圖索引以後,這樣就完成了整個預計算生成。依靠索引表查找計算結果,NCC就能夠實現線性時間的複雜度計算,並且時間消耗近似常量跟窗口半徑大小無關,徹底能夠知足實時對象檢測工業環境工做條件。3d
二:算法步驟orm
1. 預計算模板圖像和目標圖像的積分圖對象
2. 根據輸入的窗口半徑大小使用積分圖完成NCC計算blog
3. 根據閾值獲得匹配或者不匹配區域。
4. 輸出結果
爲了減少計算量,咱們能夠要把輸入的圖像轉換爲灰度圖像,在灰度圖像的基礎上完成整個NCC計算檢測。咱們這個給出的基於RGB圖像的NCC計算完整代碼,讀者能夠在此基礎上修改實現單通道圖像檢測。
三: 運行結果:
輸入的模板圖像與待檢測圖像,左邊是模板圖像,右邊是待檢測圖像,左上角有明顯污點。圖像顯示以下:
輸入待檢測圖像與模板比較以及檢測計算出NCC的圖像顯示以下:
相比傳統的NCC計算方法,此方法的計算效率是傳統方法幾百倍提高,並且窗口越大效率提高越明顯,有人對此做出的統計以下:
可見基於積分圖快速NCC能夠極大提高執行效率減小計算時間,實現窗口半徑無關NCC比較。
一、NCC 在能夠解決
◆ 物體有輕微變形
◆ 圖像模糊、邊緣不清的圖片
◆ 圖片有紋理
二、特色
◆ 快速、基於灰度的匹配
◆ 魯棒性
◆ 模糊圖像
◆ 邊緣變形圖像
◆ 有紋理的圖像
◆ NCC 匹配支持光照變化的狀況
三、NCC與形狀匹配的比較
NCC 優勢
◆ 紋理
◆ 對焦不清
◆ 形狀輕微變形
形狀匹配優勢
◆ 精度高
◆ 支持X/Y 方向縮放
◆ 支持物體遮擋
◆ 支持多模板
◆ 支持非線性光照變化
四、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