图像处理之 _ 轮廓匹配

1. 引子

图像识别可通过轮廓,直方图等方式实现,像人脸识别这种复杂应用,实现它的方法很多,通常是基础方法的改进版与机器学习组合。

基于轮廓的识别,需要把图像拆分通道,寻找边缘,转换为轮廓(多边形逼近,特性概括等),然后进行轮廓匹配(图像与图像匹配,图像与模板匹配)。

程序员根据不同情境,选择适合图像抽象方法和匹配方法。

轮廓的匹配主要是解决大小,位置,旋转角度,精度不同图像间的匹配问题。方法包括轮廓矩,成对几何直方图,凸包和凸缺陷,等级匹配等等,下面以轮廓矩为例,看看它是如何实现的,同时也了解一下矩在图像处理中的应用(基于统计的方法)。

2. 是什么矩(moment)

数学定义:实函数相对于值 c 的 n 阶矩为

图片.png

从上述公式可以看到,它就是一个加了权重的积分,而权重是 (x-c)^n,其中 n 是阶数(n 阶矩),如果把它想成一个平面直角系中,c 是 x 轴上的一点,(x-c)^n 是各个 x 点相对于 c 点值的 n 次方。以下是个积分的图示,只要想象一下,它的每个小方块再乘上权重:(xi-c)^n 即可得到矩。

图片.png

轮廓处理中用到的矩,是它在统计学中的应用。

以上公式是一元的情况,扩展到图片所在的二元,想象我们有一个图像矩阵,经过了寻找边缘,转换轮廓之后,矩阵中每个值点 f(x,y) 的值或为 0(不是轮廓点),或为 1(是轮廓点),当 f(x,y) 为 0 时,该积分项也为 0,可以不计算,因此,对我们有意义的只有 f(x,y)=1 的 n 个点,即轮廓点。在后面公式中记为 I(x,y),x,y 为其在图中的坐标,c 点扩展到二元,可以视为轮廓的中心点,我们求得的所谓 n 阶中心矩,就如上述公式所示,积分的权重是轮廓上各点相对于中心位置 c 的 n 次方。

此时我们可以得到一些统计规律,比如:轮廓边界长度(零阶矩),x/y 方向上的均值(即质心,由一阶矩求得),方差(由二阶中心矩求得),形状特性(Hu 矩)

3. 常用的矩

1) 空间矩(spatial moment)

  1.         用途

最简单地轮廓比较,只能用于对比位置,大小,角度完全一致的轮廓。

  1.         公式
图片.png

mpq 表示图像的(p+q)阶矩,一般计算所有 3 阶的矩(p+q<=3)。其中 I(x,y) 是象素点 (x, y) 的值,一般是 1,n 是轮廓上点的个数,p 和 q 分别是 x 维度和 y 维度上的矩,即 m00,m10,m01…m03。

零阶矩 m00 是轮廓上点的简单累加,即轮廓上有多少个点。

一阶矩 m10,m01 分别是 x 和 y 方向上的累加

  1.         OpenCV 相关函数

cvContoursMoments()

cvGetSpatialMoment()

####2) 中心矩(central moment)

  1.         用途

xavg 和 yavg 由一阶矩和零阶矩的比值算出(见公式),它是重心坐标,中心矩即是根据 x,y 与重心的相对位置求取的矩,它使得结果与图像相对于 x,y 轴的位置无关(与平移无关)。

  1.         公式
图片.png
  1.         OpenCV 相关函数

cvMoments()cvGetCentralMoment()

####3) 归一化的中心矩

  1.         用途

使用 m00 的幂对中心矩归一化,使得结果与图像大小无关

  1.         公式
图片.png
  1.         OpenCV 相关函数

cvGetNormalizedCentralMoment()

####4) Hu 不变矩

  1.         用途

Hu 矩是归一化中心矩的线性组合,它对于缩放,旋转,镜像映射具有不变性。

  1.         公式
图片.png
  1.         OpenCV 相关函数

cvGetHuMents()cvMatchShapes()

##4. 示例代码

opencv/samples/cpp/tutorial_code/ShapeDescriptors/moments_demo.cpp