技术标签: 机器学习
【工程应用二】 多目标多角度的快速模板匹配算法(基于边缘梯度) - Imageshop - 博客园
基于边缘梯度方面的匹配,最为出名的莫过于CodeProject上一篇多年前的印度小哥的文章,链接为:Edge Based Template Matching。

这个核心计算式和基于NCC的看上去相似又有着很多不同。注意式子中的大写字母G表示图像的梯度信息,这个是可正亦可负的。即计算式已经脱离原有的像素信息,而使用了梯度相关信息,常用的获取X和Y方向梯度的方式有:


即Sobel边缘检测算子。
在印度小哥的文章里,采用了Canny检测来检测出边缘,然后只对模板图和搜索图中对应的边缘位置计算上述得分公式(以模板图中的边缘处为依据), 这样起到减少取样点,提高速度的作用。
问题:
1、虽然Canny的使用减少了很多计算量,但是他完全剔除了其他弱边缘处的信息,就好像把考试中那些不及格的学生都定型为差生一样,是不科学的。这些弱边缘在一定程度上也有着相当的信息量。
2、Canny本身是有着很多参数来控制最终的效果的,不是一个固定的参数对每一副图像都能获取稳定的效果,因此,这就很难成为一个稳定的算法了。
3、如果采用了金字塔等技术,在金字塔层数增加时,Canny所对应的边缘会越来越不稳定,这会影响最终的精度。
对全图实现上述公式的计算,问题:
1、计算量飙升,这个可以通过金字塔的技术来解决。
2、我们仔细的观察公式(1),如果做一个全局的匹配计算,在计算过程中,必然会遇到不少地方的X和Y方向的梯度都为0或者很小,而且这种像素占的比例还相当高,毕竟图像中真正属于边缘的地方很少。那么这样的一个事实就回到导致很多累加项的值为0或很小(X和Y梯度都为0时,式子的分母为0,程序需要做判断,但输出的结果必然也会是0),这样整体累加后再求平均数我们将获得一个很小的得分(哪怕和模板图一模一样的地方)
改进的方法:
把模板图的整体的幅值信息作为一个因子放入到上述计算公式的分母中,这样,模板图中梯度较小的位置,对整体的幅值贡献就小,从而不会对最后的得分造成影响。
实际编码中的困难:
1、对于角度的检测,类似的,我们也创建多个离散的模板,我们需要旋转模板,然后计算模板的边缘梯度,但是,旋转本身产生了新的边缘,而且是强边缘。
如果把这边缘带入式中计算,非常明显不会得到可靠的结果,我们需要把这个边缘剔除。
2、无论采用何种边缘梯度检测算子,最小的都会涉及到3*3的局部范围,那么对于未旋转或者旋转后的模板图,都存在一个明显问题,最外一圈像素的梯度如何处理,如果使用重复边缘像素的方式,那么就会获得一个较小的梯度,但是实际在在搜索图中是不存在这个问题的,只要模板不在搜索图的边缘处。因此,如果这样处理,哪怕模板就是从搜索图中直接扣取出来的,依据(1)式计算出的结果也不会等于1,而是小于1。
解决:
方法一:忽略最外圈的梯度值,即他们不参与相似性计算。这样就要求在做模板图时,需要可以在实际需要的模板的基础上,中心对称的长和宽每边各增加一个像素。但是,这样实际上还是没有完美解决问题,因为当有金字塔存在时,这可以增加的1个像素经过下采样后已经没有一个像素了。
IM_Rotate(Template, Rotate, RTI.Mask, Angle, 1, Amount); // 旋转图像,获取Mask值
IM_Edge_Erode_3X3(RTI.Mask, RTI.Mask);
方法二:旋转时不是旋转图像然后再计算梯度,而是直接旋转X和Y方向的梯度,但是新的难处是梯度值是有正有负的,这种数据的旋转在使用双线性插值时,由于四个取样点的极性不同,是否能直接处理呢,我感觉好像有问题,比如四个数,2正2负,有可能插值后结果就为0了。
讲讲我对匿名类含义的理解,为什么要整出个匿名类来 文章目录 核心 一、案例一 二、案例二 总结 核心 匿名类的核心作用即:通过多态创造并使用一个父类的方法(如 一般的子类继承父类、抽象类、接口 里面的空方法) 案例一看不懂直接看案例二! 一、案例一 匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练。 通常情况下,要使用一个接口或者抽象类,都必须创建一个子类。 有的时候,为了快速使用,直接...
opencv中关于模板匹配的算法: matchTemplate( const CvArr* image, constCvArr* templ,CvArr* result,int method ); Image 待搜索图像 Templ 模板图像 Result 匹配结果 用来存放通过以下方法计算出滑动窗口与模板的相似值 Method 计算匹配...
今天主要给大家带来一个在荣耀8上看到的一个小有意思的时钟效果,这个效果比较简单,俗话说,“人生在世,无非就是把复杂的事情整简单,抑或把简单的事情搞复杂”,既然比较简单,那咱们就多用几种方案来实现,进而开拓一下思路; 首先先上效果图: 如果你想看 GAStudio Github主页,请戳这里; 如果你想看 GAStudio更多技术文章,请戳这里; github 源码地址:ht...
1.下面这行代码可以很好解释关于null值判断的真髓。 上面的sql是查询不出任何结果的,因为“!=”默认是有值的。 2.下面的这行代码是大家常用的过滤sql。 注意:这里的“!=”是查不到null值的。 3.如果想查询包含null值,并且不等于其他值的情况,代码如下: 4.当查询包含其他条件时,需要注意,比如下面这种情况,查询出来的结果就会有问题。...
很多人在学习Java的过程中不断地听说对象这个字眼,尤其是从学习例如C语言这样面向过程的语言转而学习Java的时候更是从心里无法接受这一崭新的、抽象的、不明所以的概念,使得初学者对Java的学习产生厌倦的心理,甚至很多已经学习Java很久的人,依然对面向对象这一概念有些模糊。本文将从多个维度来阐释Java面向对象的含义。 一、对象是一种思考方式  ...
研究调度器,我们首先要知道调度器的客户是谁,谁需要调度,有以下两种来源: (1)作业提交的时候,申请运行AppMaster需要的容器时 (2)作业运行期间,AppMaster申请运行map以及reduce任务,或者spark任务等等所需要的容器 这一节主要分析第一种请求的源码,即申请AppMaster需要的容器时候的整个过程。申请运行AppMaster需要的容器的起源: 当AppMaster运行需...
Hadoop 调度器介绍 调度器是Hadoop Yarn Master/Slave结构中作为Master的ResourceManager(RM)中的核心部件,负责对各种资源请求进行调度,目支持的资源是内存(Memory)和CPU,目前Yarn支持的调度器主要有FifoScheduler,CapacityScheduler以及FairScheduler这三种,而我们公司采用了FairSchedule...
多角度遥感云相态分类做完了,毕业设计的编程实现是利用python编程语言,实现了遥感中云相态分类,代码比较粗糙,不足之处,还望大家多多指教。下面直接上代码: 实现结果: 黄色:水云 紫色:冰云 蓝色:混合云 绿色:未定...
基于VS2010+ OpenCV2。代码可以读入视频,也可以读摄像头,两者的选择只需要在代码中稍微修改即可。对于视频来说,运行会先显示第一帧,然后我们用鼠标框选要跟踪的目标,然后跟踪器开始跟踪每一帧。对摄像头来说,就会一直采集图像,然后我们用鼠标框选要跟踪的目标,接着跟踪器开始跟踪后面的每一帧。具体代码如下: ...