矩的概念、意义以及在SLAM中的应用
矩
矩的理解
物理意义
在物理学中,矩是表示距离和物理量乘积的物理量,表征物体的空间分布。由其定义,矩通常需要一个参考点(几点或参考系)来定义距离。如力和参考点距离乘积得到的力矩(通常称为扭矩),原则上任何物理量和距离相乘都会产生力矩,常用的量包括力、质量和电荷分布。
单个点的力矩:
多个点则是积分的空间密度
如果点表示质量,则第零矩是总质量,一阶矩是中心,二阶矩是转动惯量
还有一个多极矩的概念,涉及到极坐标系和球面坐标,详见Moment(physics)
数学意义
矩是物体形状识别的重要参数指标。在统计学中,矩表征随机量的分布。如一个“二阶矩”在一维上可测量其“宽度”,在更高阶的维度上由于其使用于椭球的空间分布,我们还可以对点的云结构进行测量和描述。其它矩用来描述诸如与均值的偏差分布情况(偏态),或峰值的分布情况(峰态)
定义在实数域的是函数相对于值c的n阶矩为
如果点表示概率密度,则第零阶矩表示总概率,1,2,3阶矩依次为以下三项。数学中的概念与物理学中矩的概念密切相关。
- 期望(Expectation)
随机变量的期望定义为其一阶原点矩:
在方差等定义中,期望也变成随机变量的“中心”。
显然,任何随机变量的一阶中心矩为0。对于以下二阶及更高阶的剧,通常使用中心距(围绕平均值c的矩,均值是一阶矩),而不是原点矩,因为中心距更能清楚地体现关于分布形状的信息。
- 方差(Variance)
随机变量的方差定义为其二阶中心矩:
- 归一化矩
归一化n阶中心矩或者说标准矩,是n阶中心矩除以标准差\(\sigma^n\),归一化n阶中心矩为:
这些归一化矩是无量纲值,表示独立于任何尺度的线性变化的分布。举个例子,对于电信号,一阶矩是其DC(直流)电平,二阶矩与平均功率成比例。
- 偏态(Skewness)
随机变量的偏态(衡量分布不对称性)定义为其三阶中心矩:
需要注意的是,任何对称分布偏态为0,归一化三阶矩被称为偏斜度,向左偏斜(分布尾部在左侧较长)具有负偏度(失效率数据常向左偏斜,如极少量的灯泡会立即烧坏),向右偏斜分布(分布尾部在右侧较长)具有正偏斜度(工资数据往往以这种方式偏斜,大多数人所得工资较少)。
- 峰度(Kurtosis)
随机变量的峰态被定义为其四阶中心矩:
一般随机变量的峰度定义为其四阶矩与方差平方(二阶中心矩平方)的比值再减3,减3是为了让正态分布峰度(正态分布的峰度值为3)为0,这也被称为超值峰度:
峰度表示分布的波峰和尾部与正态分布的区别,峰度有助于初步了解数据分布的一般特征。
完全符合正态分布的数据峰度值为0,且正态分布曲线被称为基线。如果样本峰度显著偏离0,就可以判断次数据不是正态分布。
如果峰度大于3(超值峰度大于0),峰的形状比较尖,比正态分布的峰要陡峭,如下图中的正峰度。
峰度是衡量实数随机变量概率分布的峰态。峰度高就意味着方差增大是由低频度的大于或小于平均值的极端差值引起的
- 混合矩
混合矩是多个变量的矩,比如协方差,协偏度,协峰度。但协偏度和协峰度存在多个。
- 中心转换
由于:
所以:
- 累加性
当x和y是独立变量时,
- 样本矩
矩常常通过样本矩来估计,这种方法不需要先估计其概率分布
对于任何样本大小,原始样本矩的期望值等于群体的k阶矩(若存在)
矩的扩展
\(E(X^k)\)为k阶原点矩
\(E(|X|^k)\)为k阶绝对矩
\(E((X-E(X))^k)\)为k阶中心矩
\(E(|X-E(X)|^k)\)为k阶绝对中心矩
ORB-SLAM2中的绝对矩
ORB-SLAM2的initializer.cc中,计算单应矩阵和基础矩阵前对特征点的坐标进行了标准化。对(x,y)进行标准化就是将分别将x和y乘以x方向和y方向的一阶绝对矩的倒数
void Initializer::Normalize(const vector<cv::KeyPoint> &vKeys, vector<cv::Point2f> &vNormalizedPoints, cv::Mat &T)
{
float meanX = 0;
float meanY = 0;
const int N = vKeys.size();
// 将输出的vector设置成和输入等长
vNormalizedPoints.resize(N);
for (int i = 0; i < N; i++)
{
meanX += vKeys[i].pt.x;
meanY += vKeys[i].pt.y;
}
// 计算所有点坐标的平均值
meanX = meanX / N;
meanY = meanY / N;
// 计算绝对矩
float meanDevX = 0;
float meanDevY = 0;
for (int i = 0; i < N; i++)
{
vNormalizedPoints[i].x = vKeys[i].pt.x - meanX;
vNormalizedPoints[i].y = vKeys[i].pt.y - meanY;
meanDevX += fabs(vNormalizedPoints[i].x);
meanDevY += fabs(vNormalizedPoints[i].y);
}
meanDevX = meanDevX / N;
meanDevY = meanDevY / N;
// 标准化因子
float sX = 1.0 / meanDevX;
float sY = 1.0 / meanDevY;
// 标准化
for (int i = 0; i < N; i++)
{
// x’=(x - meanX) * sX
// y'=(y - menaY) * sY
vNormalizedPoints[i].x = vNormalizedPoints[i].x * sX;
vNormalizedPoints[i].y = vNormalizedPoints[i].y * sY;
}
// 构建标准化矩阵
T = cv::Mat::eye(3, 3, CV_32F);
T.at<float>(0, 0) = sX;
T.at<float>(1, 1) = sY;
T.at<float>(0, 2) = -meanX * sX;
T.at<float>(1, 2) = -meanY * sY;
}
图像意义
在图像处理中,计算机视觉和相关领域中,一个图像矩是图像像素强度的某个特定加权平均(矩),或者是这样的矩的函数,通常选择具有一些有吸引力的特性或解释。
图像矩对于分割之后对象的描述是有用的。通过图像矩得到的图像的简单属性包括面积(或总强度),其质心和关于其方向的信息。
- 原点矩
对于一个二维连续函数\(f(x,y)\),第\((p+q)\)个点的矩(原点矩)被定义为
照这个思路,像素强度为\(I(x,y)\)的灰度图,原点矩为:
有些情况下,也可以把图像看成概率密度函数来计算\(M_{ij}=\sum_x\sum_yx^iy^jI(x,y)\)
唯一性定理(Hu[1962])指出,如果\(f(x,y)\)是分段连续的并且仅在xy平面的有限部分中具有非零值,则存在所有阶的矩,并且矩序列\(M_{pq}\)由\(f(x,y)\)唯一确定。
反之,中心矩\(M_{pq}\)唯一确定\(f(x,y)\)。
在实践中,图像被概括为具有几个较低阶矩的函数。
举个例子,Opencv中moment函数从原点矩中获得的简单图像属性
面积(二值图)和灰度和(灰度图):M00
质心:\(\bar{x},\bar{y}=\frac{M10}{M00},\frac{M01}{M00}\)
vector<Moments> mu(contours.size() );
vector<Point2f> mc(contours.size() );
mu[c] = moments( contours[i], false );
double area=mu[c].m00 ;
mc[c] = Point2f( mu[c].m10/mu[c].m00 , mu[c].m01/mu[c].m00 );
灰度质心法
ORB特征点正是采用灰度质心法使得FAST角点具有了旋转不变性。
首先我们将特征点(x,y)领域的矩定义为:(和图像像素强度的原点矩公式相同,灰度质心法也叫强度质心法)
通过矩,我们可能找到质心:
我们可以构造一个从角的中心 \(O\) 到质心\(OC\)的向量,那么该特征点邻域的方向描述就是:
即:我们
- 中心矩
中心矩被定义为:
如果是数字图像,则等式变为:
3阶及以下中心矩依次为:
总计出来就是
中心矩具有平移不变性
举个例子
图像方向的信息可以通过首先使用二阶中心矩来构造协方差矩阵到处(底下这个式子很明显就是矩阵降维)
其中,图像上一点\(I(x,y)\)的协方差矩阵为
矩阵的特征向量对应于图像强度的长轴和短轴,因此可以与最大特征值相关联的特征向量的角度朝向最靠近该特征向量的轴提取取向。可以证明,该角度 \(\theta\) 可以由以下公式得出:
协方差矩阵的特征值可以表示为:
且特征值与特征向量轴的长度的平方成正比例。特征值的幅度的相对差异体现了图像的偏心特征或者说它多细长。偏心率是:
- 矩不变性
矩因为其在图像分析上的应用广为人知,由于他们可以被用于导出关于特征变换类的不变量。
在这种情况下,不变矩这个术语经常被滥用。然而,虽然矩不变量是从矩中形成的不变量,不变量本身的唯一矩是中心矩。
注意下面的详细的不变量仅在连续区间保持不变性。在离散区间,尺度和旋转都不能很好地形成,离散图像转换时近似的,且变换不可逆。因此,当描述离散图像中的形状是,这些不变量仅是近似不变的。
- 平移不变性
通过构造,任意阶中心矩\(\mu_{ij}\)相对于平移都是不变的。
- 尺度不变性
相对平移和尺度的不变量\(\eta_{ij}\)可以通过适当的缩放零阶中心矩阵从中心矩构建
注意平移不变量仅仅在中心矩时直接跟随使用
- 旋转不变性
正如Hu等人的工作所示,可以构建关于平移、放缩和旋转的不变量
这就是众所周知的HU矩不变量。
第一个,I1,类似于围绕图像的质心的转动惯量,像素强度类似于物理密度。
最后一个,I7,倾斜不变性,有能力区分其它相同图像的镜像(不懂)
J.Flusser提出了推导完整和独立的旋转矩不变量集合的一般理论。他所传统的Hu矩阵既不独立也不完全。I3并不是非常有用,因为它不独立,依赖于其它不变量。原始的Hu集合中有一个缺失的三阶独立不变矩。
后来,J.Flusser和T.Suk就专门研究N旋转对称形状的情况。
点云意义
PCL点云库关于矩的使用有两个,一个是pcl::MomentInvariantsEstimation
,估计每个3D点处的三个矩不变量(j1,j2,j3)
。另一个就是pcl::MomentOfInertiaEstimation
类。可以获得基于偏心率和转动惯量的描述符。还能提取点云的对齐轴和定向边界框。
Note:提取的边界框不可能是最小可能的边界框。
先将特征提取的idea。首先计算点云的协方差矩阵,并提取其特征值和向量。你也可以想象成归一化合成的特征向量,且总是形成右手坐标系(主特征向量表示x轴,次向量表示z轴)。下一步执行迭代。每次迭代过程中,主特征向量旋转。旋转顺序不变,且围绕其它特征向量执行。这提供了点云的旋转不变性。因此,我们把这个旋转的主矢量当成当前轴。
对于每个当前轴,计算转动惯量。另外,当前轴已被用来计算偏心率。因此,当前向量被看成平面法向量,并且讲输入的点云投影到它上面。根据所获得的投影计算偏心率。
当然,这个类还提供了获取Axis Aligned Bounding Box(AABB)和Oriented bounding box(OBB)的接口。将AABB作为特征向量计算OBB。pcl提供了一个示例
参考:
- https://www.zhihu.com/question/23236070
- https://zh.wikipedia.org/wiki/矩_(數學)
- https://en.wikipedia.org/wiki/Moment_(mathematics)
- https://en.wikipedia.org/wiki/Moment_(physics)
- https://en.wikipedia.org/wiki/Image_moment
- https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/SHUTLER3/CVonline_moments.html