好的,我有两个大的3D二进制数组。我想计算这两个结构的表面点之间的最小距离,以获得阵列数据中显示的对象的周边体素之间的距离输出。
我知道我必须使用bwperim()
功能;即perim_a = bwperim(a,6);
& perim_b = bwperim(b,6);
然后我觉得我应该能够使用norm()
函数执行类似norm(perim_a - perim_b);
的操作,但我只是不断收到错误'Input must be 2d'
。有没有办法将norm()
函数应用于3D数据?
答案 0 :(得分:2)
如果我理解正确,你有两个3D体素代表周长 - 你想要一个体素之间的距离。我的方法是这样的(假设A
和B
是初始卷,并且它们的大小相同):
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的表面。
让我知道这是否可以让你找到你想要的答案......