找到两个3d矢量的最小欧几里德距离

时间:2014-01-30 22:00:40

标签: matlab euclidean-distance

好的,我有两个大的3D二进制数组。我想计算这两个结构的表面点之间的最小距离,以获得阵列数据中显示的对象的周边体素之间的距离输出。

我知道我必须使用bwperim()功能;即perim_a = bwperim(a,6);& perim_b = bwperim(b,6);然后我觉得我应该能够使用norm()函数执行类似norm(perim_a - perim_b);的操作,但我只是不断收到错误'Input must be 2d'。有没有办法将norm()函数应用于3D数据?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你有两个3D体素代表周长 - 你想要一个体素之间的距离。我的方法是这样的(假设AB是初始卷,并且它们的大小相同):

Aperi = bwperim(A,6);
Bperi = bwperim(B,6);

现在我们需要非零体素的坐标:

sz = size(A);
[xx yy zz] = meshgrid(1:sz(1), 1:sz(2), 1:sz(3));

indxA = find(Aperi==1);
posA = [xx(indxA(:)) yy(indxA(:)) zz(indxA(:))]; % a Nx3 matrix of x,y,z positions
indxB = find(Bperi==1);
posB = [xx(indxB(:)) yy(indxB(:)) zz(indxB(:))]; % a Mx3 matrix - note N ~= M

现在你有两个2D矩阵,你可以区分点 - 但你不知道你想要比较哪些对,所以你需要更多的工作:

delta = bsxfun(@minus, reshape(posA, 1, [], 3), reshape(posB, [], 1, 3) );

现在delta的尺寸为[M N 3],posA和posB中的每对点之间存在差异。距离是

distance = sqrt(sum(delta.*delta, 3));

对于A中的每个点,到B中最近点的距离是

closest = min(distance);

这将是[1 N]行向量。

要将这些值放回原始矩阵中,您需要返回到开头的索引:

distMatrix = zeros(size(A));
distMatrix(indxA) = closest;

而且我认为你现在将B周边的最近点与A周边的每个点的距离映射到A的表面。

让我知道这是否可以让你找到你想要的答案......