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

Posted

技术标签:

【中文标题】Matlab中多幅图像的SURF描述符与匹配【英文标题】:SURF Descriptor and Matching for Multiple Image in Matlab 【发布时间】:2015-06-29 07:16:05 【问题描述】:

我正在使用 matlab 进行基于内容的图像检索项目 当我应用函数point=detectSURFFeatures(image) 我得到83*1 surf point,它包含以下信息:

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

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

【问题讨论】:

83 SURF 点有什么问题?将 SURF 应用于 1000 张图像并获得不同的点有什么问题? 但是我如何将查询图像与其他图像的其他特征进行比较,我想使用欧几里德距离或 DTW 等距离来测量查询图像与其他图像之间的距离 如何使用 83 个 SURF 点来比较图像?有许多向量 Scale , Orientation , location ...等,它为每个图像提供不同数量的特征(值) 数据库中是否有重复的图像?你想从数据库中匹配什么样的图像?您可以在问题中发布一些示例吗? 【参考方案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 ) );

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

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

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

注意事项

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

【讨论】:

现在我有 1*2 单元格的单元格,每个单元格都包含来自数据库的灰度图像,当我申请时:cellsurf = cellfun( @(I) detectSURFFeatures( I ), cellimg ); 其中我是一个灰度图像矩阵,我得到Error using cellfun SURFPoints output type is not currently implemented.跨度> @AhmedTarawneh 您使用的是什么版本的 Matlab?你能更新到最新版本吗? 是的,我现在以Scale: [10x1 single] SignOfLaplacian: [10x1 int8] Orientation: [10x1 single] Location: [10x2 single] Metric: [10x1 single] Count: 10 获得冲浪点,现在我如何使用这些点来计算距离,例如欧几里得距离......等等,换句话说**我如何检索相似的图像** 我正在使用 matlab 2014 @AhmedTarawneh SURFPoints output type is not supported. Set 'UniformOutput' to false. 我假设您收到此错误消息。虽然我很抱歉给你的代码不起作用,但问题很清楚。无论如何,我更新了代码以将“UniformOutput”包含为 false。 我的意思是这个冲浪点对象包含多个向量、比例向量、方向向量..我可以使用这些向量中的哪一个来表示图像(进行比较)?【参考方案2】:

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

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

【讨论】:

以上是关于Matlab中多幅图像的SURF描述符与匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 描述符与 findFundamentalMat 匹配

OpenCV - 使用 SURF 描述符和 BruteForceMatcher 进行对象匹配

SURF+GTM基于SURF特征提取,GTM去除错误配准点的图像匹配算法的MATLAB仿真

opencv中SURF特征提取的最佳hessian阈值+最小描述符匹配

MATLAB中怎么把多幅imagesc画出来的图像叠在一起,形成一个立体的图像

OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB