有没有一种简单的方法可以使用Python/NumPy/Scipy计算图像上运行的方差过滤器?通过运行variance image,我是指计算图像中每个子窗口I的sum((I-mean(I))^2)/nPixels的结果。
由于图像非常大(12000x12000像素),我希望避免在格式之间转换数组的开销,以便能够使用不同的库,然后再转换回来。
我想我可以用类似于
kernel = np.ones((winSize, winSize))/winSize**2
image_mean = scipy.ndimage.convolve(image, kernel)
diff = (image - image_mean)**2
# Calculate sum over winSize*winSize sub-images
# Subsample result
但如果有类似于Matlab中的stdfilt函数的东西,那就更好了。
有谁能给我指一个具有此功能并支持numpy数组的库的方向,或者在numpy/SciPy中提示/提供这样做的方法吗?
您可以使用
numpy.lib.stride_tricks.as_strided
获取图像的窗口视图:现在
win_img[i, j]
是(win_rows, win_cols)
数组,左上角位于[i, j]
:不过,您必须小心,不要将图像的窗口化视图转换为窗口化副本:在我的示例中,这需要25倍的存储空间。我相信numpy 1.7允许您选择多个轴,因此您可以简单地:
我被Numpy1.6.2困住了,所以我无法测试它。另一个可能在没有这么大的窗口时失败的选择是,如果我正确地记住了我的数学公式:
现在
win_var
是一个形状数组并且
win_var[i, j]
保持(5, 5)
窗口的方差,左上角位于[i, j]
。更简单且更快的解决方案:使用SciPy的^{}
“跨步技巧”是漂亮的技巧,但4慢,不可读。
generic_filter
比跨步慢20倍。。。经过一些优化之后,我们为一个通用的3D图像提供了这个功能:
相关问题 更多 >
编程相关推荐