1. 矩的概念
图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰。图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个。
矩是概率与统计中的一个概念,是随机变量的一种数字特征。设为X随机变量,𝑐为常数,𝑘为正整数。则量𝐸[(𝑥−𝑐)𝑘]称为𝑋关于𝑐点的𝑘阶矩。
比较重要的有两种情况:
-
𝑘阶原点矩
-
𝑘阶中心矩。
一阶原点矩就是期望。一阶中心矩𝜇4可以去衡量分布(密度)在均值附近的陡峭程度如何。
针对于一幅图像,我们把像素的坐标看成是一个二维随机变量(𝑋,𝑌),那么一幅灰度图像可以用二维灰度密度函数来表示,因此可以用矩来描述灰度图像的特征。
不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。下面主要介绍这两种矩特征的算法原理与实现。
2. Hu矩
一幅𝜇𝑝𝑞为:
𝑚𝑝𝑞=∑𝑖=1𝑀∑𝑗=1𝑁𝑖𝑝𝑗𝑞𝑓(𝑖,𝑗)
𝜇𝑝𝑞=∑𝑖=1𝑀∑𝑗=1𝑁(𝑖−𝑖¯)𝑝(𝑗−𝑗¯)𝑞𝑓(𝑖,𝑗)
其中𝑖¯=𝑚10/𝑚00,𝑗¯=𝑚01/𝑚00
若将𝜇𝑝𝑎<msub>反映的是图像灰度相对于其灰度质心的分布情况。可以用几何矩来表示中心矩,0~3阶中心矩与几何矩的关系如下:
𝜇00=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)0(𝑗−𝑗¯)0𝑓(𝑖,𝑗)=𝑚00
𝜇10=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)1(𝑗−𝑗¯)0𝑓(𝑖,𝑗)=0
𝜇01=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)0(𝑗−𝑗¯)1𝑓(𝑖,𝑗)=0
𝜇11=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)1(𝑗−𝑗¯)1𝑓(𝑖,𝑗)=𝑚11−𝑦¯𝑚10
𝜇20=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)2(𝑗−𝑗¯)0𝑓(𝑖,𝑗)=𝑚20−𝑦¯𝑚01
𝜇02=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)0(𝑗−𝑗¯)2𝑓(𝑖,𝑗)=𝑚02−𝑦¯𝑚01
𝜇30=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)3(𝑗−𝑗¯)0𝑓(𝑖,𝑗)=𝑚30−2𝑥¯𝑚20+2𝑥¯2𝑚10
𝜇12=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)1(𝑗−𝑗¯)2𝑓(𝑖,𝑗)=𝑚12−2𝑦¯𝑚11−𝑥¯𝑚02+2𝑦¯2𝑚10
𝜇21=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)2(𝑗−𝑗¯)1𝑓(𝑖,𝑗)=𝑚21−2𝑥¯𝑚11−𝑦¯𝑚20+2𝑥¯2𝑚01
𝜇03=∑𝑀𝑖=1∑𝑁𝑗=1(𝑖−𝑖¯)0(𝑗−𝑗¯)3𝑓(𝑖,𝑗)=𝑚03−2𝑦¯𝑚02+2𝑦¯2𝑚01
为了消除图像比例变化带来的影响,定义规格化中心矩如下:
𝜂𝑝𝑞=𝜇𝑝𝑎𝜇𝛾00,(𝛾=𝑝+𝑞2,𝑝+𝑞=2,3,…)
利用二阶和三阶规格中心矩可以导出下面7个不变矩组(Φ1 Φ7),它们在图像平移、旋转和比例变化时保持不变。
Φ1=𝜂20+𝜂02
Φ2=(𝜂20−𝜂02)2+4𝜂211
Φ3=(𝜂20−3𝜂12)2+3(𝜂21−𝜂03)2
Φ4=(𝜂30+𝜂12)2+(𝜂21+𝜂03)2
Φ5=(𝜂30+3𝜂12)(𝜂30+𝜂12)[(𝜂30+𝜂12)2−3(𝜂21+𝜂03)2]+(3𝜂21−𝜂03)(𝜂21+𝜂03)[3(𝜂30+𝜂12)2−(𝜂21+𝜂03)2]
Φ6=(𝜂20−𝜂02)[(𝜂30+𝜂12)2−(𝜂21+𝜂03)2]+4𝜂11(𝜂30+𝜂12)(𝜂21+𝜂03)
Φ7=(3𝜂21−𝜂03)(𝜂30+𝜂12)[(𝜂30+𝜂12)2−3(𝜂21+𝜂03)2]+]+(3𝜂12−𝜂30)(𝜂21+𝜂03)[3(𝜂30+𝜂12)2−(𝜂21+𝜂03)2]
3. 利用OpenCV计算Hu矩
opencv里对Hu矩的计算有直接的API,它分为了两个函数:moments()函数用于计算中心矩,HuMoments函数用于由中心矩计算Hu矩。
Moments moments(InputArray array, bool binaryImage=false )
参数说明
- 输入参数:array是一幅单通道,8-bits的图像,或一个二维浮点数组(Point of Point2f)。binaryImage用来指示输出图像是否为一幅二值图像,如果是二值图像,则图像中所有非0像素看作为1进行计算。
- 输出参数:moments是一个类:
里面保存了图像的2阶与3阶中心矩的值。
参数说明:
- 输入参数:moments即为上面一个函数计算得到的moments类型。
- 输出参数:hu是一个含有7个数的数组。
{
Mat image = imread(argv[1]);
cvtColor(image, image, CV_BGR2GRAY);
Moments mts = moments(image); double hu[7];
HuMoments(mts, hu); for (int i=0; i<7; i++)
{
cout << log(abs(hu[i])) <<endl;
} return 0;
}</pre>
上面代码中,最终输出的值为𝑙𝑜𝑔|Φ𝑖|
我们分别计算一幅图像在,旋转,噪声与模糊时的Hu矩。
[图片上传失败...(image-bba0ed-1650266548197)] [图片上传失败...(image-abbff1-1650266548197)] [图片上传失败...(image-eb3c8f-1650266548197)] [图片上传失败...(image-9fb3c3-1650266548197)]
| 类别 | 𝑙𝑜𝑔|Φ7| |
| 原图 | -6.76181 | -19.1286 | -23.7441 | -26.776 | -51.7618 | -35.8491 | -51.534 |
| 旋转 | -6.72102 | -19.0844 | -23.5756 | -25.9122 | -51.4619 | -35.4595 | -50.7674 |
| 加放噪点 | -6.76086 | -19.1255 | -23.7611 | -26.3228 | -51.5056 | -35.895 | -51.6321 |
| 模糊 | -6.76183 | -19.1295 | -23.7451 | -26.2767 | -51.765 | -35.8484 | -51.5307 |
5. 总结
不变矩的应用过程一般包括:
- 选择合适的不变矩类型;
- 选择分类器(如神经网络、最短距离等);
- 如果是神经网络分类器,则需要计算学习样例的不变矩去训练神经网络;
- 计算待识别对象的不变矩,输入神经网络就可得到待识别对象的类型,或者计算待识别对象不变矩与类别对象不变矩之间的距离,选择最短距离的类别作为待识别对象的类别。
可以看出,不变矩作用主要目的是描述事物(图像)的特征。人眼识别图像的特征往往又表现为“求和”的形式,因此不变矩是对图像元素进行了积分操作。
不变矩能够描述图像整体特征就是因为它具有平移不变形、比例不变性和旋转不变性等性质。
然而,另一方面图像的各阶不变矩究竟代表的什么特征很难进行直观的物理解释。














网友评论