Mahotas - SURF 密集点
SURF(加速稳健特征)是一种用于检测和描述图像中兴趣点的算法。这些点被称为"密集点"或"关键点",因为它们密集地存在于整个图像中,而不像稀疏点只存在于特定区域。
SURF 算法以各种比例分析整个图像,并识别强度发生显著变化的区域。
这些区域被视为潜在关键点。它们是包含独特和独特模式的兴趣区域。
Mahotas 中的 SURF 密集点
在 Mahotas 中,我们使用 mahotas.features.surf.dense() 函数来计算 SURF 密集点处的描述符。描述符本质上是描述图像中像素局部特征的特征向量,例如其强度梯度和方向。
为了生成这些描述符,该函数在图像上创建一个点网格,每个点之间相隔特定距离。在网格中的每个点,都会确定一个"兴趣点"。
这些兴趣点是捕获有关图像的详细信息的位置。一旦确定了兴趣点,就会计算密集的 SURF 描述符。
mahotas.features.surf.dense() 函数
mahotas.features.surf.dense() 函数将灰度图像作为输入,并返回包含描述符的数组。
此数组通常具有这样的结构:每行对应不同的兴趣点,列表示该点的描述符特征的值。
语法
以下是 mahotas − 中 surf.dense() 函数的基本语法
mahotas.features.surf.dense(f, Spacing, scale={np.sqrt(spacing)}, is_integral=False, include_interest_point=False)
其中,
f − 是输入的灰度图像。
spacing − 确定相邻关键点之间的距离。
scale (可选) − 指定计算描述符时使用的间距(默认为间距的平方根)。
is_integral (可选) −它是一个标志,指示输入图像是否为整数(默认为"False")。
include_interest_point(可选) − 它也是一个标志,指示是否返回带有 SURF 点的兴趣点(默认为"False")。
示例
在下面的例子中,我们使用 mh.features.surf.dense() 函数计算图像的 SURF 密集点。
import mahotas as mh from mahotas.features import surf import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 获取 SURF 密集点 surf_dense = surf.dense(image, 120) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示 surf 密集点 axes[1].imshow(surf_dense) axes[1].set_title('SURF Dense Point') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
以下是上述代码的输出 −

通过调整比例
我们可以调整比例来计算不同空间中 SURF 密集点的描述符。比例决定了兴趣点周围检查区域的大小。
较小的比例适合捕捉局部细节,而较大的比例适合捕捉全局细节。
在 mahotas 中,surf.dense() 函数的 scale 参数决定了计算 SURF 密集点描述符时使用的缩放比例。
我们可以将任意值传递给此参数,以检查缩放对 SURF 密集点的影响。
示例
在下面提到的示例中,我们正在调整比例来计算 SURF 密集点的描述符 −
import mahotas as mh from mahotas.features import surf import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('nature.jpeg') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 获取 SURF 密集点 surf_dense = surf.dense(image, 100, np.sqrt(25)) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示 surf 密集点 axes[1].imshow(surf_dense) axes[1].set_title('SURF Dense Point') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
上述代码的输出如下 −

通过包含兴趣点
我们还可以在计算 SURF 密集点的描述符时包含图像的兴趣点。兴趣点是像素强度值发生显著变化的区域。
在 mahotas 中,要包含图像的兴趣点,我们可以在计算 SURF 密集点的描述符时将 include_interest_point 参数设置为布尔值"True"。
示例
在这里,我们在计算图像的 SURF 密集点的描述符时包含兴趣点。
import mahotas as mh from mahotas.features import surf import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 获取 SURF 密集点 surf_dense = surf.dense(image, 100, include_interest_point=True) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示 surf 密集点 axes[1].imshow(surf_dense) axes[1].set_title('SURF Dense Point') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
