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
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Getting the SURF dense points
surf_dense = surf.dense(image, 120)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the surf dense points
axes[1].imshow(surf_dense)
axes[1].set_title('SURF Dense Point')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

SURF Dense Points

通过调整尺度

我们可以调整尺度来计算不同空间中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
# Loading the image
image = mh.imread('nature.jpeg')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Getting the SURF dense points
surf_dense = surf.dense(image, 100, np.sqrt(25))
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the surf dense points
axes[1].imshow(surf_dense)
axes[1].set_title('SURF Dense Point')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

 Scale Adjusting

通过包含兴趣点

在计算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
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Getting the SURF dense points
surf_dense = surf.dense(image, 100, include_interest_point=True)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the surf dense points
axes[1].imshow(surf_dense)
axes[1].set_title('SURF Dense Point')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

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

Include Interest Points
广告