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');
6、计算描述子
vl_covdet还可以用来计算描述子,目前为止支持三种:SIFT、LIOP和raw patches(原始补丁,可以从中计算任何其他描述子)。
要使用此功能,只需添加输出参数:
[frames,descrs] = vl_covdet(imgs);
这将计算所有功能的SIFT描述符。每列descrs是单精度的128维描述符向量。或者,要计算补丁使用:
[frames,descrs] = vl_covdet(imgs,'descriptor','liop');
使用默认设置,每列将是单精度的144维描述符向量。如果要更改设置,请使用LIOP教程中描述的参数
[frames,descrs] = vl_covdet(imgs,'descriptor','patch');
在这种情况下,每列descrs是堆叠的补丁。为了可视化前100个补丁,可以使用例如:
w = sqrt(size(patches,1));
vl_imarraysc(reshape(patches(:,1:10 * 10),w,w,[]));
用标准检测器(左)提取补丁并添加仿射适应(右)。
有几个参数会影响与要素关联的修补程序。首先,PatchRelativeExtent可用于控制补丁相对于要素比例的大小。范围是补丁域的一半,帧参考帧中的正方形。由于大多数检测器锁定在图像结构(例如,斑点)上,在标准化帧参考中,其具有与半径1的圆相当的尺寸,将PatchRelativeExtent设置为6使得贴片大约是角结构的尺寸的六倍。这大约是SIFT特征描述符的默认范围
第二个重要参数是PatchRelativeSigma,它表示在规范化的补丁帧中应用于图像的平滑量。默认情况下,此值设置为1.0,但可以缩小以获得更清晰的补丁。当然,平滑量受到输入图像的分辨率的限制:由于后者的有限采样率,例如小于半个像素的平滑无法恢复。此外,必须对贴片进行足够精细的采样以避免混叠。
最后一个参数是PatchResolution。如果这等于ww,那么贴片的边长为2w + 12w + 1像素。 (因此,归一化帧中的采样步骤由PatchRelativeExtent / PatchResolution给出)。可能需要提取更高分辨率的贴片以获得更大的范围和更小的平滑度。此参数的良好设置可能是PatchRelativeExtent / PatchRelativeSigma。
% load image
im = vl_impattern('roofs1');
% show image
figure(1);
% clear old picture in the window
clf;
image(im); axis image off;
% 将图像转换为灰度空间和单精度, 然后调用vl_covdet以提取特征(默认情况下,它使用DoG角度测量,类似于SIFT)
imgs = im2single(rgb2gray(im));
[frames, descrs] = vl_covdet(imgs, 'descriptor', 'patch');
% 可视化补丁
w = sqrt(size(descrs, 1));
vl_imarraysc(reshape(descrs(:, 1: 10 * 10), w, w, []));
7、自定义特征帧
可以使用vl_covdet来计算自定义特征帧的描述子,或者将仿射适应和方向估计应用于自定义特征帧。
% load image
im = vl_impattern('roofs1');
% show image
figure(1);
% clear old picture in the window
clf;
image(im); axis image off;
% 将图像转换为灰度空间和单精度, 然后调用vl_covdet以提取特征(默认情况下,它使用DoG角度测量,类似于SIFT)
imgs = im2single(rgb2gray(im));
% 自定义特征帧
delta = 30
xr = delta:delta:size(im, 2) - delta + 1;
yr = delta:delta:size(im, 1) - delta + 1;
[x, y] = meshgrid(xr, yr);
frames = [x(:)';y(:)'];
frames(end + 1, :) = delta / 2;
[frames, patches] = vl_covdet(imgs,...
'frames', frames,...
'estimateAffineShape', true,...
'estimateOrientation', true);
hold on ;
vl_plotframe(frames) ;
8、获得规模空间
vl_covdet可以返回有关功能的其他信息,包括每个检测到的功能的比例空间和分数。
[frames, descrs, info] = vl_covdet(imgs) ;
info即为获取到的信息。