来自SciPy的uniform_filter的奇怪值

时间:2016-06-24 09:22:10

标签: python numpy image-processing scipy imagefilter

编辑:评论中的问题已解决,感谢您的帮助 编辑2:我认为链接的解决方案在数学上不正确,但也许我错了。问题在于您除以窗口大小,但不要将二次差分加在一起。 解决方案:我现在的解决方案是按np.finfo(np.float).precision计算精度并将每个值设置为零,即低于pow(1, np.finfo(np.float).precision)],因为它应该是机器epsilon错误的上限。如果矩阵中有负值​​,则在检查值是否低于错误阈值之前,必须将它们乘以-1。否则像-2这样的值也会设置为0。

我有一个2D数组,其强度值来自图像(52x111)。为了计算局部标准差,我使用了另一个线程(improving code efficiency: standard deviation on sliding windows)的答案 最小强度值为 0.0 ,因为我使用的过滤函数的参数为​​mode = "constant"cval = 0

我的平均过滤器看起来像这样:

mean = uniform_filter(img_data, size=3, cval= 0, mode="constant", origin=0)

np.amin(mean)的结果是-2.47949808833e-15
怎么可能,过滤器屈服于负值?

为了澄清事情,整个相关代码如下所示:

mean = uniform_filter(img_data, size=3, cval= 0, mode="constant", origin=0) 
mean_of_squared = uniform_filter(img_data**2, 3, cval= 0, mode='constant', origin=0) 
squared_mean = mean * mean 
stdev = (mean_of_squared - squared_mean) ** 0.5

作为替代方案,我使用scipy中的concolve函数

window_size = 3
mean_filter = np.ones((window_size, window_size)) / 9
mean = convolve(img_data, mean_filter)

效果很好,但比uniform_filter方法慢得多
据我记得,我手动检查的所有坐标都只是 0.0 的窗口,但我不确定这是否是一般情况。为什么uniform_filter表现得像它的任何想法?

0 个答案:

没有答案