文章目录

  • 一、几何矩是什么?
    • 零阶矩
    • 一阶矩
    • 二阶矩
    • 三阶矩及以上
  • 二,中心矩
  • 三,Hu不变矩
  • 四, matlab代码


一、几何矩是什么?

几何矩是图片中对目标区域边界在空间域的分析方法之一,不同阶级的几何矩代表着图片不同的物理性质。与之相似的空间域分析方法还有方向链。

关于几何矩对图片的物理意义,可以把图片看做一块质量密度不均匀的薄板,则图像的灰度分布函数f(x,y)就是薄板在(x,y)位置上的密度。各阶矩的物理意义如下:

零阶矩

根据矩的定义,二维图像的灰度用v(i,j)表示,零阶矩m00表示为:
在这里插入图片描述
表示的是图像的质量,即图像灰度的总和。

一阶矩

在这里插入图片描述
图像的一阶矩m10和m01表示用来确定图像的灰度中心,
在这里插入图片描述

二阶矩

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

三阶矩及以上

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

值得注意的是,阶的级数越高,其物理意义越难解释,但在一定程度上也可以表征图片信息。一般来说,三阶矩及以上并不常用。

几何矩虽然能表征图片信息,但是当同一张图片发生平移,缩放,旋转,转置等操作时,图片的几何矩是发生变化的。但是,由于图片的本质内容没有变化,所以我们希望平移,缩放,旋转,转置等操作后的图片表征不变。显然,几何矩并不能满足要求。

二,中心矩

中心矩:构造平移不变性
由零阶原点矩和一阶原点矩,我们可以求得目标区域的质心坐标: 在这里插入图片描述
由求得的质心坐标,我们可以构造出中心矩:
在这里插入图片描述
由于我们选择了以目标区域的质心为中心构建中心矩,那么矩的计算时永远是目标区域中的点相对于目标区域的质心,而与目标区域的位置无关,及具备了平移不变性。

归一化中心矩:构造尺度不变性
为抵消尺度变化对中心矩的影响,利用零阶中心矩u00对各阶中心距进行归一化处理,得到归一化中心矩:
在这里插入图片描述
由上文可知,零阶矩表示目标区域的质量(面积),那么如果目标区域的尺度发生变化(缩小2倍),显然其零阶中心矩也会相应变小,使得矩具备尺度不变性。

归一化的中心矩可以消除平移和缩放带来的影响,但是不能消除旋转和转置带来的影响

三,Hu不变矩

hu矩:构造旋转不变性
利用二阶和三阶的中心矩可以导出下面7个不变矩组,它们在图像平移、旋转和比例变化时保持不变。
在这里插入图片描述

四, matlab代码

下面两张分别是代码中用到的图片shape1&shape2,不懂的欢迎留言。
shape1
shape2

%question 1 ************在Matlab环境中加载“ Shape1.bmp”并计算该形状的几何矩******************************************************************************
img = imread('E:\matlab DMP\Shape1.bmp');
image = double(img);

%计算图像的零阶矩和一阶几何矩
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



%计算图像的二阶矩和三阶矩
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+j*i*image(i,j);
          m30=m30+i^3*image(i,j);
          m12=m12+i*j^2*image(i,j);
          m21=m21+i^2*j*image(i,j);
          m03=m03+j^3*image(i,j);
      end
end

%question 2 ***********将此形状向右移动30个像素,并计算移动后的几何矩*******************************************************************************
se2=imtranslate(image,[30,0]);
figure
subplot(122);imshow(se2);title("after translate 30 pxle")
subplot(121); imshow(image);title("oragnal picture")

%计算平移后图像的零阶矩和一阶几何矩
M00=sum(sum(se2));

M10=0;
M01=0;
[row,col]=size(se2);
for i=1:row
     for j=1:col
          M10=M10+i*se2(i,j);
          M01=M01+j*se2(i,j);
     end
end



%计算平移后图像的二阶矩和三阶矩
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*se2(i,j);
          M02=M02+j^2*se2(i,j);
          M11=M11+j*i*se2(i,j);
          M30=M30+i^3*se2(i,j);
          M12=M12+i*j^2*se2(i,j);
          M21=M21+i^2*j*se2(i,j);
          M03=M03+j^3*se2(i,j);
      end
end

