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

发布时间 2023-07-09 10:02:12作者: 兜尼完

这在机器视觉领域是一个古老问题,已经被无数的人研究过,提出过各种匹配方案。在OpenCV里也有灰度匹配的函数,只可惜它不支持旋转,因此无法做实际的应用。今天在这里叙述一些我做这个算法的感悟。为了保守秘密,本系列文章可能只做流程上的描述与建议,和代码片段而不是完整的代码。

作为启蒙性文章,这里先说一下灰度匹配是做什么的。灰度匹配是用一个已知的图案作为模板,在运行时图像中查找定位这个模板,包括模板的位置角度等信息,可以用${ \left( x, y, \theta \right) }$表示。在机械手相关应用中它可以确定物体的位置。而在其它应用中可能只为了确定某个物体的数量或有无。如下图所示,在一个人像中定位眼睛的位置。

本文以NCC匹配方法为例叙述我的实现方法。首先像其他类型的匹配一样为了提高效率,要对模板和运行时图像做金字塔处理。另外,为了适应模板的旋转,不能把模板中的所有像素都用来做计算,那样速度慢而且旋转模板会在边缘外出现空白像素。我的做法是从中选择一部分像素点。考虑到随机或等距抽样可能会导致匹配时位置漂移,一个合适的策略是对模板分区,在每个分区中:

  • 如果这个分区有边缘则选择边缘最强的点和它附近的两个点;
  • 如果这个分区中没有边缘(梯度值普遍较小)则取此分区正中心的点和它附近的两个点。

设置分区的原因是尽可能让选择到的点均匀分布在模板的各个位置,避免点集中在某一个区域里。分区数量可以自定义,我设置的是25个分区。因此总共抽取25×3=75个像素点。

下面是根据上述方法实现的算法效果图。开发环境是VS2015、OpenCV430和Qt5.9,测试电脑配置是AMD A4-9125的CPU,测试用图是130万像素的。图中小窗口模板图里的蓝色的点就是选出来的匹配用的像素点:

经过测试此方法定位精度尚可,肉眼看不出来明显的偏差,且可以抵抗一些诸如模糊、少量噪声或其它类型的形变。