图像的矩:Hu矩

参考

  • 【图像算法】图像特征:几何不变矩–Hu矩 - SkySeraph - 博客园: https://www.cnblogs.com/skyseraph/archive/2011/07/19/2110183.html
  • 图像的矩特征 - ☆Ronny丶 - 博客园: https://www.cnblogs.com/ronny/p/3985810.html
  • 《图像处理、分析与机器视觉》
  • 《数字图像处理》冈萨雷斯–第十一章-不变矩

目录

  • 一、矩的概念
  • 二、Hu矩
    • 2.1 (p+q)阶不变矩的定义
    • 2.2 归一化中心距
    • 2.3 Hu矩定义
    • 2.4 Hu矩计算代码

一、矩的概念

图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰。图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个。

针对于一幅图像,我们把像素的坐标看成是一个二维随机变量(X,Y)(X,Y),那么一幅灰度图像可以用二维灰度密度函数来表示,因此可以用矩来描述灰度图像的特征。

不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。下面主要介绍这两种矩特征的算法原理与实现。

二、Hu矩

2.1 (p+q)阶不变矩的定义

对于灰度分布为 f ( x , y ) f(x,y) f(x,y)的图像,其 ( p + q ) (p+q) (p+q)阶矩定义为:

m p q = ∬ x p y q f ( x , y ) d x d y p , q = 0 , 1 , 2 , ⋯ m_{pq}=\iint x^py^qf(x,y)dxdy\qquad p,q=0,1,2,\cdots mpq=xpyqf(x,y)dxdyp,q=0,1,2,

( p + q ) (p+q) (p+q)阶中心矩定义为:

μ p q = ∬ ( x − x 0 ) p ( y = y 0 ) q f ( x , y ) d x d y \mu_{pq}=\iint(x-x_0)^p(y=y_0)^qf(x,y)dxdy μpq=(xx0)p(y=y0)qf(x,y)dxdy

其中,矩心为:

x 0 = m 10 m 00 , y 0 = m 01 m 00 x_0=\frac {m_{10}}{m_{00}},y_0=\frac {m_{01}}{m_{00}} x0=m00m10,y0=m00m01

由于数字图像属于离散化数据,离散状态下, f ( x , y ) f(x,y) f(x,y) ( p + q ) (p+q) (p+q)阶普通矩和中心矩的公式如下:

m p q = ∑ x = 1 M ∑ y = 1 N x p y q f ( x , y ) m_{pq}=\sum_{x=1}^M\sum_{y=1}^Nx^py^qf(x,y) mpq=x=1My=1Nxpyqf(x,y)

μ p q = ∑ x = 1 M ∑ y = 1 N ( x − x 0 ) p ( y − y 0 ) q f ( x , y ) 其中 p , q = 0 , 1 , 2 , ⋯ \mu_{pq}=\sum_{x=1}^M\sum_{y=1}^N(x-x_0)^p(y-y_0)^qf(x,y)\quad\text{其中}\quad p,q=0,1,2,\cdots μpq=x=1My=1N(xx0)p(yy0)qf(x,y)其中p,q=0,1,2,

离散化后的矩心x0与y0的计算方法同连续状态下的计算公式。

p、q即在x、y这两个像素位置上的多少次方。在p、q不为0时,求 m p q m_{pq} mpq可以看作 x的p次方 与 y的q次方 作为权重叠加到当前x、y位置上的灰度值,然后累加。当求 m 00 m_{00} m00时,可知仅为图像的灰度值进行累加。

2.2 归一化中心距

当图像发生变化,如平移、旋转等, m p q m_{pq} mpq也发生变化。而由于 μ p q \mu_{pq} μpq式与中心有关,其对平移不敏感,但依旧对旋转敏感。为了解决这个问题,这里提出归一化中心矩

y p q = μ p q μ 00 r y_{pq}=\frac {\mu_{pq}}{\mu_{00}^r} ypq=μ00rμpq

式中: r = p + q + 2 2 p + q = 2 , 3 , ⋯ r=\frac {p+q+2}{2} \quad p+q=2,3,\cdots r=2p+q+2p+q=2,3,

归一化中心矩使用的是中心矩进行的计算。可以注意到,归一化中心矩计算 y p q y_{pq} ypq时使用的 μ 00 \mu_{00} μ00从数值上来看,就等同于 m 00 m_{00} m00

2.3 Hu矩定义

Hu利用二阶和三阶中心矩(即 p + q = 2 , 3 p+q = 2,3 p+q=2,3)构造了7个不变矩 I 1 ∼ I 7 I_1\sim I_7 I1I7,这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变性,它们在连续图像条件下可以保持平移、缩放和旋转不变。具体定义如下:

