基于灰度值的匹配方法研究(三)

发布时间 2023-07-20 08:17:11作者: 兜尼完

这一篇文章讨论一些灰度匹配中的问题和新发现。目前主要有以下三个问题。

一、相似度计算

在本系列第一篇文章中用的相似度公式的分子中两项的乘积是取了绝对值的。这样它的取值范围就一定大于0。其实这个公式的分子可以不取绝对值,那它就可以化简了。此时它的取值范围是[-1,1]。这种化简方法来自于文章《【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........) - Imageshop - 博客园 (cnblogs.com)》。观察可知不取绝对值的相似度公式${ R \left(i,j \right) }$就是概率论中互相关系数公式。可以用互相关系数相关公式进行化简,化简后公式如下:

$${ R \left(i,j \right)=\frac{  \sum_{r=1}^{R}\sum_{c=1}^{C} S^{i,j}\left( r,c \right) T\left( r,c \right) - \overbrace{E\left( T \right)}^{P} \sum_{r=1}^{R}\sum_{c=1}^{C} S^{i,j}\left( r,c \right) }  { \sqrt{ \sum_{r=1}^{R}\sum_{c=1}^{C} \left[ S^{i,j}\left( r,c \right) \right]^{2} - \frac{1}{RC} \left[ \sum_{r=1}^{R}\sum_{c=1}^{C} S^{i,j}\left( r,c \right) \right]^{2} }  \underbrace{ \sqrt{ RC \left[ E \left( T^{2} \right) - E^{2} \left( T \right) \right] } }_{Q} } }$$

上式中的P和Q仅和模板有关,可以提前计算。可以看出来化简后少了一次求${ S^{i,j} }$平均值的循环,经过测试在普通C++代码下大约能提高一倍的效率。此外,少一次循环也更有利于使用SSE/AVX指令优化代码。但是在GPU加速的模式下效率没有明显变化。具体原因不清楚,可能是我不会优化GPU代码。

二、亚像素求精

在本系列第一篇文章中提到的亚像素求精方法是引自一篇硕士论文中的3×3×3点拟合法。但是这种方法在实际运用中会出问题。因为是最小二乘法拟合,所以尽管这27个点的中心点的相似度最大也无法保证拟合后的函数极值在这27个点的中心点附近,有时候甚至会跑出拟合范围[-1,1]外。亚像素求精的问题值得关注。

三、提高稳定性

一般而言,应当从生成模板方面入手,想一个更优的方法提取样本点。目前我还没有找到更好的方法。