图像矩的理解及作用

我们希望能用很少的几个特征代表一个图形,这些特征不因图形在图像中所在的位置、旋转角度、缩放比例的改变而改变,也不应受光照、噪点等影响。经过计算机视觉多年的发展,已经发现了很多这样的特征, 不变矩就是其中一个。

统计学中的矩

图像矩的理解及作用_第1张图片

图像的几何矩

将图像的像素坐标看作是二维随机变量,像素的灰度值看作是概率,就可以套用统计学中的矩作为图像的几何矩。

原点矩: M i j = ∑ x ∑ y x i y j I ( x , y ) M_{ij}=\sum_x \sum_y x^iy^jI(x,y) Mij=xyxiyjI(x,y)

中心矩: μ i j = ∑ x ∑ y ( x − x ^ ) i ( y − y ^ ) j I ( x , y ) , 其 中 ( x ^ , y ^ ) 为 图 形 的 质 心 ( 重 心 ) \mu_{ij}=\sum_x \sum_y (x-\hat x)^i(y-\hat y)^jI(x,y) \text ,其中(\hat x, \hat y)为图形的质心(重心) μij=xy(xx^)i(yy^)jI(x,y)(x^,y^)

  1. 零阶矩

    M 00 = ∑ x ∑ y I ( x , y ) ,其中I(x,y)表示在(x,y)处的像素灰度值 M_{00}=\sum_x \sum_y I(x, y) \text {,其中I(x,y)表示在(x,y)处的像素灰度值} M00=xyI(x,y),其中I(x,y)表示在(x,y)处的像素灰度值

    零阶矩计算的是所有像素灰度的总和,类比统计学中的概率总和

  2. 一阶矩

    { M 10 = ∑ x ∑ y x ∗ I ( x , y ) M 01 = ∑ x ∑ y y ∗ I ( x , y ) \begin{cases} M_{10}=\sum_x \sum_y x*I(x, y) \\ M_{01}=\sum_x \sum_y y*I(x, y) \end{cases} {M10=xyxI(x,y)M01=xyyI(x,y)

    一阶矩计算出图像横纵坐标的加权和,权值即为该坐标像素。若想将权值归一化到(0,1)的区间,则可以将每个像素灰度值除以灰度总和,这样一阶矩就类似统计学中的数学期望了,该期望值是横纵坐标轴的加权平均值。该坐标点即为图形的质心(重心)坐标:

    { x c = M 10 / M 00 y c = M 01 / M 00 \begin{cases} x_c=M_{10} / M_{00} \\ y_c=M_{01} / M_{00} \end{cases} {xc=M10/M00yc=M01/M00

  3. 二阶矩

    { M 20 = ∑ x ∑ y x 2 I ( x , y ) M 02 = ∑ x ∑ y y 2 I ( x , y ) M 11 = ∑ x ∑ y x y I ( x , y ) \begin{cases} M_{20}=\sum_x \sum_y x^2I(x, y) \\ M_{02}=\sum_x \sum_y y^2I(x, y) \\ M11=\sum_x \sum_y xyI(x,y) \end{cases} M20=xyx2I(x,y)M02=xyy2I(x,y)M11=xyxyI(x,y)

    类比上述统计学中的k阶原点矩

  4. 二阶中心矩

    { μ 20 = ∑ x ∑ y ( x − x c ) 2 I ( x , y ) μ 02 = ∑ x ∑ y ( y − y c ) 2 I ( x , y ) \begin{cases} \mu_{20}=\sum_x \sum_y (x-x_c)^2I(x, y) \\ \mu_{02}=\sum_x \sum_y (y-y_c)^2I(x, y) \end{cases} {μ20=xy(xxc)2I(x,y)μ02=xy(yyc)2I(x,y)

    类比方差

Hu矩

中心距仅保证了平移不变性,若想要保证缩放不变性,则对中心矩归一化:

μ i j = μ i j μ 00 i + j 2 \mu_{ij}=\frac {\mu_{ij}}{\mu_{00}^\frac {i+j}{2}} μij=μ002i+jμij

μ i j \mu_{ij} μij 就同时具有平移和缩放不变性,但仍没有旋转不变性。为了解决该问题,又创造了Hu矩

Hu矩利用二阶和三阶中心矩导出下面七个不变矩组,他们都能同时保证平移、缩放、旋转不变性:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2yG1cT3-1650428282151)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3dc17d14-0030-46c0-b4dc-8108975a668d/Untitled.png)]

OpenCV计算矩

函数 moments() 用于计算几何矩(例如 m 10 , m 00 m_{10}, m_{00} m10,m00 等,由此可计算出质心),函数 HuMouents() 用于计算Hu矩。以下为七个不变矩的实际效果(为了便于比较,结果都使用 log 输出):

图像矩的理解及作用_第2张图片

可以直接使用 matchShapes() 方法来对不两个图形Hu矩的差值,根据该差值可以判断是不是同一个图形。差值越小则越接近。

参考 我有点酷
参考:
https://www.learnopencv.com/shape-matching-using-hu-moments-c-python/
https://www.cnblogs.com/ronny/p/3985810.html
https://www.cnblogs.com/wyuzl/p/7846384.html
https://www.jianshu.com/p/3cb0b97da76e

你可能感兴趣的:(opencv,计算机视觉,机器学习,机器学习,计算机视觉)