【问题标题】:Find local minima in neighborhood in 3D matrix in Matlab在Matlab的3D矩阵中找到邻域的局部最小值
【发布时间】: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)&gt;min(nbr(:)),这意味着'中心不是最小值'
  • 我又做了一个编辑。我试图找出该点是否是局部最小值。 D(2,r,c) 是兴趣点。 min(nbr(:)) 给出邻域的最小值。 abs(D(2,r,c) - min(nbr(:)))
  • 你有图像处理工具箱吗?有几个函数可以在一行中完成。

标签: matlab matrix


【解决方案1】:

您可以尝试使用此代码:

Nr = size(D, 2); Nc = size(D, 3);
[r0,c0] = meshgrid(-1:1, -1:1);
[r,c]   = meshgrid(2:Nr-1, 2:Nc-1);
r = r(:);
c = c(:);

nbr1 = squeeze(D(1, :, :));
nbr2 = squeeze(D(2, :, :));
nbr3 = squeeze(D(3, :, :));
ind1 = bsxfun(@plus,r,r0(:)') + (bsxfun(@plus,c,c0(:)')-1)*Nr;
nbr0 = nbr2(r + (c-1)*Nr);
nbrx = [nbr1(ind1), nbr2(ind1), nbr3(ind1)];

condition = abs(nbr0-min(nbrx,[],2)) <= eps(0.5) | abs(nbr0-max(nbrx,[],2)) <= eps(0.5);

x = r(condition);
y = c(condition);
[x,y]

对于大型矩阵应该更快。

为避免squeeze 函数,重新排序索引(dimension (m, n, 3) 而不是dimension (3, m, n))。因此:

Nr = size(D, 1); Nc = size(D, 2);

nbr1 = D(:, :, 1);
nbr2 = D(:, :, 2);
nbr3 = D(:, :, 3);

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多