%question 3 ***********计算Shape1平移前后的的归一化中心矩*******************************************************************************
%计算图像的二阶中心距和三阶中心距
y00=m00;
y10=0;y01=0;

u10=m10/m00;
u01=m01/m00;

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;
%计算平移后图像的二阶中心距和三阶中心距
Y00=M00;
Y10=0;Y01=0;

U01=M01/M00;
U10=M10/M00;

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;
%question 4 ************计算Shape1旋转前后的的几何矩和中心矩******************************************************************************

img = imread('E:\matlab DMP\Shape1.bmp');
image = double(img);

%计算图像的零阶矩和一阶几何矩
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



%计算图像的二阶矩和三阶矩
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+j*i*image(i,j);
          m30=m30+i^3*image(i,j);
          m12=m12+i*j^2*image(i,j);
          m21=m21+i^2*j*image(i,j);
          m03=m03+j^3*image(i,j);
      end
end

 
se2=imrotate(image,90);
figure
subplot(122);imshow(se2);title("after translate 30 pxle")
subplot(121); imshow(image);title("oragnal picture")

%计算平移后图像的零阶矩和一阶几何矩
M00=sum(sum(se2));

M10=0;
M01=0;
[row,col]=size(se2);
for i=1:row
     for j=1:col
          M10=M10+i*se2(i,j);
          M01=M01+j*se2(i,j);
     end
end



%计算平移后图像的二阶矩和三阶矩
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*se2(i,j);
          M02=M02+j^2*se2(i,j);
          M11=M11+j*i*se2(i,j);
          M30=M30+i^3*se2(i,j);
          M12=M12+i*j^2*se2(i,j);
          M21=M21+i^2*j*se2(i,j);
          M03=M03+j^3*se2(i,j);
      end
end

 
%计算图像的二阶中心距和三阶中心距
y00=m00;
y10=0;y01=0;

u10=m10/m00;
u01=m01/m00;

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;
%计算平移后图像的二阶中心距和三阶中心距
Y00=M00;
Y10=0;Y01=0;

U01=M01/M00;
U10=M10/M00;

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;

%question 5 *************计算Shape1旋转前后的的不变矩*****************************************************************************
%计算图像的七个不变矩
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+n21)^2-(n21+n03)^2);

M1=[h1 h2 h3 h4 h5 h6 h7]; 

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+N21)^2-(N21+N03)^2);

M2=[H1 H2 H3 H4 H5 H6 H7]; 
%question 6 ************计算Shape1和Shape2的不变矩******************************************************************************

img = imread('E:\matlab DMP\Shape1.bmp');
image = double(img);

%计算图像的零阶矩和一阶几何矩
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



%计算图像的二阶矩和三阶矩
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+j*i*image(i,j);
          m30=m30+i^3*image(i,j);
          m12=m12+i*j^2*image(i,j);
          m21=m21+i^2*j*image(i,j);
          m03=m03+j^3*image(i,j);
      end
end

img = imread('E:\matlab DMP\Shape2.bmp');
se2 = double(img);
figure
subplot(122);imshow(se2);title("Shape2")
subplot(121); imshow(image);title("Shape1")

%计算平移后图像的零阶矩和一阶几何矩
M00=sum(sum(se2));

M10=0;
M01=0;
[row,col]=size(se2);
for i=1:row
     for j=1:col
          M10=M10+i*se2(i,j);
          M01=M01+j*se2(i,j);
     end
end



%计算平移后图像的二阶矩和三阶矩
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*se2(i,j);
          M02=M02+j^2*se2(i,j);
          M11=M11+j*i*se2(i,j);
          M30=M30+i^3*se2(i,j);
          M12=M12+i*j^2*se2(i,j);
          M21=M21+i^2*j*se2(i,j);
          M03=M03+j^3*se2(i,j);
      end
end

 
%计算图像的二阶中心距和三阶中心距
y00=m00;
y10=0;y01=0;

u10=m10/m00;
u01=m01/m00;

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;
%计算平移后图像的二阶中心距和三阶中心距
Y00=M00;
Y10=0;Y01=0;

U01=M01/M00;
U10=M10/M00;

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+n21)^2-(n21+n03)^2);

M1=[h1 h2 h3 h4 h5 h6 h7]; 

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+N21)^2-(N21+N03)^2);

M2=[H1 H2 H3 H4 H5 H6 H7];