OpenCV4入门系列教程86:图像距(几何矩、中心矩、hu矩)

索引地址:系列教程索引地址

上一篇:OpenCV4入门系列教程85.5:测试7寻找轮廓综合测试

数学距

在数学中,矩是一组点的形状的特定定量度量,用于力学和统计学。 如果点表示质量,则零矩为总质量,第一矩除以总质量为中心,第二矩为转动惯量。 如果点表示概率密度,则零矩是总概率(即。 第一时刻是均值,第二中心时刻是方差,第三时刻是偏度,第四时刻(归一化和移位)是峰度。 数学概念与物理学中的矩概念密切相关。 对于质量或概率的有界分布,所有矩(所有阶数,从0到∞)的集合唯一地决定了分布。 - 维基百科翻译

n阶矩被定义为一变量的n次方与其概率密度函数(Probability Density Function, PDF)之积的积分。在文献中n阶矩通常用符号μn表示,直接使用变量计算的矩被称为原始矩(raw moment),移除均值后计算的矩被称为中心矩(central moment)。变量的一阶原始矩等价于数学期望(expectation)、二至四阶中心矩被定义为方差(variance)、偏度(skewness)和峰度(kurtosis)。

对连续变量x和其单变量概率密度函数P(x)或积累分布函数(Cumulative Distribution Function, CDF)C(x),其n阶矩被定义为μn\mu'_n

μn=xndC(x)=xnP(x)dx\mu'_n= \int x^ndC(x) = \int x^n P(x)dx

若变量x为离散变量,则μn\mu'_n也可表示为:

μn=xnP(x)\mu'_n = \sum x^n P(x)

当n=1时,μn\mu'_n等价于x的数学期望:

μ1=xP(x)\mu'_1 = \int x P(x)

当n=2,3,4时,其中心矩被定义为方差、偏度和峰度:

μ2=(xμ1)2P(x)dxμ3=(xμ1)3P(x)dxμ4=(x=μ1)4P(x)dx\mu'_2 = \int (x-\mu'_1)^2 P(x)dx \\ \mu'_3 = \int (x-\mu'_1)^3 P(x)dx \\ \mu'_4 = \int (x=\mu'_1)^4 P(x)dx

对概率分布能否被其各阶矩决定的问题称为矩问题(moment problem),其中在有界区间内的矩问题命名为霍斯朵夫矩问题(Hausdorff moment problem),在无限区间内的矩问题称为汉堡矩问题(Hamburger moment problem)。

详见高等数学《概率论与数理统计》概率收敛 - 切比雪夫不等式 - 大数定律 - 中心极限定律部分

图像的矩

零阶矩

这里的图像是单通道图像,表示图像在点上的灰度值。
我们可以发现,当图像为二值图时,就是这个图像上白色区域的总和,因此,可以用来求二值图像(轮廓,连通域)的面积。

一阶矩

当图像为二值图时, 只有 0(黑),1(白)两个值。就是图像上所以白色区域 x 坐标值的累加。因此,一阶矩可以用来求二值图像的重心:

二阶矩

二阶矩可以用来求物体形状的方向。

其中:fastAtan2()为OpenCV的函数,输入向量,返回一个0-360的角度。

利用矩求图像的重心,方向

1
2
3
4
5
6
7
8
9
10
11
Mat image = imread(imagename, 0);//读入灰度图
Mat binary;
//二值,椭圆是黑色的,所以反色下
threshold(image, binary, 200, 255, CV_THRESH_BINARY_INV);
Moments m = moments(binary, true);//moments()函数计算出三阶及一下的矩
Point2d center(m.m10 / m.m00, m.m01 / m.m00);//此为重心
//计算方向
double a = m.m20 / m.m00 - center.x*center.x;
double b = m.m11 / m.m00 - center.x*center.y;
double c = m.m02 / m.m00 - center.y*center.y;
double theta = fastAtan2(2*b,(a - c))/2;//此为形状的方向

空间距

空间矩的实质为面积或者质量。可以通过一阶矩计算质心/重心。

mji=x,y(array(x,y)xjyi)m_{ji}=\sum_{x,y}(array(x,y)\cdot x^j \cdot y^i)

重心:$\bar x =\frac{m_{10}}{m_{00}} \ \bar y=\frac{m_{01}}{m_{00}} $

中心距

中心矩体现的是图像强度的最大和最小方向(中心矩可以构建图像的协方差矩阵),其只具有平移不变性,所以用中心矩做匹配效果不会很好。

muji=x,y(array(x,y)(xxˉ)j(yyˉ)i)mu_{ji}=\sum_{x,y}(array(x,y)\cdot (x-\bar x)^j \cdot (y-\bar y)^i)

归一化的中心矩

归一化后具有尺度不变性。

nuji=mujim00i+j2+1nu_{ji}=\frac{mu_{ji}}{m_{00}^{\frac{i+j}{2}+1}}

Hu矩

Hu矩由于具有尺度、旋转、平移不变性,可以用来做匹配。

hu[0]=η20+η02hu[1]=(η20η02)24η112hu[2]=(η303η12)2+(3η21η03)2hu[3]=(η30+η12)2+(η21+η03)2hu[4]=(η303η12)(η30+η12)[(η30+η12)23(η21+η03)2]+(3η21η03)(η21+η03)[3(η30+η12)2(η21+η03)2]hu[5]=(η20η02)[(η30+η12)2(η21+η03)2]+4η11(η30+η12)(η21+η03)hu[6]=(3η21η03)(η21+η03)[3(η30+η12)2(η21+η03)2](η303η12)(η21+η03)[3(η30+η12)2(η21+η03)2]hu[0]= \eta_{20} + \eta_{02} \\ hu[1]=(\eta_{20}-\eta_{02})^2 -4\eta_{11}^2 \\ hu[2]=(\eta_{30}-3\eta_{12})^2 +(3\eta_{21}-\eta_{03})^2 \\ hu[3]=(\eta_{30}+\eta_{12})^2+(\eta_{21}+\eta_{03})^2 \\ hu[4]= (\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]\\ hu[5]= (\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}) \\ hu[6]= (3\eta_{21}-\eta_{03})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^2-(\eta_{21}+\eta_{03})^2]-(\eta_{30}-3\eta_{12})(\eta_{21}+\eta_{03})[3(\eta_{30}+\eta_{12})^2-(\eta_{21}+\eta_{03})^2]

下一篇:OpenCV4入门系列教程87:查找和绘制图像轮廓矩