2012-06-29 32 views
3

我試圖計算Python中的3D索貝爾濾波器。我有一個很好的代碼,用於下面的2D圖像。python中的3D sobel算法?

BTW。我的原始圖像是uint8類型。

preSobel = preSobel.astype('int32') 
    dx = ndimage.sobel(preSobel, 0) # horizontal derivative 
    dy = ndimage.sobel(preSobel, 1) # vertical derivative 
    mag = numpy.hypot(dx, dy) # magnitude 
    mag *= 255.0/numpy.max(mag) # normalize (Q&D) 
    img[i,:,:]=mag 

但是從我的wiki page的瞭解計算2D,我應該成倍的增加了一維索貝爾結果,而不是hypot將:迷茫

反正要到3D,我想我需要計算1D索貝爾在每一個軸上,然後乘以所有,但我不知道...有沒有什麼庫可以更快地計算3d索貝爾?

+1

維基給你準確的3x3x3卷積內核使用,爲什麼不使用它? – Kos

+0

總是從頭開始實施算法以獲得更好的理解。但是如果你想用庫來解決問題,或者比較你的結果,你會發現它已經從scikit實現。請參閱協調慣例下的http://scikit-image.org/docs/dev/user_guide/numpy_images.html。 – SeF

回答

4

首先,參照你的wikipedia link:乘法有指構建索貝爾對合內核,而不是最終結果的方式。

對於你需要一個內核來獲得x方向導數二維索貝爾過濾器,而另一個內核來獲得在Y方向,例如導數 enter image description here

這實際上是你的兩個命令所做的,所以如果你使用numpy,你不需要自己構造這些內核。

dx = ndimage.sobel(preSobel, 0) # horizontal derivative 
dy = ndimage.sobel(preSobel, 1) # vertical derivative 

現在對於3D案例,您需要3個操作,3個內核,一個用於dx,dy,dz。 鏈接的維基部分是告訴你如何通過乘以組件來構建內核。對於DZ完成的內核索貝爾例如是一個3x3x3的矩陣,看起來像這樣:

enter image description here

爲了得到你還是事後採取平方衍生物(斜邊)的平方根的幅度。

我沒有numpy的,但據我可以從the documentation告訴ndimage索貝爾命令可以處理任何數量的尺寸,如此反覆,都已經提供的內核:

dx = ndimage.sobel(your3Dmatrix, 0) # x derivative 
dy = ndimage.sobel(your3Dmatrix, 1) # y derivative 
dz = ndimage.sobel(your3Dmatrix, 2) # z derivative 
現在

斜邊命令大概只需要2個參數,所以你必須找到另一種方式來有效地計算MAG =開方(DX DX + DY DY + DZ * DZ)。 但NumPy應該有你需要的一切。


更新

其實,如果你只在幅度興趣反正there is a complete function in numpy for this

mag = generic_gradient_magnitude(your3Dmatrix, sobel)