图像描述——图像矩
1 矩
矩是概率与统计中的一个概念,是随机变量的一种数字特征。设 X为随机变量,C为常数,则E[(x−c)^k]称为X关于C点的k阶矩。比较重要的两种情况如下:
(1) c=0,这时a_k=E(X^k)称为X的k阶原点矩;
(2) c=E(X),这时μ_k=E[(X−EX)^k]称为X的k阶中心矩。F(x,y)的(p+q)阶原点矩为 :

一阶原点矩就是期望,一阶中心矩μ_1=0,二阶中心矩μ_2就是X的方差Var(X)。在统计学上,高于4阶的矩极少使用,μ_3可以去衡量分布是否有偏,μ_4可以衡量分布(密度)在均值矩阵的陡峭程度。
2 不变矩
图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(数据描述量)来描述整个图像,这组数据越简单越有代表性。良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中一个,矩是描述图像特征的算子,如今矩技术已广泛应用于图像检索和识别 、图像匹配 、图像重建 、数字压缩 、数字水印及运动图像序列分析等领域。常见的矩描述子可以分为以下几种:几何矩、正交矩、复数矩和旋转矩。从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等。
针对一幅图像,我们把像素的坐标看成是一个二维随机变量(X, Y),那么一副灰度图可以用二维灰度图密度函数来表示,因此可以用矩来描述灰度图像的特征。
不变矩(Invariant Moments)是一种高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性,由M.K.Hu在1961年首先提出。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。opencv中提供的API用来计算中心矩和Hu矩,它分为了两个函数:moments()函数用于计算中心矩,HuMoments函数用于由中心矩计算Hu矩。
3 原理
3.1原点矩
大小为MxN的数字图像f(x,y)的二维(p+q)阶原点矩定义为(离散化):

其中p,q=0,1,2,是整数,f(x,y)为坐标点(x,y)的灰度值。
零阶矩:
图像的原点矩表示的是图像灰度的总和

一阶矩:
图像的一阶矩m10和m01表示用来确定图像的灰度中心

二阶矩:
二阶矩有三个,m11 m02 m20,也成为惯性矩。它们可以确定物体的几个特性:
(1)二阶中心矩用来确定目标物体的主轴,长轴和短轴分别对应最大和最小的二阶中心矩。可以计算主轴方向角。
(2)图像椭圆:由一阶、二阶矩可以确定一个与原图像惯性等价的图像椭圆。所谓图像椭圆是一个与原图像的二阶矩及原图像的灰度总和均相等的均匀椭圆。使得主轴与图像的主轴方向重合,一边分析图像性质。

三阶矩及以上:对于三阶或三阶以上矩,使用图像在轴或轴上的投影比使用图像本身的描述更方便。
三阶矩:投影扭曲,描述了图像投影的扭曲程度。扭曲是一个经典统计量,用来衡量关于均值对称分布的偏差程度。
四阶矩:投影峰度,峰度是一个用来测量分布峰度的经典统计量。可以计算峰度系数。当峰度系数为0时,表示高斯分布;当峰度系数小于0时,表示平坦的少峰分布;当峰度系数大于0时,表示狭窄的多峰分布。

3.2 各阶矩的物理意义:
普通矩:
0阶矩(m00):目标区域的质量
1阶矩(m01,m10):目标区域的质心
2阶矩(m02,m11,m20):目标区域的旋转半径
3阶矩(m03,m12,m21,m30):目标区域的方位和斜度,反应目标的扭曲
但是目标区域往往伴随着空间变换(平移,尺度,旋转),所以需要在普通矩的基础上构造出具备不变性的矩组—hu矩。
3.3构造平移不变性–中心距
相应的(p+q)阶中心距定义为

式中p=0,1,2,和q=0,1,2,3,,,,。其中质心坐标为:

由于我们选择了以目标区域的质心为中心构建中心矩,那么矩的计算时永远是目标区域中的点相对于目标区域的质心,而与目标区域的位置无关,及具备了平移不变性。
3.4构造尺度不变性–归一化
为抵消尺度变化对中心矩的影响,利用零阶中心矩u00对各阶中心距进行归一化处理,得到归一化中心矩由ηpq表示:

