图像的矩可以反应,一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。由二阶矩和三阶矩可以导出一组共七个不变矩。不变矩是图像的统计特性,满足平移、伸缩、旋转均不变的不变性,在图像识别领域得到了广泛的应用。
1.矩的定义
矩本身是概率与统计中的概念,其本质是数学期望。
对二维离散函数f(x,y),其(j+k)阶矩可以表示为:
m
(
j
,
k
)
=
∑
x
=
0
N
−
1
∑
y
=
0
M
−
1
x
j
y
k
f
(
x
,
y
)
m\left ( j,k \right )=\sum_{x=0}^{N-1}\sum_{y=0}^{M-1}x^{j}y^{k}f\left ( x,y \right )
m(j,k)=∑x=0N−1∑y=0M−1xjykf(x,y)。其中参数(j+k)为矩的阶次,如果只关心目标形状,可是目标区域为1,背景区域为0,这样零阶矩就可以表示目标的面积。
2.质心坐标及中心矩
m10指的是目标区域上所有x坐标的总和,m01指的是目标区域上所有y坐标的总和,这样二值图像中的质心坐标为:
为了消除原点矩对平移旋转的变化,把坐标原点平移到质心坐标位置,从而得到中心矩为:
中心矩和原点矩之间有一定的关系,其三阶以内的关系如下:
3.不变矩
利用三阶以内的归一化中心矩可以得到不变矩。
其MATLAB实现代码如下:
function inv_m7 = invariable_moment(in_image)
% 功能:计算图像的Hu的七个不变矩
% 输入:in_image-RGB图像
% 输出:inv_m7-七个不变矩
% 将输入的RGB图像转换为灰度图像
% image=rgb2gray(in_image);
%将图像矩阵的数据类型转换成双精度型
image=double(in_image);
%%%=================计算 、 、 =========================
%计算灰度图像的零阶几何矩
m00=sum(sum(image));
m10=0;
m01=0;
[row,col]=size(image);
for i=1:row
for j=1:col
m10=m10+i*image(i,j);
m01=m01+j*image(i,j);
end
end
%%%=================计算 、 ================================
u10=m10/m00;
u01=m01/m00;
%%%=================计算图像的二阶几何矩、三阶几何矩============
m20 = 0;m02 = 0;m11 = 0;m30 = 0;m12 = 0;m21 = 0;m03 = 0;
for i=1:row
for j=1:col
m20=m20+i^2*image(i,j);
m02=m02+j^2*image(i,j);
m11=m11+i*j*image(i,j);
m30=m30+i^3*image(i,j);
m03=m03+j^3*image(i,j);
m12=m12+i*j^2*image(i,j);
m21=m21+i^2*j*image(i,j);
end
end
%%%=================计算图像的二阶中心矩、三阶中心矩============
y00=m00;
y10=0;
y01=0;
y11=m11-u01*m10;
y20=m20-u10*m10;
y02=m02-u01*m01;
y30=m30-3*u10*m20+2*u10^2*m10;
y12=m12-2*u01*m11-u10*m02+2*u01^2*m10;
y21=m21-2*u10*m11-u01*m20+2*u10^2*m01;
y03=m03-3*u01*m02+2*u01^2*m01;
%%%=================计算图像的归格化中心矩====================
n20=y20/m00^2;
n02=y02/m00^2;
n11=y11/m00^2;
n30=y30/m00^2.5;
n03=y03/m00^2.5;
n12=y12/m00^2.5;
n21=y21/m00^2.5;
%%%=================计算图像的七个不变矩======================
h1 = n20 + n02;
h2 = (n20-n02)^2 + 4*(n11)^2;
h3 = (n30-3*n12)^2 + (3*n21-n03)^2;
h4 = (n30+n12)^2 + (n21+n03)^2;
h5=(n30-3*n12)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n21-n03)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
h6 = (n20-n02)*((n30+n12)^2-(n21+n03)^2)+4*n11*(n30+n12)*(n21+n03);
h7=(3*n21-n03)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n12-n30)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
inv_m7= [h1 h2 h3 h4 h5 h6 h7];