1

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

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

我需要知道如何提取一个(独特的和固定的)特征向量,它代表包含数千张图像的数据库中的每个图像,请帮忙?
这是数据库的样本。(王数据库)

4

2 回答 2

1

目前,我正在使用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 点。由于您需要一组独特且固定的特征来识别每个图像,因此您可以在 中选择每个图像上的最强点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 函数

笔记

  • 如果需要更多功能,可以在调用detectSURFFeatures函数时指定不同的“MetricThreshold”参数。
  • 您可以通过使用以下函数来使用其他特征算法而不是 SURF:detectBRISKFeatures, detectFASTFeatures, detectHarrisFeatures, detectMinEigenFeatures,detectMSERFeatures
于 2015-04-21T23:13:39.970 回答
1

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

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

于 2015-04-22T13:56:50.033 回答