halcon之NCC匹配

NCC匹配

 

基于Normalized cross correlation(NCC)用来比较两幅图像的类似程度已是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象检测与识别均有应用。NCC算法能够有效下降光照对图像比较结果的影响。并且NCC最终结果在0到1之间,因此特别容易量化比较结果,只要给出一个阈值就能够判断结果的好与坏。传统的NCC比较方法比较耗时,虽然能够经过调整窗口大小和每次检测的步长矩形部分优化,可是对工业生产检测而后不能达到实时需求,经过积分图像实现预计算,比较模板图像与生产出电子版之间的细微差别,能够帮助企业提升产品质量,减小次品出厂率,把控质量。算法

 

一:NCC相关的数学知识dom

 

什么是NCC - (normalized cross correlation)归一化的交叉相关性,是数学上统计两组数据之间是否有关系的判断方法,貌似搞大数据分析比较流行相关性分析和计算。正常的计算公式以下:函数

 

image.png

 

mxn表示窗口大小,这样的计算复杂度就为O(m x n x M x N)。从上面公式就能够看出其中均值和平方和能够经过积分图预计算获得,对于模板和目标图像大小一致的应用场景来讲大数据

NCC的计算公式能够表示为以下:优化

 

image.png

其中根据积分图像能够提早计算出任意窗口大小和与平方和,这样就对spa

 

image.png

image.png

 

经过积分图像创建起来窗口下面的待检测图像与模板图像的和与平方和以及他们的交叉乘积五个积分图索引以后,这样就完成了整个预计算生成。依靠索引表查找计算结果,NCC就能够实现线性时间的复杂度计算,并且时间消耗近似常量跟窗口半径大小无关,彻底能够知足实时对象检测工业环境工做条件。3d

 

二:算法步骤orm

 

1. 预计算模板图像和目标图像的积分图对象

2. 根据输入的窗口半径大小使用积分图完成NCC计算blog

3. 根据阈值获得匹配或者不匹配区域。

4. 输出结果

为了减少计算量,咱们能够要把输入的图像转换为灰度图像,在灰度图像的基础上完成整个NCC计算检测。咱们这个给出的基于RGB图像的NCC计算完整代码,读者能够在此基础上修改实现单通道图像检测。

 

三: 运行结果:

 

输入的模板图像与待检测图像,左边是模板图像,右边是待检测图像,左上角有明显污点。图像显示以下:

 

image.png image.png

输入待检测图像与模板比较以及检测计算出NCC的图像显示以下:

image.png image.png

 

相比传统的NCC计算方法,此方法的计算效率是传统方法几百倍提高,并且窗口越大效率提高越明显,有人对此做出的统计以下:

image.png

可见基于积分图快速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

相关文章
相关标签/搜索