moments 是 OpenCV 中用于计算图像或轮廓的 几何矩 的函数。矩(moments)是一种用于描述形状和区域分布的数学工具,广泛应用于图像处理、计算机视觉和模式识别中。以下是 moments 函数具体计算的内容及其意义:


1. 矩的定义

矩是基于图像像素强度的加权平均值,用于描述一个区域的形状特征。对于灰度图像,矩的计算公式如下:

原始矩(Raw Moments 或空间矩)

Mij=∑x∑yxiyjI(x,y) M_{ij} = \sum_x \sum_y x^i y^j I(x, y) Mij=xyxiyjI(x,y)

  • MijM_{ij}Mij表示 (i+j)(i+j)(i+j)阶矩。
  • I(x,y)I(x, y)I(x,y) 是图像在点 (x,y)(x, y)(x,y)处的像素强度。
  • iiijjj 是矩的阶数。

例如:

  • M00M_{00}M00:零阶矩,表示区域的面积(总像素值之和)。
  • M10,M01M_{10}, M_{01}M10,M01:一阶矩,用于计算质心位置。

中心矩(Central Moments)

中心矩是对原始矩进行平移归一化后的结果,具有平移不变性。其公式为:
μpq=∑x∑y(x−xˉ)p(y−yˉ)qI(x,y) \mu_{pq} = \sum_x \sum_y (x - \bar{x})^p (y - \bar{y})^q I(x, y) μpq=xy(xxˉ)p(yyˉ)qI(x,y)

  • xˉ=M10M00,yˉ=M01M00\bar{x} = \frac{M_{10}}{M_{00}}, \quad \bar{y} = \frac{M_{01}}{M_{00}}xˉ=M00M10,yˉ=M00M01是质心坐标。
  • μpq\mu_{pq}μpq 表示(p+q)(p+q)(p+q)-阶中心矩。

例如:

  • μ20,μ02\mu_{20}, \mu_{02}μ20,μ02:二阶中心矩,用于描述区域的分布方向。
  • μ11\mu_{11}μ11:一阶交叉矩,用于描述区域的协方差。

归一化中心矩(Normalized Central Moments)

归一化中心矩进一步对中心矩进行尺度归一化,使其具有尺度不变性。其公式为:
ηpq=μpqM00(p+q)/2+1 \eta_{pq} = \frac{\mu_{pq}}{M_{00}^{(p+q)/2 + 1}} ηpq=M00(p+q)/2+1μpq

例如:

  • η20,η02\eta_{20}, \eta_{02}η20,η02:归一化的二阶矩。
  • η11\eta_{11}η11:归一化的一阶交叉矩。

2. moments 函数的输出

在 OpenCV 中,moments 函数返回一个 Moments 对象,其中包含以下内容:

空间矩(Spatial Moments)
  • m00:零阶矩,表示区域的面积。
  • m10, m01:一阶矩,用于计算质心。
  • m20, m11, m02:二阶矩。
  • m30, m21, m12, m03:三阶矩。
中心矩(Central Moments)
  • mu20, mu11, mu02:二阶中心矩。
  • mu30, mu21, mu12, mu03:三阶中心矩。
归一化中心矩(Normalized Central Moments)
  • nu20, nu11, nu02:归一化的二阶矩。
  • nu30, nu21, nu12, nu03:归一化的三阶矩。

3. 矩的具体用途

(1) 计算质心

质心(重心)可以通过一阶矩和零阶矩计算得出:
xc=M10M00,yc=M01M00 x_c = \frac{M_{10}}{M_{00}}, \quad y_c = \frac{M_{01}}{M_{00}} xc=M00M10,yc=M00M01

(2) 描述形状的方向

利用二阶中心矩可以构建协方差矩阵,从而计算形状的主轴方向:
角度=12arctan⁡(2μ11μ20−μ02) \text{角度} = \frac{1}{2} \arctan\left(\frac{2 \mu_{11}}{\mu_{20} - \mu_{02}}\right) 角度=21arctan(μ20μ022μ11)

(3) 形状匹配

通过高阶矩(如 Hu 不变矩)实现平移、旋转、缩放等变换下的形状匹配。

(4) 特征提取

矩可以作为形状的全局特征,用于目标识别、分类等任务。


4. 示例代码

以下是一个使用 moments 函数的简单示例:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 假设我们有一个二值图像
    cv::Mat image = cv::imread("binary_image.png", cv::IMREAD_GRAYSCALE);
    cv::threshold(image, image, 128, 255, cv::THRESH_BINARY);

    // 查找轮廓
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    for (size_t i = 0; i < contours.size(); ++i)
    {
        // 计算矩
        cv::Moments moms = cv::moments(contours[i]);

        // 计算质心
        double area = moms.m00;
        if (area > 0)
        {
            double xc = moms.m10 / moms.m00;
            double yc = moms.m01 / moms.m00;

            std::cout << "Contour " << i << ": Centroid (" << xc << ", " << yc << "), Area: " << area << std::endl;
        }
    }

    return 0;
}

几何形状特征描述

圆形度、惯性比、凸性和质心是描述几何形状特征的几个重要参数,它们在图像处理、计算机视觉、形态学等领域中有着广泛的应用。下面分别对这几个概念进行详细介绍:

圆形度

圆形度(Circularity)是一种用于描述物体形状与理想圆相似程度的度量。通常定义为:
Circularity=4πAP2\text{Circularity} = \frac{4\pi A}{P^2}Circularity=P24πA
其中 AAA 是物体的面积,PPP 是物体的周长。圆形度的理想值为1,此时物体为一个完美的圆;其他形状的圆形度会小于1。

惯性比

惯性比(Eccentricity)通常指的是椭圆的长短轴之比,但在更广泛的上下文中,它也可以指代一种基于二阶矩计算出的形状描述子,用来衡量一个物体偏离圆形的程度。对于二维物体,惯性比可以通过主轴的长度来定义。具体来说,它是通过计算物体的协方差矩阵的特征值来确定的,这些特征值代表了沿着主成分方向的数据分布。惯性比越接近于1,表示物体越接近圆形;越远离1,则表示物体越偏离圆形,趋于线性或扁平形状。

凸性

凸性(Convexity)是指一个形状相对于其凸包的紧凑程度。凸包可以被想象为用橡皮筋围绕着形状的所有点拉伸形成的最小凸多边形。凸性的定义公式如下:
Convexity=Object’s AreaConvex Hull’s Area\text{Convexity} = \frac{\text{Object's Area}}{\text{Convex Hull's Area}} Convexity=Convex Hull’s AreaObject’s Area
凸性值总是小于或等于1,值越接近于1,表示该形状越接近于其凸包,也就越“凸”。

质心

质心(Centroid),也称为重心,是物体内部所有点的质量中心。对于均匀密度的平面图形而言,质心即为其几何中心。在数学上,质心可以通过积分或求和来计算,取决于是否处理连续或离散的数据。对于离散的点集,质心可以通过以下公式计算:
Cx=1n∑i=1nxi,Cy=1n∑i=1nyiC_x = \frac{1}{n}\sum_{i=1}^{n} x_i, \quad C_y = \frac{1}{n}\sum_{i=1}^{n} y_i Cx=n1i=1nxi,Cy=n1i=1nyi
其中 CxC_xCxCyC_yCy分别是质心的x坐标和y坐标,xix_ixiyiy_iyi分别是每个点的x坐标和y坐标,nnn 是点的数量。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