其中p+q=2,3,4,。
由上文可知,零阶矩表示目标区域的质量(面积),那么如果目标区域的尺度发生变化(缩小2倍),显然其零阶中心矩也会相应变小,使得矩具备尺度不变性。
若将m00看做图像的灰度质量,则(i¯,j¯)为图像的质心坐标,那么中心矩μpq反映的是图像灰度相对于其灰度质心的分布情况,可以用几何矩来表示中心矩0~3阶中心矩与原点矩的关系如下:根据中心距的定义很容易计算出u10,u01=0

3.5 构造旋转不变性–Hu矩
由二阶矩和三阶矩可推出如下七个不变矩组,他们在图像平移,旋转和比例变化时保持不变:

3.6不变矩的应用过程一般包括:
a. 选择合适的不变矩类型;
b. 选择分类器(如神经网络、最短距离等);
c. 如果是神经网络分类器,则需要计算学习样例的不变矩去训练神经网络;
d. 计算待识别对象的不变矩,输入神经网络就可得到待识别对象的类型,或者计算待识别对象不变矩与类别对象不变矩之间的距离,选择最短距离的类别作为待识别对象的类别。
可以看出,不变矩作用主要目的是描述事物(图像)的特征。人眼识别图像的特征往往又表现为“求和”的形式,因此不变矩是对图像元素进行了积分操作。
5 其他常见的图像矩
连续正交矩:Zernike矩和Legendre矩
离散正交矩:Tchebichef矩、Krawtchouk矩、Hahn矩、Racah矩等。
虽然非正交矩形式简单 、计算快、易于实现,但抗噪性差、基函数非正交 ,且具有较大的信息冗余。连续正交矩的基函数正交,不仅其矩变换可逆 ,且易于图像重建 , 由于其各阶矩相互独立,故具有最小的信息冗余。其不足之处是该矩的基函数只在特定范围内是正交的。
6 程序:
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cvaux.h>
#include <iostream>
#include <string>
#include <strstream>
#include <iomanip>
#include <cmath>
using namespace std;
void imRotate(IplImage *src,IplImage *dst,double angle , CvPoint2D32f center,double scale = 1 );
int main()
{
time_t StartTime = clock();
IplImage *src = cvLoadImage("f:\\images\\test1.bmp",CV_LOAD_IMAGE_GRAYSCALE);
cvShowImage("src",src);
CvMemStorage *storage = cvCreateMemStorage();
CvSeq *contour = NULL;
CvRNG rng = cvRNG(-1);
while(1){
double scalar = cvRandReal(&rng)*0.8;
if(scalar < 0.3 )
continue;
double angle = cvRandReal(&rng)*360;
IplImage *dst = cvCreateImage(cvSize(src->width,src->height),8,1);
imRotate(src,dst,angle,cvPoint2D32f(src->width/2,src->height/2),scalar);
cvShowImage("dst",dst);
cvThreshold(dst,dst,100,255,CV_THRESH_BINARY);
cvFindContours(dst,storage,&contour);
CvMoments moments;
CvHuMoments huMoments;
cvMoments(dst,&moments,1);
cvGetHuMoments(&moments, &huMoments);
cout<<"("<<setprecision(3)<<dec<<scalar<<")"<<" ";
for(int i = 0;i<7;++i){
cout<<setiosflags(ios::scientific)<<setprecision(4)<<((double*)&huMoments)[i]<<' ';
}
cout<<endl;
cvReleaseImage(&dst);
cvClearSeq(contour);
if(cvWaitKey() == 27)
break;
}
time_t EndTime = clock();
cout<<double(EndTime - StartTime)/CLOCKS_PER_SEC<<endl;
}
void imRotate(IplImage *src, IplImage *dst,double angle , CvPoint2D32f center,double scale)
{
assert(src->width == dst->width && src->height == dst->height &&src->depth == dst->depth &&src->nChannels == dst->nChannels);
CvMat *mapMatrix = cvCreateMat(2,3,CV_32FC1);
cv2DRotationMatrix(center,angle,scale,mapMatrix); //旋转缩放为仿射变换,此处求变换矩阵
cvWarpAffine(src,dst,mapMatrix);
}
https://www.bilibili.com/video/BV1Zi4y1s7sm?from=search&seid=1488698993429939262