Mahotas - 加速鲁棒特征



加速鲁棒特征 (SURF) 是一种用于检测图像中显著特征(关键点)的算法。SURF 通过分析图像在多个尺度上的强度变化来识别关键点。

它为这些点分配方向并生成描述符,这些描述符捕获了它们的独特特征。

描述符是在关键点周围局部区域内的模式中计算的。这些描述符随后可用于各种应用。

SURF 使用两种主要技术 - surf 密集和 surf 积分。这两种技术在接下来的章节中进行了详细讨论。

SURF Surf

SURF surf 是一种结合了图像关键点检测和描述的技术。它生成描述符以编码这些关键点的属性。该函数以图像作为输入,并返回一组 SURF 描述符。

语法

以下是 mahotas 中 surf.surf() 函数的基本语法 -

mahotas.features.surf.surf(f, nr_octaves=4, nr_scales=6, initial_step_size=1,
threshold=0.1, max_points=1024, descriptor_only=False)

其中,

  • f - 输入图像。

  • nr_octaves(可选) - 定义 SURF 算法中使用的八度数。一个八度表示不同分辨率级别的图像(默认值为 4)。

  • nr_scales(可选) - 确定每个八度音阶的尺度数。这些尺度用于检测不同细节级别的特征(默认值为 6)。

  • initial_step_size(可选) - 确定连续尺度之间的初始步长。较小的步长允许检测详细的特征(默认值为 1)。

  • threshold(可选) - 用于过滤掉弱 SURF 特征的阈值(默认值为 0.1)。

  • max_points(可选) - 定义将返回的 SURF 点的最大数量(默认值为 1024)。

  • descriptor_only(可选) - 一个标志,用于确定是否仅返回描述符或描述符和关键点。设置为 True 时,将仅返回检测到的特征的描述符。

    如果设置为 False,则将返回关键点和描述符(默认值为 False)。

我们可以在下面看到 surf 图像 -

Surf

SURF 密集

SURF 密集是 SURF 算法使用的一种技术。在 SURF 密集中,关键点在图像上密集采样。

换句话说,SURF 密集不是搜索特定的兴趣点,而是为图像中的像素网格计算描述符。这有助于捕获有关整个图像的信息。

在下图中,我们可以看到 SURF 密集图像 -

Surf Dense

SURF 积分

SURF 积分技术通过利用积分图像来提高 SURF 算法的计算效率。积分图像预先计算图像特定区域直至像素强度的累积和。

这种预先计算消除了冗余计算,从而能够更快、更有效地进行特征检测和描述。

因此,SURF 算法非常适合实时应用和处理大规模数据集。

以下是 SURF 积分的图像 -

Surf Integral Technique

示例

在下面的示例中,我们对图像执行了不同的 SURF 函数,如上所述 -

import mahotas as mh
from mahotas.features import surf
import numpy as np
import matplotlib.pyplot as mtplt
image = mh.imread('tree.tiff', as_grey=True)
# SURF dense
surf_dense = surf.dense(image, 100)
mtplt.imshow(surf_dense)
mtplt.title('SURF Dense Image')
mtplt.axis('off')
mtplt.show()
# SURF integral
surf_integral = surf.integral(image)
mtplt.imshow(surf_integral)
mtplt.title('SURF Integral Image')
mtplt.axis('off')
mtplt.show()
# SURF surf
surf_surf = surf.surf(image)
mtplt.imshow(surf_surf)
mtplt.title('SURF Surf Image')
mtplt.axis('off')
mtplt.show()

输出

获得的输出如下所示 -

SURF 密集图像

Surf Dense1

SURF 积分图像

Surf Integral Image

SURF Surf 图像

Surf Image1

我们将在后面的章节中详细讨论 SURF 密集和 SURF 积分技术。

广告