【发布时间】:2016-05-06 09:06:52
【问题描述】:
我一直在尝试研究如何在 Python 中复制 IDL 的平滑功能,但我无法得到类似的结果。 (免责声明:自从我接触这种数学问题以来可能已经有 10 年了,所以它已经被丢弃,以便为诸如在哪里可以找到最便宜的当地燃料之类的信息让路)。我正在尝试对此进行编码:
smooth(b,w,/nan)
其中 b 是包含 NAN 的 2D 浮点数组(零 - 缺失数据 - 也已转换为 NAN)。
从 IDL 文档来看,使用 boxcar 似乎很顺利,所以从 scipy.ndimage.filters 我尝试过:
bsmooth = uniform_filter(b, w)
我知道这里有一些根本区别:
- IDL 的默认边缘行为是“复制端点 从原始数组到没有平滑的结果”而我 似乎没有使用统一过滤器执行此操作的选项。
- NaN 元素的处理。在 IDL 中,/nan 关键字似乎 意味着在可能的情况下,NaN 值将由结果填充 窗口中的其他点。如果没有有效的积分 通过 MISSING 关键字生成结果。我以为我可以 在使用平滑之后近似此行为 scipy.interpolate 的 NearestNDInterpolator (感谢辉煌 亚历克斯在这里的解释: filling gaps on an image using numpy and scipy)
这是我的测试数组:
>>>b array([[ 0.97599638, 0.93114936, 0.87070072, 0.5379253 ],
[ 0.34873217, nan, 0.40985891, 0.22407863],
[ nan, nan, nan, 0.67532134],
[ nan, nan, 0.85441768, nan]])
无论我是否使用 /nan 关键字,我的回答都与 IDL 没有一点相似之处。
IDL> smooth(b,2,/nan)
0.97599638 0.93114936 0.87070072 0.53792530
0.34873217 0.70728749 0.60817236 0.22407863
NaN 0.53766960 0.54091913 0.67532134
NaN NaN 0.85441768 NaN
IDL> smooth(b,2)
0.97599638 0.93114936 0.87070072 0.53792530
0.34873217 -NaN -NaN 0.22407863
-NaN -NaN -NaN 0.67532134
-NaN -NaN 0.85441768 NaN
我承认我发现 scipy 文档在细节上相当稀疏,所以我不知道我是否真的在做我认为我在做的事情。我认为这两种 python 方法都能平滑图像给出不同答案的事实表明,事情并不是我理解的那样。
>>>uniform_filter(b, 2)
array([[ 0.97599638, 0.95357287, 0.90092504, 0.70431301],
[ 0.66236428, nan, nan, nan],
[ nan, nan, nan, nan],
[ nan, nan, nan, nan]])
我觉得它太空了有点奇怪,所以我尝试了一个包含 100 个元素的数组(仍然使用 2 个窗口)并输出图像。结果(第一张图片是“b”第二张是“bsmooth”)并不是我所希望的:
回到较小的数组并按照以下示例进行操作:http://scipy.github.io/old-wiki/pages/Cookbook/SignalSmooth,我认为它会提供与 uniform_filter 相同的输出,我尝试了:
>>> box = np.array([1,1,1,1])
>>> box = box.reshape(2,2)
>>> box
array([[1, 1],
[1, 1]])
>>> bsmooth = scipy.signal.convolve2d(b,box,mode='same')
>>> print bsmooth
[[ 0.97599638 1.90714574 1.80185008 1.40862602]
[ 1.32472855 nan nan 2.04256356]
[ nan nan nan nan]
[ nan nan nan nan]]
显然我完全误解了 scipy 函数,甚至可能是 IDL 函数。如果有人能帮助我尽可能地复制 IDL 平滑功能,我将不胜感激。我面临着相当大的时间压力来获得一个不依赖于 IDL 的解决方案,我正在掷硬币来决定是从头开始编写函数还是开发一种传染性很强的疾病。
如何在 python 中进行同样的平滑处理?
【问题讨论】:
-
就是这个。我不知道我怎么错过了我一直在寻找和寻找的问题。不过这个问题很有帮助。
标签: python-2.7 numpy scipy smooth idl-programming-language