如何模糊点的 3D 数组,同时保持其原始值? (Python)

Posted

技术标签:

【中文标题】如何模糊点的 3D 数组,同时保持其原始值? (Python)【英文标题】:How to blur 3D array of points, while maintaining their original values? (Python) 【发布时间】:2018-01-25 03:49:17 【问题描述】:

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

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

我目前正在这样做:

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

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

【问题讨论】:

所以你知道如何过滤,但问题是值改变了?你不能把原始值写回新数组吗? @kazemakase 我想要一个峰值为 1 的 3d 高斯内核 【参考方案1】:

您可以使用一个以 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")

给予

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

【讨论】:

谢谢!这是朝着正确方向迈出的一步,但我仍然陷入困境。知道如何以编程方式制作 3D 非线性内核吗? fftconvolve 文档中的第二个示例展示了如何构建二维高斯核。或者,您也可以坚持使用gaussian_filter,但将输出乘以np.sqrt(2*np.pi * sigma**2)**3。这应该很好地保留数据值,除非sigma 很大和/或truncate 很小。 我看到了这个例子,谢谢,但我也不知道如何从 2D 转到 3D。该示例显示np.outer(signal.gaussian(70, 8), signal.gaussian(70, 8))。那我该怎么办呢?

以上是关于如何模糊点的 3D 数组,同时保持其原始值? (Python)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中反转数组,同时保留原始数组的原始值? [复制]

旋转和裁剪图像,同时保持其原始大小

如何多次移动二维数组的列,同时仍考虑其原始位置?

如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)

将希尔伯特值映射到 3D 点

如何在 Qt 中从 3d 点数组中绘制和保存 3D 模型?