【发布时间】:2016-09-24 02:07:50
【问题描述】:
我正在尝试实现 SIFT 算法。我有一个维度为 (3, m, n) 的矩阵,例如 D。对于矩阵中间层的每个点,即在 A(2,:,:) 中(Matlab 是 1-indexed),我需要在该点的 3x3 邻域中找到局部最小值。我这样做的方式是一种非常幼稚的方式如下:
img = D(2, :, :);
for r = 2:size(img, 1)-1
for c = 2:size(img, 2)-1
nbr = D(:, (r-1):(r+1), (c-1):(c+1));
if abs(D(2,r,c) - min(nbr(:))) <= eps(0.5) || abs(D(2,r,c) - max(nbr(:))) <= eps(0.5)
x = [x; r];
y = [y; c];
end
end
end
但是这种计算速度非常慢。有没有办法更快地做到这一点?
【问题讨论】:
-
在您的
if中,您正在比较D(r,c)和min(nbr(:))但是,nbr包含D(r,c),即D(1, r, c)。你的代码能给你正确的答案吗?我想它只会给你空数组。 -
你是对的。它给了我一个错误。它是 D(2,r,c)
-
那仍然没有给出正确的答案。也许你想要
D(2,r,c)>min(nbr(:)),这意味着'中心不是最小值' -
我又做了一个编辑。我试图找出该点是否是局部最小值。 D(2,r,c) 是兴趣点。 min(nbr(:)) 给出邻域的最小值。 abs(D(2,r,c) - min(nbr(:)))
-
你有图像处理工具箱吗?有几个函数可以在一行中完成。