我真的有问题用matlab计算3d图像上的第一,第二,第三衍生物。
我有60片dicom格式的膝盖mri,我想计算衍生物。
当我们想要在x或y方向上计算导数时,对于2d图像,例如我们在x方向上使用sobel或其他算子来计算x方向上的导数。
但在3d图像中我有60片dicom格式,我如何计算x,y,z方向上的一阶,二阶和三阶导数。 我实现这样的一阶导数:
F是具有所有切片的3d矩阵。 [k,l,m] =大小(F);
但我认为这不是真的。请帮助我,我真的需要你的答案。
我们如何计算x,y,z方向上的一阶,二阶,三阶导数。?
案例'x'
D(1,:,:) = (F(2,:,:) - F(1,:,:));
D(k,:,:) = (F(k,:,:) - F(k-1,:,:));
D(2:k-1,:,:) = (F(3:k,:,:)-F(1:k-2,:,:))/2;
案例'y'
D(:,1,:) = (F(:,2,:) - F(:,1,:));
D(:,l,:) = (F(:,l,:) - F(:,l-1,:));
D(:,2:l-1,:) = (F(:,3:l,:)-F(:,1:l-2,:))/2;
案例'z'
D(:,:,1) = (F(:,:,2) - F(:,:,1));
D(:,:,m) = (F(:,:,m) - F(:,:,m-1));
D(:,:,2:m-1) = (F(:,:,3:m)-F(:,:,1:m-2))/2;
答案 0 :(得分:0)
更高维度的“一阶导数”称为梯度向量。有许多公式可以在数值上逼近梯度,最近的一篇论文中讨论了一种最精确的方法:Leclaire等人的“对GPU进行快速评估的2D和3D各向同性离散梯度算子的高阶空间推广”
多维度中的高阶导数是张量。 “二阶导数”特别是秩-2张量,有6个独立分量,其中最低阶逼近
Dxx(x,y,z) = (F(x+1,y,z) - 2*F(x,y,z) + F(x-1,y,z))/2
Dyy(x,y,z) = (F(x,y+1,z) - 2*F(x,y,z) + F(x,y-1,z))/2
Dzz(x,y,z) = (F(x,y,z+1) - 2*F(x,y,z) + F(x,y,z-1))/2
Dxy(x,y,z) = (F(x+1,y+1,z) - F(x+1,y-1,z) - F(x-1,y+1,z) + F(x-1,y-1,z))/4
Dxz(x,y,z) = (F(x+1,y,z+1) - F(x+1,y,z-1) - F(x-1,y,z+1) + F(x-1,y,z-1))/4
Dyz(x,y,z) = (F(x,y+1,z+1) - F(x,y+1,z-1) - F(x,y-1,z+1) + F(x,y-1,z-1))/4
“三阶导数”将是一个等级3张量,并将有更多的组件。公式是长度的,并且可以通过考虑F的泰勒级数展开直到第三级来推导出公式
答案 1 :(得分:0)
有一个功能!查找https://www.mathworks.com/help/images/ref/imgradient3.html,其中有选项可指示梯度计算的类型:sobel是默认值。
如果您想要方向渐变,请考虑使用https://www.mathworks.com/help/images/ref/imgradientxyz.html,它具有相同的可用选项,但会返回方向渐变Gx,Gy和Gz。
volData = load('mri');
sz = volData.siz;
vol = squeeze(volData.D);
[Gx, Gy, Gz] = imgradientxyz(vol);
请注意,这些功能是在R2016a中引入的。