在上次的笔记中,整理记录了有关轮廓发现及轮廓信息提取的一部分内容,同时还记录了Hu矩的计算方式,今天就来记录一下Hu矩的一个应用——轮廓匹配。
在《OpenCV学习笔记(19)——模板匹配》中,我们提到了使用模板匹配来实现对图像中的目标物体进行寻找的方法,但是由于模板匹配的工作条件比较苛刻,而且当模板和目标物体的大小或角度出现偏差时就无法达到比较好的效果,所以模板匹配这种方法只能作为一种入门级别的模式识别方法。
今天我们先了解一下图像的各种矩及其计算方法,然后使用基于Hu矩的轮廓匹配来实现对图像中目标物体的寻找。
之前我们通过moment()
求得了轮廓的几何矩、中心距和归一化矩,然后使用轮廓的x、y方向的两个一阶几何矩和零阶几何矩来求取轮廓的质心坐标,而今天要计算的Hu矩,也是通过几何矩来进行计算的。
首先一起了解一下图像的各种矩是怎么得来的,以及这些矩有什么用处。
几何矩:假如一幅图像的坐标点是(x,y),用行列来表示的话就是(col,row),其灰度值是f(x,y),那么该图像的(p+q)阶几何矩mpq可以用下面这段代码来计算,其中height、width分别为图像的高和宽。
int p, q;
int mpq = 0;
for(int row = 0; row < height; row++)
{
for(int col = 0; col < width; col++)
{
mpq += pow(col, p) * pow(row, q) * f(x , y);
}
}
当使用不同的p和q进行计算后,就能得到不同阶的几何矩,而不同阶几何矩的含义如下:
零阶矩(m00):与图像或某个轮廓的面积相关;
一阶矩(m01,m10):与图像或某个轮廓的质心相关;
二阶矩(m02,m11,m20):与图像或某个轮廓的旋转半径相关;
三阶矩(m03,m12,m21,m30):与图像或某个轮廓的斜度或扭曲程度相关。
可见几何矩是与图像息息相关的,当图像的尺寸或者角度发生变化时,其几何矩也会随之变化,也就是说几何矩不具有空间不变性、尺度不变性和旋转不变性,所以几何矩难以用来表示一幅图像的特征。
那么就需要做进一步改进,利用之前求得的质心坐标来计算图像的( p+q )阶中心距mupq,可以用以下代码计算,其中质心坐标为(x0,y0):
int p, q;
//求取一阶几何矩和零阶几何矩
int m10 = 0;
int m01 = 0;
int m00 = 0;
for(int row = 0; row < height; row++)
{
for(int col = 0; col < width; col++)
{
m10 += pow(col, 1) * pow(row, 0) * f(x , y);
m01 += pow(col, 0) * pow(row