我正在使用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。 (王数据库)
答案 0 :(得分:2)
目前,我正在使用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 function。
注释
detectSURFFeatures
功能时指定其他“MetricThreshold”参数。detectBRISKFeatures
,detectFASTFeatures
,detectHarrisFeatures
,detectMinEigenFeatures
,detectMSERFeatures
答案 1 :(得分:1)
首先,detectSURFFeatures
仅为您提供兴趣点位置,比例和方向。您还必须调用extractFeatures
,它将为您提供SURF描述符,这些描述符是描述每个兴趣点周围的图像补丁的向量。
现在,您正在尝试将表示图像的一组补丁描述符转换为单个向量,并且有多种方法可以做到这一点。一种流行的方法叫做bag of features,也就是视觉词汇。