在 3d 图像上计算一阶、二阶、三阶导数

calculate first,second,third derivative on 3d image

我真的有问题用 matlab 计算 3d 图像的一阶、二阶、三阶导数。

我有 60 片膝关节 mri 的 dicom 格式,我想计算导数。

对于二维图像,当我们想计算x或y方向的导数时,例如我们在x方向使用sobel或其他算子来计算x方向的导数。

但是在我有 60 片 dicom 格式的 3d 图像中,我如何计算 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;

更高维度的"first derivative"称为梯度向量。有许多公式可以对梯度进行数值近似,最近的一篇论文讨论了最准确的方法之一:Leclaire 等人的 "High Order Spatial Generalization of 2D and 3D Isotropic Discrete Gradient Operators with Fast Evaluation on GPUs"

不止一维的高阶导数是张量。 "second derivative" 特别是一个 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

"third derivative" 将是一个 3 阶张量,并且会有更多的分量。公式很长,可以通过考虑 F 的泰勒级数展开到三阶

有一个功能!查找 https://www.mathworks.com/help/images/ref/imgradient3.html,其中有指示梯度计算类型的选项:sobel 是默认值。

如果您想要方向梯度,请考虑使用 https://www.mathworks.com/help/images/ref/imgradientxyz.html,它具有相同的选项,但 returns 方向梯度 Gx、Gy 和 Gz。

volData = load('mri');
sz = volData.siz;
vol = squeeze(volData.D);
[Gx, Gy, Gz] = imgradientxyz(vol);

请注意,这些功能是在 R2016a 中引入的。