2017-08-16 50 views
0

我有一個稀疏的三維數組值。我試圖通過對數組應用高斯濾波器來將每個「點」變成模糊的「球體」。如何在保持原始值的同時模糊三維點陣列? (Python)

我想要點(x,y,z)的原始值保持不變。我只想在這個點附近創建衰減值......但應用高斯濾波器也會改變原始(x,y,z)值。

我目前這樣做:

dataCube = scipy.ndimage.filters.gaussian_filter(dataCube, 3, truncate=8)

有沒有辦法對我來說,這個正常化,或者做一些讓自己的原始值仍然在這個新的數據立方體?如果這不是最好的方法,我不一定要使用高斯濾波器。

+0

所以,你知道如何篩選,但問題是,這些值的變化?難道你不能只將原始值寫回新數組中嗎? – kazemakase

+0

@kazemakase我想要一個3d高斯內核,其峯值爲1 – Kalina

回答

2

可以使用以1爲中心值,寬度小於數據點之間間距的內核進行卷積。

1-d例如:

import numpy as np 
import scipy.signal 
data = np.array([0,0,0,0,0,5,0,0,0,0,0]) 
kernel = np.array([0.5,1,0.5]) 
scipy.signal.convolve(data, kernel, mode="same") 

array([ 0. , 0. , 0. , 0. , 2.5, 5. , 2.5, 0. , 0. , 0. , 0. ]) 

注意fftconvolve可能是大型陣列更快。您還必須指定在數組邊界處應發生的情況。

更新: 3 d例如

import numpy as np 
from scipy import signal 

# first build the smoothing kernel 
sigma = 1.0  # width of kernel 
x = np.arange(-3,4,1) # coordinate arrays -- make sure they contain 0! 
y = np.arange(-3,4,1) 
z = np.arange(-3,4,1) 
xx, yy, zz = np.meshgrid(x,y,z) 
kernel = np.exp(-(xx**2 + yy**2 + zz**2)/(2*sigma**2)) 

# apply to sample data 
data = np.zeros((11,11,11)) 
data[5,5,5] = 5. 
filtered = signal.convolve(data, kernel, mode="same") 

# check output 
print filtered[:,5,5] 

[ 0.   0.   0.05554498 0.67667642 3.0326533 5.   3.0326533 
    0.67667642 0.05554498 0.   0.  ] 
+0

謝謝!這是朝正確方向邁出的一步,但我仍然陷入困境。任何想法如何以編程方式製作3D非線性內核? – Kalina

+1

[fftconvolve](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolve.html#scipy.signal.fftconvolve)文檔中的第二個示例顯示瞭如何構建一個兩層頁面,二維高斯核。或者,您也可以堅持'gaussian_filter',但將輸出與'np.sqrt(2 * np.pi * sigma ** 2)** 3'相乘。除非'sigma'很大和/或'truncate'很小,否則這應該很好地保持數據值。 – user8153

+0

我看到了這個例子,謝謝,但我不知道如何從2D到3D。這個例子說'np.outer(signal.gaussian(70,8),signal.gaussian(70,8))'。那麼我該怎麼做? – Kalina