[db:标题]
摘要:在工业应用场合,有着非常广泛使用场景的是多目标多角度的模板匹配(基本无缩放或轻微缩放),本人尝试基于NCC模仿halcon的一些方法和步骤,加以复现,基本实现了具有一定价值的快速匹配。本文对实现过程中一些细节予以描述。
愿意写代码的人一般都不太愿意去写文章,因为代码方面的艺术和文字中的美学往往很难兼得,两者都兼得的人通常都已经被西方极乐世界所收罗,我也是只喜欢写代码,让那些字母组成美妙的歌曲,然后自我沉浸在其中自得其乐。而今天,在清明之际,在踏青时节,我还是忍不住停下来歇歇脚,稍微共享一下最近一直研究的一个非常基础的算法和应用 - 多目标多角度的模板匹配。
模板匹配,这是一个几十年来一直为业界所重点研究和处理的算法,存在于各种不同的机器视觉库中,如果哪一个没有提供这个功能,那么他将无法获取大家的认可,也就失去了最基本的活力。可以说模板匹配基于机器视觉就相当于数组在编程语言中一样,基础但是不可或缺。
在2004年时,我的毕业设计中一个很重要的部分也是模板匹配,当时用模板匹配找到每个量杯中黄色的油的位置,现在看来用那个算法也是醉了,不过能顺利毕业还考得就是他。
在我的早期博客中,有一篇文章已经谈到了这个算法,详见:标准的基于欧式距离的模板匹配算法优源码化和实现(附源代码), 但是这个是个非常慢的过程,而且是单目标无旋转的实现,在实际应用中,这个基本没有啥实际的价值。
在工业应用场合,有着非常广泛使用场景的是多目标多角度的模板匹配(基本无缩放或轻微缩放),这方面实现的比较好的有halcon、海康、康耐视等,国内也有一些小单位有做研究,而且效果不错。在网络上其实也有比较多的文章谈到了多目标模板匹配,基本上都是基于Opencv实现,良心的说也谈到了一些核心技术,但是还是皮毛,基本都是一带而过,而且实现的效率也基本是没有什么实用价值的,可能是怕说多了别人学会了吧。
虽然在我的实现中,也参考了不少网络上的文章,但是大部分的细节还是靠的自己的思考和朋友的一些指导,为了尊重他人,我也不打算特别深入讲解我的实现,但是还是把一些具有一定深度的问题提出来,也算是回报网络吧。
1、概述
这里先提工业界最为常用,也是最为基本的模板匹配方式,基于NCC的灰度模板匹配。
NCC,全称为NormalizedCrosscorrelation,即归一化互相关系数, 在模板匹配中使用的非常非常广泛,也是众多模板匹配方法中非常耀眼的存在, 这个匹配的理论核心基础公式如下:
(1)
该方法也存在于Opencv的matchTemplate中,较之其他的CV提供的匹配方法,该算法对于光照、噪音等等的影响,稳定性更佳,也是halcon等商用软件内嵌的基于像素的模板匹配标准方法。
他的理论匹配度范围是[-1,1],为-1时表示2副图像的极性完全相反(原图和反色后的图),为1则表示两幅图完全一样。一般我们在计算NCC的时候都是取的绝对值,因此,通常NCC的取值为[0,1],值越大,表示两幅图像越相似。
实际编程实现时,千万不要直接用这个公式,如果你使用,那你离砸电脑已经不远了,请一定要相信我。
实际中,我们都用下面的式子来实现编码(不要问我里面的符号的意思,两个图来自不同的资料,里面的字母也不一样,但是要研究的这个的人都应该能看懂):
(2)
这个式子看上去更为复杂,但是实质上和公式(2)和公式(1)就是同一个东西。公式(2)我们可以把他拆解为7个部分。我们一1道来。
①、这个留到最后在说。
②、T代表的是模板,那么②对于固定的模板来说就是一个定值,在匹配前可以直接计算好,无需担忧耗时问题。
③、I表示的搜索图像中的和模板一样大的一个子块,很明显这个累加有多重方法可以快速的实现,比如比较原始的积分图技术,或者我的BoxBlur里的那种更为快速的实现,这一项也是和参数无关的。
④、第四项处理方式同②项,无需多言。
⑤、第五项完全同第二项,同时四和五项作为一个整体也可以提前计算好,不参与匹配过程的计算。
⑥、第六项处理方式同第三项,也无需多言。
⑦、第七项完全同第三项,直接使用。
前面的分析表明,第二至第七项要买可以作为常量提前计算好,要么就可以通过某种技术实现O(1)的快速计算,那么现在我们再回过头来在看第①项,他是模板图像和搜索图像同面积区域像素的一个卷积,这个是无法用某种优化技巧去实现和模板大小无关的快速实现的,注定了他就是NCC计算式中最为耗时的部分。
有人说卷积可以有FFT实现优化,没错,非常同意您的观点,但是,朋友,FFT虽然其第一个F代表了Fast,但是呢他在傅里叶的世界是快的,在我们模板匹配的空间内他受到了一种无形的压迫,在工业界还是无法接受的。
