您可以使用著名的sliding window stride trick来加快计算速度。它在不复制数据的情况下将两个“虚拟维度”添加到数组的末尾,然后计算它们之间的方差。在
注意,在您的代码中,im[j-w:j+w, ..]覆盖了索引j-w,j-w+1,...,j+w-1,最后一个是排他的,这可能不是您的意思。另外,方差大于uint8的范围,因此最终得到整数环绕。在import numpy as np
import time
np.random.seed(1234)
img = (np.random.rand(200, 200)*256).astype(np.uint8)
def sliding_window(a, window, axis=-1):
shape = list(a.shape) + [window]
shape[axis] -= window - 1
if shape[axis] < 0:
raise ValueError("Array too small")
strides = a.strides + (a.strides[axis],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def sliding_img_var(img, window):
if window <= 0:
raise ValueError("invalid window size")
buf = sliding_window(img, 2*window, 0)
buf =