{ I 1 = y 20 + y 02 I 2 = ( y 20 − y 02 ) 2 + 4 y 11 2 I 3 = ( y 30 − 3 y 12 ) 2 + ( 3 y 21 − y 03 ) 2 I 4 = ( y 30 + y 12 ) 2 + ( y 21 + y 03 ) 2 I 5 = ( y 30 − 3 y 12 ) ( y 30 + y 12 ) [ ( y 30 + y 12 ) 2 − 3 ( y 21 + y 03 ) 2 ] + ( 3 y 21 − y 03 ) ( y 21 + y 03 ) [ 3 ( y 30 + y 12 ) 2 − ( y 21 + y 03 ) 2 ] I 6 = ( y 20 − y 02 ) [ ( y 30 + y 12 ) 2 − ( y 21 + y 03 ) 2 ] + 4 y 11 ( y 30 + y 12 ) ( y 21 + y 03 ) I 7 = ( 3 y 21 − y 03 ) ( y 30 + y 12 ) [ ( y 30 + y 12 ) 2 − 3 ( y 21 + y 03 ) 2 ] − ( y 30 − 3 y 12 ) ( y 21 + y 03 ) [ 3 ( y 30 + y 12 ) 2 − ( y 21 + y 03 ) 2 ] \begin{cases} I_1 = y_{20}+y_{02}\\\\ I_2 = (y_{20}-y_{02})^2+4y_{11}^2\\\\ I_3 = (y_{30}-3y_{12})^2+(3y_{21}-y_{03})^2\\\\ I_4 = (y_{30}+y_{12})^2+(y_{21}+y_{03})^2\\\\ I_5=(y_{30}-3y_{12})(y_{30}+y_{12})[(y_{30}+y_{12})^2-3(y_{21}+y_{03})^2]+(3y_{21}-y_{03})(y_{21}+y_{03})[3(y_{30}+y_{12})^2-(y_{21}+y_{03})^2]\\\\ I_6=(y_{20}-y_{02})[(y_{30}+y_{12})^2-(y_{21}+y_{03})^2]+4y_{11}(y_{30}+y_{12})(y_{21}+y_{03})\\\\ I_7=(3y_{21}-y_{03})(y_{30}+y_{12})[(y_{30}+y_{12})^2-3(y_{21}+y_{03})^2]-(y_{30}-3y_{12})(y_{21}+y_{03})[3(y_{30}+y_{12})^2-(y_{21}+y_{03})^2] \end{cases} I1=y20+y02I2=(y20y02)2+4y112I3=(y303y12)2+(3y21y03)2I4=(y30+y12)2+(y21+y03)2I5=(y303y12)(y30+y12)[(y30+y12)23(y21+y03)2]+(3y21y03)(y21+y03)[3(y30+y12)2(y21+y03)2]I6=(y20y02)[(y30+y12)2(y21+y03)2]+4y11(y30+y12)(y21+y03)I7=(3y21y03)(y30+y12)[(y30+y12)23(y21+y03)2](y303y12)(y21+y03)[3(y30+y12)2(y21+y03)2]

2.4 Hu矩计算代码

参考自:【图像算法】图像特征:几何不变矩–Hu矩 - SkySeraph - 博客园,修正了部分格式问题与变量名,方便对照上面进行查看。

double I[7] = {0};        //HU不变矩
bool HuMoment(IplImage* img)
{
    int bmpWidth = img->width;
    int bmpHeight = img->height;
    int bmpStep = img->widthStep; 
    int bmpChannels = img->nChannels;
    uchar* pBmpBuf = (uchar*)img->imageData;

    double u00=0,u11=0,u20=0,u02=0,u30=0,u03=0,u12=0,u21=0;     //中心矩 
    double x0=0,y0=0;                                           //计算中心距时所使用的临时变量(x-x') 
    double y20=0,y02=0,y11=0,y30=0,y03=0,y12=0,y21=0;           //规范化后的中心矩
    double t1=0,t2=0,t3=0,t4=0,t5=0;                            //临时变量, 
    int center_x0=0,center_y0=0;                                //矩心 
    int i,j;                                                    //循环变量

    //  获得图像的区域重心(普通矩)
    double m10=0,m01=0,m00=0;                                   //0阶矩和1阶矩  
    for(j=0;j<bmpHeight;j++)//y
    {
        for(i=0;i<bmpWidth;i++)//x
        {
            m10+=i*pBmpBuf[j*bmpStep+i];
            m01+=j*pBmpBuf[j*bmpStep+i];
            m00+=pBmpBuf[j*bmpStep+i];
        }
    }
    center_x0=(int)(m10/m00+0.5);
    center_y0=(int)(m01/m00+0.5);

    //  计算二阶、三阶矩(中心矩)
    u00=m00;                        //归一化中心矩计算时使用的u00从数值上来看,就等同于m00。
    for(j=0;j<bmpHeight;j++) 
    {
        for(i=0;i<bmpWidth;i++)//x 
        { 
            x0=(i-center_x0); 
            y0=(j-center_x0); 
            u11+=x0*y0*pBmpBuf[j*bmpStep+i]; 
            u20+=x0*x0*pBmpBuf[j*bmpStep+i]; 
            u02+=y0*y0*pBmpBuf[j*bmpStep+i]; 
            u03+=y0*y0*y0*pBmpBuf[j*bmpStep+i];
            u30+=x0*x0*x0*pBmpBuf[j*bmpStep+i]; 
            u12+=x0*y0*y0*pBmpBuf[j*bmpStep+i]; 
            u21+=x0*x0*y0*pBmpBuf[j*bmpStep+i]; 
        } 
    } 

    //  计算规范化后的中心矩: uij/pow(u00,((i+j+2)/2) , 而u00 = m00,故直接用m00
    y20=u20/pow(m00,2); 
    y02=u02/pow(m00,2); 
    y11=u11/pow(m00,2);
    y30=u30/pow(m00,2.5); 
    y03=u03/pow(m00,2.5);
    y12=u12/pow(m00,2.5); 
    y21=u21/pow(m00,2.5);

    //  计算中间变量
    t1=(y20-y02); 
    t2=(y30-3*y12); 
    t3=(3*y21-y03); 
    t4=(y30+y12);
    t5=(y21+y03);

    //  计算不变矩 
    I[0]=y20+y02; 
    I[1]=t1*t1+4*y11*y11; 
    I[2]=t2*t2+t3*t3; 
    I[3]=t4*t4+t5*t5;
    I[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5); 
    I[5]=t1*(t4*t4-t5*t5)+4*y11*t4*t5;
    I[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5);

    return true;
}

你可能感兴趣的:(图像处理)