简单任务。。我想用高斯函数平滑一些向量。。这只是一个测试用例,稍后我想将其应用于图像。在
import numpy as np
import scipy.stats
import scipy.ndimage
m = 7 # size of the 'signal'
n = 7 # size of the filter
sgm = 2 # dev for standard distr
weight_conv = np.zeros(2*m*n).reshape(2*n, m) # Weights for the convolution
input_signal = np.array(range(m)) # input signal..
x1 = np.linspace(-4*sgm, 4*sgm, n) # x-values for the normal-dstr
input_filter = scipy.stats.norm.pdf(x1, loc=0, scale=sgm)
# create my own weight matrix
for i in range(weight_conv.shape[1]):
weight_conv[i:(len(input_filter)+i), i] = input_filter
# My own way of calculating the convolution
np.sum(weight_conv * input_signal, axis=1)
# Convolution provided by numpy
np.convolve(input_signal, input_filter)
# Apply the scipy gaussian filter...
scipy.ndimage.filters.gaussian_filter(input_signal, sigma=sgm)
scipy.ndimage.filters.gaussian_filter1d(input_signal, sigma=sgm)
现在我的想法是这些都应该是相似的。我的方法是产生与纽比卷积相似的输出,但是scipy方法不同。。。在
^{pr2}$西皮现在做的一定不同了。但是什么?我不知道。我已经检查了源代码,在那里他们似乎只是在使用高斯核的卷积(这也是我正在做的)。但这些答案并不一致。。。在
有人有不同的想法吗?在
在@filippo和这个SO-question的帮助下,我能够重建
scipy
实现。方法将信息传播到任何一方的方式至关重要。在下面是一个代码片段,显示了它们是如何相等的
绘制结果总是让人相信你做得很好。。。所以
^{pr2}$给出以下image。在
还可以验证将scipy过滤器的
mode
设置为'constant'
也将创建相同的卷积。在Scipy多维高斯滤波器使用更大的核。默认情况下,内核半径被截断为4个sigma,在您的例子中应该有点类似于17x17过滤器。在
请参见^{} 以了解确切的实现。它也使用了几个一维可分离的相关性,但这不会有太大的区别。在
另一个关键区别在于输出向量的大小和精度。从nImage docs:
中间数组存储在与输出相同的数据类型中。因此,对于精度较低的输出类型,结果可能不精确,因为中间结果的存储精度可能不够。可以通过指定更精确的输出类型来防止这种情况。
所以在您的例子中,输出精度受
input_signal.dtype
的限制。尝试对输出使用浮点输入数组或其他数组。在输出大小和边缘处理有点棘手,不确定是否有办法从
np.convolve
和scipy.ndimage.gaussian_filter
获得相同的行为相关问题 更多 >
编程相关推荐