如何在保持原始值的同时模糊三维点阵列?(Python)

2024-04-20 09:42:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个稀疏的3D值数组。我试图把每个“点”变成一个模糊的“球体”,通过对数组应用高斯滤波器。在

我希望点(x,y,z)的原始值保持不变。我只想在这一点上创建衰减值。。。但是应用高斯滤波器也会改变原始的(x,y,z)值。在

我目前正在执行以下操作:

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

有没有一种方法让我规范化,或者做一些事情使我的原始值仍然在这个新的dataCube中?我不一定要使用高斯滤波器,如果那不是最好的方法。在


Tags: 方法scipy数组gaussianfilter规范化事情filters
1条回答
网友
1楼 · 发布于 2024-04-20 09:42:56

您可以使用一个以1为中心值、宽度小于数据点间距的内核进行卷积。在

一维示例:

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")

给予

^{pr2}$

注意,fftconvolve对于大型数组可能要快得多。您还必须指定数组边界处应该发生什么。在

更新:三维示例

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.        ]

相关问题 更多 >