OpenCV4学习笔记(23)——几何矩、中心矩、归一化矩和Hu矩的计算,以及基于Hu矩的轮廓匹配

上次的笔记中,整理记录了有关轮廓发现及轮廓信息提取的一部分内容,同时还记录了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值