MATLAB 中多图像的 SURF 描述符与匹配

SURF Descriptor and Matching for Multiple Image in Matlab

我正在使用 matlab 进行基于内容的图像检索项目 当我应用函数 point=detectSURFFeatures(image) 我得到 83*1 个具有以下信息的冲浪点:

         `Scale: [83x1 single]
          SignOfLaplacian: [83x1 int8]
          Orientation: [83x1 single]
          Location: [83x2 single]
          Metric: [83x1 single]
          Count: 83`

我需要知道如何提取一个(独特且固定的)特征向量来表示包含数千张图像的数据库中的每个图像,请帮忙?
这里是samples of the database。 (王数据库)

目前我正在使用imread读图如下。 Matlab 的 detectSURFFeatures 函数仅适用于灰度图像。

I = rgb2gray( imread( '434.jpg' ) );

您可以运行这一行来获取 SURF 功能。

points = detectSURFFeatures( I );

您可以使用以下方法绘制冲浪特征。

imshow( I );
hold on;
plot( point.selectStrongest(10) );
hold off;

这是我使用的图像的可视化。

打印points对象,可以得到如下属性显示41个特征。

          Scale: [41x1 single]
SignOfLaplacian: [41x1 int8]
    Orientation: [41x1 single]
       Location: [41x2 single]
         Metric: [41x1 single]
          Count: 41

如果您将所有灰度图像都存储在一个名为 cellimg 的单元格对象中(每个图像一个单元格元素),您可以对每个图像进行 运行 detectSURFFeatures,如下所示。

cellsurf = cellfun( @(I) detectSURFFeatures( I ), cellimg, 'UniformOutput', false );

cellsurf 的每个元素都将包含 SURF 点。由于您需要一组独特且固定的特征来识别每张图像,因此您可以 select 在 cellsurf 中每张图像上的最强点。您可以使用前 n 个功能或设置 n = min( points )。使用以下代码计算最小特征数。

n = min( cellfun( @(S) S.Count, cellsurf ) );

然后你可以select通过运行宁selectStrongestcellsurf.

中的每个单元格上的最强点
F = cellfun( @(S) S.selectStrongest( n ), cellsurf, 'UniformOutput', false);

变量 F 将包含一组常量特征。您可以相应地更改 n 以更改您想要的最强功能的数量。要匹配两组特征,您可以使用内置 matchFeatures function.

备注

  • 如果您需要更多功能,可以在调用 detectSURFFeatures 函数时指定不同的 'MetricThreshold' 参数。
  • 您可以通过以下函数使用其他特征算法代替 SURF:detectBRISKFeaturesdetectFASTFeaturesdetectHarrisFeaturesdetectMinEigenFeaturesdetectMSERFeatures

首先,detectSURFFeatures只给出了兴趣点的位置、比例和方向。您还必须调用 extractFeatures,这将为您提供 SURF 描述符,这些描述符是描述每个兴趣点周围图像块的向量。

现在,您正在尝试将表示图像的一组补丁描述符转换为单个向量,有多种方法可以做到这一点。一种流行的方法称为 bag of features,又名视觉词袋。