MATLAB:图像的几何矩,中心矩,Hu不变矩(含代码)

姓名:许力文    学号:21021210869    学院 电子工程学院

转载自:https://blog.csdn.net/qq_39297053/article/details/116677813

一、几何矩是什么?

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

关于几何矩对图片的物理意义,可以把图片看做一块质量密度不均匀的薄板,则图像的灰度分布函数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。



%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];

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容