2016-03-21 303 views
0

真的,我有一個問題,用matlab計算三維圖像的一階,二階,三階導數。計算三維圖像的一階,二階,三階導數

我有60片dicom格式的膝關節mri,我想計算導數。

當我們想要計算x或y方向上的導數時,例如我們使用sobel或x方向上的另一個算子來計算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; 
+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中引入的。

+0

太棒了,太神奇了,非常感謝,我能用高斯濾波器代替sobel等一些預定義的濾波器嗎?如果我使用ix而不是原始圖像,ixx將會輸出? –

+0

如果你想高斯模糊圖像,你也可以用高斯內核對它進行預過濾。根據你對ix和ixx是什麼的定義,我認爲採用衍生圖像的衍生應該給你二階導數。 – akamath

+0

感謝親愛的akamath。 –

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張量,將有更組件。公式是長的,可以通過考慮一個泰勒級數展開到3階來得到