Van egy 3D tömböm ívelt vonalakkal (vázas adatok), és meg kell találnom a legrövidebb összekötő utat ezeken a vonalakon lévő két pont között.
Hogyan találhatom meg a legrövidebb utat két pont között egy 3D-s csontváz tömb mentén a Matlabban?
Ott ezek több ember a> kérdezés a hasonló kérdés mindkettő itt és tovább a matematikai fórum. A legtöbb válasz azonban erre a blogbejegyzésre a legrövidebb utak megtalálásában, ami nem egy csontváz mentén keres. Ha megpróbálom a csontváz mentén erőltetni, akkor olyan utakat is visszaad, amelyek nem a két pont között vannak, hanem mindkettőtől távolabb. Néhány Matlab függvény is, amelyekről az emberek azt mondják, hogy csak 2D-s adatokat kezelhetnek (mint például a bwdistgeodesic
, amely a nem csontváz voxelek elkerülésére használható).
használok két függvényeket a fájlcseréből. Íme, amit csinálok:
%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);
Eddig ezekkel az eredményekkel jó:
A jobb oldali képen a fehér vonalak a csontvázat, a kék vonalak pedig a magokat mutatják. De ha megpróbálok távolságtranszformációt alkalmazni, nem találom a legrövidebb utat:
%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);
Az első lelet nagyjából a teljes csontvázat megtalálja, a második pedig hamisnak tűnik. A regionális minimum határozottan nem megfelelő az út megtalálásához, de nem biztos, hogy mi lenne más. A távolságszámításom sem veszi figyelembe a csontvázat, amit a második úton próbáltam megkerülni, de az sem működött jól.
Mit csináljak másképp?
Most találtam egy „gyors menetelés nevű dolgot, talán munka. Most nézd meg.