Mahotas - 泽尼克矩



与泽尼克特征类似,泽尼克矩也是一组描述图像中物体形状的数学值。它们提供了关于形状的具体细节,例如形状的圆度或对称性,或者是否存在任何特定的模式。

泽尼克矩具有一些特殊的属性,如下所述:

  • 尺寸不变性 - 无论其大小如何,它们都可以描述形状。因此,即使您拥有小型或大型物体,泽尼克矩仍然可以准确地捕捉其形状。

  • 旋转不变性 - 如果您旋转图像中的物体,泽尼克矩将保持不变。

  • 缩放不变性 - 如果您调整图像中物体的尺寸,泽尼克矩将保持不变。

泽尼克矩使用称为泽尼克多项式的特殊数学函数将形状分解成更小的部分。

这些多项式充当构建块。通过组合不同的泽尼克多项式,我们可以重现并表示物体形状的独特特征。

Mahotas中的泽尼克矩

为了在mahotas中计算泽尼克矩,我们可以使用mahotas.features.zernike_moments()函数。

在 Mahotas 中,泽尼克矩是通过生成一组泽尼克多项式来计算的,这些多项式是表示各种形状和轮廓的特殊数学函数。

这些多项式充当分析物体形状的构建块。

之后,通过将物体的形状投影到泽尼克多项式上来计算泽尼克矩。这些矩捕捉重要的形状特征。

mahotas.features.zernike_moments() 函数

mahotas.features.zernike_moments() 函数接受两个参数:图像对象和泽尼克多项式的最大半径。该函数返回图像的泽尼克矩的一维数组。

语法

以下是 mahotas.features.zernike_moments() 函数的基本语法:

mahotas.features.zernike_moments(im, radius, degree=8, cm={center_of_mass(im)})

其中,

  • im - 这是将对其计算泽尼克矩的输入图像。

  • radius - 它定义了圆形区域的半径(以像素为单位),在此半径上将计算泽尼克矩。由此半径定义的圆形区域(以质心为中心)之外的区域将被忽略。

  • degree(可选) - 它指定要计算的泽尼克矩的最大数量。默认情况下,degree 值为 8。

  • cm(可选) - 它指定图像的质心。默认情况下,使用图像的质心。

示例

以下是使用默认 degree 值计算图像泽尼克矩的基本示例:

import mahotas as mh
# Load images of shapes
image = mh.imread('sun.png', as_grey=True)
# Compute Zernike moments
moments = mh.features.zernike_moments(image, radius=10)
# Compare the moments for shape recognition
print(moments)
输出

执行上述代码后,我们将得到如下输出:

[0.31830989 0.00534998 0.00281258 0.0057374  0.01057919 0.00429721
 0.00178094 0.00918145 0.02209622 0.01597089 0.00729495 0.00831211
 0.00364554 0.01171028 0.02789188 0.01186194 0.02081316 0.01146935
 0.01319499 0.03367388 0.01580632 0.01314671 0.02947629 0.01304526
 0.00600012]

使用自定义质心

图像的质心是图像中质量均匀分布的点。自定义质心是图像中不一定是图像质心的点。

这在您想要使用不同的质心进行计算的情况下非常有用。

例如,您可能想要使用图像中物体的自定义质心来计算该物体的泽尼克矩。

为了在 mahotas 中使用自定义质心计算图像的泽尼克矩,我们需要将cm参数传递给 mahotas.features.zernike_moments() 函数。

cm 参数接受一个包含两个数字的元组,它们表示自定义质心的坐标。

示例

在这里,我们尝试使用自定义质心计算图像的泽尼克矩:

import mahotas
import numpy as np
# Load the image
image = mahotas.imread('nature.jpeg', as_grey = True)
# Calculate the center of mass of the image
center_of_mass = np.array([100, 100])
# Calculate the Zernike moments of the image, using the custom center of mass
zernike_moments = mahotas.features.zernike_moments(image, radius = 5,
cm=center_of_mass)
# Print the Zernike moments
print(zernike_moments)

输出

以下是上述代码的输出:

[3.18309886e-01 3.55572603e-04 3.73132619e-02 5.98944983e-04
 3.23622041e-04 1.72293481e-04 9.16757235e-02 3.35704966e-04
 7.09426259e-02 1.17847972e-04 2.12625026e-04 3.06537827e-04
 1.94379185e-01 1.32093249e-04 8.54616882e-02 1.83274207e-04
 1.86728282e-04 3.08004108e-04 4.79437809e-04 1.97726337e-04
 3.61630733e-01 5.27467687e-04 8.25534856e-02 7.75593823e-06
 1.99419391e-01]

使用特定阶数

泽尼克矩的阶数是其可以表示的形状复杂程度的度量。阶数越高,矩可以表示的形状越复杂。

为了在 mahotas 中使用特定阶数计算图像的泽尼克矩,我们需要将degree参数传递给 mahotas.features.zernike_moments() 函数。

示例

在下面的示例中,我们尝试使用指定的阶数计算图像的泽尼克矩。

import mahotas
import numpy as np
# Load the image
image = mahotas.imread('nature.jpeg', as_grey = True)
# Calculate the Zernike moments of the image, using the specific order
zernike_moments = mahotas.features.zernike_moments(image,1, 4)
# Print the Zernike moments
print(zernike_moments)

输出

上述代码的输出如下所示:

[0.31830989 0.17086131 0.03146824 0.1549947 0.30067136 0.5376049 0.30532715 0.33032683 0.47908119]
广告