VLfeat是一个开源BSD的轻量级的计算机视觉库算法,主要实现了SIFT、MSER、K-means、hierarchical、agglomerative information bottleneck,quick shift等算法,采用C语言编写而成,提供了MATLAB接口,文档详细,且支持跨平台,对于分类和识别特别有用。
安转编译VLfeat:https://blog.csdn.net/u011718701/article/details/51452011
首先介绍vl_covdet命令,该命令实现了许多共变量特征检测器和相应的描述子。
1、DoG检测器
示例代码:
% 加载图片
im = vl_impattern('roofs1');
% 显示加载的图片
figure(1);
% 清楚窗口上的旧图片
clf;
image(im); axis image off;
% 将图像转换为灰度空间和单精度, 然后调用vl_covdet以提取特征(默认情况下,它使用DoG角度测量,类似于SIFT)
imgs = im2single(rgb2gray(im));
frames = vl_covdet(imgs, 'verbose');
% vl_plotframe:用于显示提取到的特征
hold on;
vl_plotframe(frames);
原图:
运行结果:
verbose选项不是必需的,但是它可以提供下面这些信息。
vl_covdet: doubling image: yes
vl_covdet: octave_resolution: 3
vl_covdet: num_octaves: -1
vl_covdet: max_num_orientations: 4
vl_covdet: detector: DoG
vl_covdet: peak threshold: 0.01, edge threshold: 10
vl_covdet: 87 features suppressed as duplicate (threshold: 0.5)
vl_covdet: detected 3409 features
vl_covdet: kept 3362 inside the boundary margin (2)
2、除了DoG检测器之外,vl_covdet还支持许多其他检测器:
The Difference of Gaussian operator(也称为Hessian算子或拉普拉斯算子的轨迹)使用多尺度拉普拉斯算子的局部极值轨迹来检测尺度和空间中的特征(如SIFT中所示)。
Hessian算子使用Hessian算子的多尺度行列式的局部极值。
Hessian Laplace检测器使用Hessian算子的多尺度行列式的极值来进行空间定位,并使用多尺度拉普拉斯算子的极值进行尺度定位。
Harris Laplace使用多尺度Harris角度测量而不是Hessian的行列式来定位空间,并且在其他方面与之前的探测器相同。
Hessian Multiscale通过使用Hessian算子的多尺度行列式来检测多个尺度的空间特征,但不会尝试估计它们的尺度。
Harris Multiscale与前一个类似,但使用的是多尺度Harris测量。
例如:HarrisLaplace
将frames = vl_covdet(imgs, 'verbose');替换为frames = vl_covdet(imgs, 'method',‘HarrisLaplace’);即可
3、特征框架的几何含义:
由vl_covdet计算的特征是定向矩形,由平移(transaction )TT和线性图(linear map)AA(a 2x2)定义,可以如下提取:
T=frame(1:2);
A = reshape(frame(3:6), 2,2);
map(A,T)将像素从特征帧(也称为归一化补丁域)移动到图像帧,该特征表示为以特征参考系中的原点为中心的单位半径的圆,并且通过(A, T)将其转换为图像椭圆。
在范围方面,标准化的补丁域是以原点为中心的方框,而图像域使用标准MATLAB约定并从(1,1)开始,Y轴向下,X轴向右,这些概念在规范化补丁和描述符的计算中很重要。
4、仿射适应(Affine adaptation)
仿射适应是估计图像区域的仿射形状以便构建仿射共变特征帧的过程,这对于校正倾斜图像的变形是有用的:例如出现小的透视畸变,打开仿射适应的代码:
frames = vl_covdet(imgs,'EstimateAffineShape',true);
结果:
5、特征方向(Feature orientation)
到目前所讨论的检测方法是旋转不变的,这意味着无论图像旋转如何,他们都会检测到相同的圆形或者椭圆形区域,但它们不允许固定和标准化特征框架中的旋转。默认情况下估计特征是直立的(这意味着仿射变换(A,T)将垂直轴(0,1)映射到自身)。为了计算旋转不变描述符,需要去除特征框架的旋转效果,可以通过指定EstimateOrientation选项实现:
frames = vl_covdet(imgs, "EstimateOrientation", true, 'verbose');