密集sift matlab代码
时间: 2023-05-14 18:01:04 浏览: 160
SIFTMatlab代码
密集SIFT是一种用于图像特征提取的算法,相较于普通SIFT算法,它可以提取更加密集的关键点,从而获得更加详细的图像特征。以下是一份基于MATLAB的密集SIFT代码。
首先,定义SIFT参数:
scale = 2; % 尺度因子
step = 3; % 间隔步长
filter_size = 16; % 高斯滤波器大小
magnif = 3; % 尺度到尺度空间放大系数
threshold = 0.03; % 阈值
接着,载入图像,并生成高斯金字塔:
I = imread('test.jpg'); % 载入图像
I = im2double(rgb2gray(I)); % 转为灰度图并归一化
I_blur = conv2(I, fspecial('gaussian', filter_size, 1));
% 生成高斯金字塔
scales = ceil(magnif * (1:step*scale));
num_octaves = floor(log2(min(size(I)))-3) + 1;
for octave = 1:num_octaves
for s = 1:numel(scales)
sigma = scales(s) / magnif;
if s==1 && octave>1
I1 = I_blur(1:2:end, 1:2:end);
elseif s==1 && octave==1
I1 = I_blur;
else
I1 = conv2(I_blur, fspecial('gaussian', filter_size, sigma), 'same');
I1 = I1(1:2:end, 1:2:end);
end
end
end
定义对比度归一化SIFT特征计算函数,其中使用了HOG算法和尺度不变性:
function [f, d] = sift_dn(I)
[Dx, Dy] = gradient(I); % 计算梯度
mags = sqrt(Dx.^2 + Dy.^2);
angles = atan2(Dy, Dx); % 计算角度
angles(angles<0) = angles(angles<0) + pi; % 调整角度范围在[0,pi)
histo_n = 4; % HOG直方图的bin数量
descr_n = 128; % 描述子维度
descr_mag_thr = 0.154; % 描述子向量归一化阈值
[hist_1, edges] = histcounts(angles(:), histo_n); % 计算角度直方图
hist_2 = histcounts(angles(:), edges, mags(:), histo_n); % 计算梯度幅值加权角度直方图
hist = [hist_1; hist_2(:)];
hist = hist / sum(hist); % 归一化
d = hist(:); % 将直方图转为描述子
if norm(d) > descr_mag_thr
d = d / norm(d); % 描述向量归一化
else
d = zeros(descr_n, 1);
end
f = [0; 0; 1; 0; d]; % SIFT特征向量中的5个元素:x,y,尺度,方向,描述子
end
针对每个高斯金字塔层,提取密集SIFT特征:
patch_size = filter_size * 2; % 提取特征的patch大小
features = []; % 存储图像所有特征点的向量
for octave = 1:num_octaves
for s = 1:numel(scales)
x_s = patch_size / 2 + 1;
y_s = patch_size / 2 + 1;
[h, w] = size(I1);
while (x_s <= w - patch_size / 2)
while (y_s <= h - patch_size / 2)
patch = I1(y_s-patch_size/2:y_s+patch_size/2-1, x_s-patch_size/2:x_s+patch_size/2-1);
[f, d] = sift_dn(patch);
f(1) = x_s;
f(2) = y_s;
f(3) = log2(scales(s) / magnif) + octave;
features(:, end+1) = f;
y_s = y_s + filter_size / step;
end
x_s = x_s + filter_size / step;
y_s = patch_size / 2 + 1;
end
end
end
最后,利用K-means算法对特征向量进行聚类,得到视觉词汇表:
[~, centers] = kmeans(features(5:end,:)', 300);
至此,我们就成功地用MATLAB实现了密集SIFT特征提取,并得到了视觉词汇表。这些特征向量可以被用于图像识别、分类、定位等诸多任务。
阅读全文