【OpenCV基础】第二十九课:图像矩

图像矩,Hu矩,几何矩,中心矩,归一化中心矩,cv::moments,cv::HuMoments,cv::contourArea,cv::arcLength

Posted by x-jeff on February 19, 2022

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.图像矩

矩是概率与统计中的一个概念,是随机变量的一种数字特征。详细解释请见:随机变量的矩

图像的矩(image moments)主要表征了图像区域的几何特征,又称为几何矩,由于其具有旋转、平移、尺度等特性的不变特征,所以又称其为不变矩。

M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。本文主要介绍Hu矩。

2.Hu矩

一幅$M\times N$的数字图像$f(i,j)$,其$p+q$阶几何矩$m_{pq}$和中心矩$\mu_{pq}$为:

\[m_{pq}=\sum^M_{i=1} \sum^N_{j=1} i^p j^q f(i,j)\] \[\mu_{pq}=\sum^M_{i=1} \sum^N_{j=1} (i-\bar{i})^p (j-\bar{j})^q f(i,j)\]

其中$f(i,j)$为图像在坐标点$(i,j)$处的灰度值。且有:

\[\bar{i}=\frac{m_{10}}{m_{00}}, \bar{j}=\frac{m_{01}}{m_{00}}\]

若将$m_{00}$看作是图像的灰度质量,则$(\bar{i},\bar{j})$为图像的质心坐标,那么中心矩$\mu_{pq}$反映的是图像灰度相对于其灰度质心的分布情况。可以用几何矩来表示中心矩,0~3阶中心矩与几何矩的关系如下:

\[\mu_{00} = m_{00}\] \[\mu_{10} = 0\] \[\mu_{01} = 0\] \[\mu_{11}=m_{11}-\bar{y} m_{10}\] \[\mu_{20}=m_{20}-\bar{y} m_{01}\] \[\mu_{02}=m_{02}-\bar{y} m_{01}\] \[\mu_{30}=m_{30}-2\bar{x}m_{20}+2\bar{x}^2 m_{10}\] \[\mu_{12}=m_{12}-2\bar{y}m_{11}-\bar{x}m_{02}+2\bar{y}^2m_{10}\] \[\mu_{21}=m_{21}-2\bar{x}m_{11}-\bar{y}m_{20}+2\bar{x}^2m_{01}\] \[\mu_{03}=m_{03} - 2\bar{y}m_{02} + 2\bar{y}^2 m_{01}\]

为了抵消尺度变化对中心矩的影响,利用0阶中心矩$\mu_{00}$对各阶中心矩进行归一化处理,得到归一化中心矩

\[\eta_{pq} = \frac{\mu_{pq}}{\mu_{00}^{\gamma}}, \ (\gamma=\frac{p+q}{2},p+q=2,3,...)\]

利用二阶和三阶归一化中心矩可以导出下面7个不变矩组,它们在图像平移、旋转和比例变化时保持不变:

\[\Phi_1=\eta_{20}+\eta_{02}\] \[\Phi_2=(\eta_{20}-\eta_{02})^2+4\eta_{11}^2\] \[\Phi_3=(\eta_{20}-3\eta_{12})^2+3(\eta_{21}-\eta_{03})^2\] \[\Phi_4=(\eta_{30}+\eta_{12})^2+(\eta_{21}+\eta_{03})^2\] \[\Phi_5=(\eta_{30}+3\eta_{12})(\eta_{30}+\eta_{12})[(\eta_{30}+\eta_{12})^2-3(\eta_{21}+\eta_{03})^2]+(3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^2-(\eta_{21}+\eta_{03})^2]\] \[\Phi_6=(\eta_{20}-\eta_{02})[(\eta_{30}+\eta_{12})^2 - (\eta_{21}+\eta_{03})^2]+4\eta_{11}(\eta_{30}+\eta_{12})(\eta_{21}+\eta_{03})\] \[\Phi_7=(3\eta_{21}-\eta_{03})(\eta_{30}+\eta_{12})[(\eta_{30}+\eta_{12})^2 - 3(\eta_{21}+\eta_{03})^2]+(3\eta_{12}-\eta_{30})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^2-(\eta_{21}+\eta_{03})^2]\]

3.相关API

3.1.cv::moments

1
2
3
4
Moments moments( 
	InputArray array, 
	bool binaryImage = false 
);

该API用于计算图像的中心矩(1阶、2阶、3阶)、几何矩(2阶、3阶)和归一化几何矩(2阶、3阶)。参数详解:

  1. InputArray array:输入图像。
  2. bool binaryImage:是否对图像进行二值化处理。如果为true,则所有非0像素会被视为1。

Moments类的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class CV_EXPORTS_W_MAP Moments
{
public:
    //! the default constructor
    Moments();
    //! the full constructor
    Moments(double m00, double m10, double m01, double m20, double m11,
            double m02, double m30, double m21, double m12, double m03 );
    ////! the conversion from CvMoments
    //Moments( const CvMoments& moments );
    ////! the conversion to CvMoments
    //operator CvMoments() const;

    //! @name spatial moments
    //! @{
    CV_PROP_RW double  m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
    //! @}

    //! @name central moments
    //! @{
    CV_PROP_RW double  mu20, mu11, mu02, mu30, mu21, mu12, mu03;
    //! @}

    //! @name central normalized moments
    //! @{
    CV_PROP_RW double  nu20, nu11, nu02, nu30, nu21, nu12, nu03;
    //! @}
};

3.2.cv::HuMoments

1
2
3
4
void HuMoments( 
	const Moments& moments, 
	double hu[7] 
);

参数详解:

  1. const Moments& moments:输入cv::moments算出来的矩。
  2. double hu[7]:输出第2部分中的$\Phi_1 \sim \Phi_7$。

3.3.cv::contourArea

1
2
3
4
double contourArea( 
	InputArray contour, 
	bool oriented = false 
);

该API用于计算轮廓围成的面积。参数详解:

  1. InputArray contour:输入的轮廓。
  2. bool oriented:如果为true,则返回带正负号的面积值,正负取决于轮廓的方向(顺时针或逆时针)。如果为false,则返回面积的绝对值。

3.4.cv::arcLength

1
2
3
4
double arcLength( 
	InputArray curve, 
	bool closed 
);

该API用于计算曲线的长度或者闭合轮廓的周长。参数详解:

  1. InputArray curve:输入曲线。
  2. bool closed:曲线是否闭合。

4.代码地址

  1. 图像矩

5.参考资料

  1. 图像的矩特征
  2. 图像中矩的概念
  3. 图像矩(Hu矩)简介