编辑:评论中的问题已解决,感谢您的帮助
编辑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
表现得像它的任何想法?