1.图像的矩
参考链接:https://blog.csdn.net/qq_37207090/article/details/83986950。
图像矩是通过对轮廓上所有点进行积分运算而得到的一个粗略特征,对于图像函数
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
m_{pq}=\int_{-\infty}^\infty\int_{-\infty}^\infty x^py^qf(x,y)dxdy
mpq=∫−∞∞∫−∞∞xpyqf(x,y)dxdy
其中
p
p
p与
q
q
q的取值范围为
[
0
,
+
∞
)
[0,+\infty)
[0,+∞),图像的
p
+
q
p+q
p+q阶中心矩定义如下:
μ
p
q
=
∫
−
∞
∞
∫
−
∞
∞
(
x
−
x
−
)
p
(
y
−
y
−
)
q
f
(
x
,
y
)
d
x
d
y
\mu_{pq}=\int_{-\infty}^\infty\int_{-\infty}^\infty (x-x^-)^p(y-y^-)^qf(x,y)dxdy
μpq=∫−∞∞∫−∞∞(x−x−)p(y−y−)qf(x,y)dxdy
其中
p
p
p与
q
q
q的取值范围为
[
0
,
+
∞
)
[0,+\infty)
[0,+∞),
x
−
x^-
x−与
y
−
y^-
y−代表图像的质心。对于离散的数字图像,积分变换转换为求和变换后,几何矩和中心矩公式如下:
m
p
q
=
∑
y
=
1
N
∑
x
=
1
M
x
p
y
q
f
(
x
,
y
)
m_{pq}=\sum_{y=1}^{N} \sum_{x=1}^{M}x^py^qf(x,y)
mpq=y=1∑Nx=1∑Mxpyqf(x,y)
μ
p
q
=
∑
y
=
1
N
∑
x
=
1
M
(
x
−
x
−
)
p
(
y
−
y
−
)
q
f
(
x
,
y
)
\mu_{pq}=\sum_{y=1}^{N} \sum_{x=1}^{M}(x-x^-)^p(y-y^-)^qf(x,y)
μpq=y=1∑Nx=1∑M(x−x−)p(y−y−)qf(x,y)
其中
p
p
p与
q
q
q的取值范围为
[
0
,
+
∞
)
[0,+\infty)
[0,+∞),
M
M
M与
N
N
N分别代表图像的宽度和高度。归一化的中心矩定位为:
η
p
q
=
μ
p
q
(
μ
00
)
ρ
\eta_{pq}=\frac{\mu_{pq}}{(\mu_{00})^\rho}
ηpq=(μ00)ρμpq,其中
ρ
=
p
+
q
2
+
1
\rho=\frac{p+q}{2}+1
ρ=2p+q+1,其中
p
p
p是
x
x
x的维度,其中
q
q
q是
y
y
y的维度,阶段表示参数的指数关系
利用二阶和三阶规格中心矩可以导出下面7个不变矩组(Φ1 Φ7),它们在图像平移、旋转和比例变化时保持不变。
2.Opencv相关函数
Opencv提供了函数moments()用来计算图像中所有的矩(最高到三阶),contourArea()用来计算轮廓面积,arcLength()用来计算轮廓或曲线长度。
Moments moments(InputArray array,bool binaryImage=false);
该函数用来计算所有三阶多边形或栅格形状的矩,参数array表示输入光栅图像(单通道,8位或32位浮点二维数组)或二维点集。binaryImage设为true时,所有的非零图像像素被认为是1。
点多边形测试用于判断点集是否在被测多边形的内部,是轮廓点集判断的重要技术之一。Opencv专门提供了专门用于点多边形测试的函数pointPolygonTest(),用来检测点是否在多边形内部:
double pointPolygonTest(InputArray contour,Point2f pt,bool measureDist);
参数contour是输入轮廓,pt表示对轮廓点进行测试,measureDist是标志位,如果设置为true,则函数会返回该点到轮廓最近点的有符号的欧式距离,即点在曲线内时,距离为正,点在曲线外为负,点在轮廓上的距离返回为零。如果设置成false,函数会返回相应的距离(1,-1,0)。