2017-08-16 48 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