1. 引子
图像识别可通过轮廓,直方图等方式实现,像人脸识别这种复杂应用,实现它的方法很多,通常是基础方法的改进版与机器学习组合。
基于轮廓的识别,需要把图像拆分通道,寻找边缘,转换为轮廓(多边形逼近,特性概括等),然后进行轮廓匹配(图像与图像匹配,图像与模板匹配)。
程序员根据不同情境,选择适合图像抽象方法和匹配方法。
轮廓的匹配主要是解决大小,位置,旋转角度,精度不同图像间的匹配问题。方法包括轮廓矩,成对几何直方图,凸包和凸缺陷,等级匹配等等,下面以轮廓矩为例,看看它是如何实现的,同时也了解一下矩在图像处理中的应用(基于统计的方法)。
2. 是什么矩(moment)
数学定义:实函数相对于值c的n阶矩为
从上述公式可以看到,它就是一个加了权重的积分,而权重是(x-c)n,其中n是阶数(n阶矩),如果把它想成一个平面直角系中,c是x轴上的一点,(x-c)n是各个x点相对于c点值的n次方。以下是个积分的图示,只要想象一下,它的每个小方块再乘上权重:(xi-c)^n即可得到矩。
轮廓处理中用到的矩,是它在统计学中的应用。
以上公式是一元的情况,扩展到图片所在的二元,想象我们有一个图像矩阵,经过了寻找边缘,转换轮廓之后,矩阵中每个值点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)
i. 用途
最简单地轮廓比较,只能用于对比位置,大小,角度完全一致的轮廓。
ii. 公式
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方向上的累加
iii. OpenCV相关函数
cvContoursMoments()
cvGetSpatialMoment()
2) 中心矩(central moment)
i. 用途
xavg和yavg由一阶矩和零阶矩的比值算出(见公式),它是重心坐标,中心矩即是根据x,y与重心的相对位置求取的矩,它使得结果与图像相对于x,y轴的位置无关(与平移无关)。
ii. 公式
iii. OpenCV相关函数
cvMoments()cvGetCentralMoment()
3) 归一化的中心矩
i. 用途
使用m00的幂对中心矩归一化,使得结果与图像大小无关
ii. 公式
iii. OpenCV相关函数
cvGetNormalizedCentralMoment()
4) Hu不变矩
i. 用途
Hu矩是归一化中心矩的线性组合,它对于缩放,旋转,镜像映射具有不变性。
ii. 公式
iii. OpenCV相关函数
cvGetHuMents()cvMatchShapes()
4. 示例代码
opencv/samples/cpp/tutorial_code/ShapeDescriptors/moments_demo.cpp