Matlab中SURF描述符与多图像匹配

时间:2015-04-21 21:55:40

标签: matlab computer-vision surf matlab-cvst cbir

我正在使用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。 (王数据库)

2 个答案:

答案 0 :(得分:2)

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

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

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

points = detectSURFFeatures( I );

您可以使用以下内容绘制冲浪功能。

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

以下是我合作过的图像的可视化。

enter image description here

在打印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点。由于您需要一组可识别每个图像的独特且固定的特征,因此您可以在cellsurf中选择每个图像上最强的点。您可以使用热门n个功能,也可以设置n = min( points )。使用以下代码计算最小特征数。

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

然后,您可以在selectStrongest中的每个单元格上运行cellsurf来选择最强点。

F = cellfun( @(S) S.selectStrongest( n ), cellsurf, 'UniformOutput', false);

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

注释

  • 如果您需要更多功能,可以在调用detectSURFFeatures功能时指定其他“MetricThreshold”参数。
  • 您可以使用其他功能算法代替SURF:detectBRISKFeaturesdetectFASTFeaturesdetectHarrisFeaturesdetectMinEigenFeaturesdetectMSERFeatures

答案 1 :(得分:1)

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

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