Matlab 沿骨架化三维遮罩的最短路径

Matlab 沿骨架化三维遮罩的最短路径,matlab,shortest-path,dijkstra,marching-cubes,image-morphology,Matlab,Shortest Path,Dijkstra,Marching Cubes,Image Morphology,我有一个带有曲线(骨架化数据)的3D阵列,需要找到这些线上两点之间的最短连接路径 如何在Matlab中沿三维骨架阵列找到两点之间的最短路径? 在mathworks论坛上。但大多数答案都指向寻找最短路径,而不是沿着骨架搜索。如果我试图沿着骨架强制它,它也会返回路径,这些路径不是在两点之间,而是远离两点。还有一些人们建议的matlab函数只能处理2D数据(如bwdistgeodesic,可用于避开非骨架体素) 我从文件交换中找到了两个。我是这样做的: %get data load mri D = d

我有一个带有曲线(骨架化数据)的3D阵列,需要找到这些线上两点之间的最短连接路径

如何在Matlab中沿三维骨架阵列找到两点之间的最短路径?

在mathworks论坛上。但大多数答案都指向寻找最短路径,而不是沿着骨架搜索。如果我试图沿着骨架强制它,它也会返回路径,这些路径不是在两点之间,而是远离两点。还有一些人们建议的matlab函数只能处理2D数据(如
bwdistgeodesic
,可用于避开非骨架体素)

我从文件交换中找到了两个。我是这样做的:

%get data
load mri
D = double(squeeze(D)); D = D./max(D(:)); D = real(ifft(ifft(ifft(ifftshift(ifftshift(ifftshift( padarray( fftshift(fftshift(fftshift(fft(fft(fft(D,[],1),[],2),[],3),1),2),3), size(D),0,'both' ) ,1),2),3),[],1),[],2),[],3));
figure; ax(1) = subplot(1,3,1); imshow(mean(D,3),[]); title('mean image')

%find vasculature
spacing = [1 1 1];sigmas = [0.5:0.5:2];tau = 1;whiteondark = false;Dvess = vesselness3D(D, sigmas, spacing, tau, whiteondark);
ax(2) = subplot(1,3,2); imshow(imfuse(squeeze(max(Dvess,[],3)), squeeze(max(Dvess>0.5,[],3))),[]); title('masked "vessels"')

%skeletonize
Dskel = Skeleton3D(Dvess>0.5);
ax(3) = subplot(1,3,3); imshow(imfuse(squeeze(max(Dskel,[],3)), squeeze(max(Dvess>0.5,[],3))),[]); title('skeletonized mask'); linkaxes(ax); zoom(2);

%select seeds
corline1 = imline(); idx1 = find(repmat(corline1.createMask, [1 1 size(Dskel,3)]).*Dskel); [sub11, sub21, sub31] = ind2sub(size(Dskel), idx1);
corline2 = imline(); idx2 = find(repmat(corline2.createMask, [1 1 size(Dskel,3)]).*Dskel); [sub12, sub22, sub32] = ind2sub(size(Dskel), idx2);
到目前为止,这些结果都很好:

右图中的白线显示骨架,蓝线显示种子。但是如果我尝试应用距离变换,我无法找到最短路径:

%distance map
dist1 = zeros(size(Dskel)); dist1(sub11, sub21, sub31) = 1; dist1 = bwdist(dist1);
dist2 = zeros(size(Dskel)); dist2(sub12, sub22, sub32) = 1; dist2 = bwdist(dist2);
dist12 = dist1+dist2;

%path
path1 = imregionalmin(Dskel.*dist12);
path2 = imregionalmin(Dskel.*dist12+10000.*(~Dskel));
%path3 = imregionalmin(Dskel.*dist12+Inf.*Dskel); %function cant handle inf

figure; ax(1) = subplot(1,3,1); imshow(squeeze(sum(double(path1),3)),[]); title('')
ax(2) = subplot(1,3,2); imshow(squeeze(sum(double(path2),3)),[]); title('')
%ax(2) = subplot(1,3,2); imshow(squeeze(sum(double(path3),3)),[]); title('')
linkaxes(ax); zoom(3);

第一个发现了几乎整个骨架,第二个看起来像是伪造的。区域最小值显然不适合找到路径,但不确定还会是什么。此外,我的距离计算没有考虑骨架,我在第二条路径中尝试绕过骨架,但也没有很好地工作

我应该做什么不同



刚找到一个名为“”的东西,也许可以。现在查看。

bwdistgeodesic接受三维数据网格。我还建议查看IPT中的imsegfmm,它也接受三维数据。这两种方法中的任何一种都适用于您@AlexTaylor
D=BWDistoEdesic(Dskel,sub11,sub21,sub31)
没有运行,但现在您再次指向它,我看到它也可以使用掩码或线性索引。谢谢还将介绍imsegfmm。