以下代码计算整个图片的局部对比度。我的版本非常慢。我尝试使用'multiprocessing'模块中的'pool'进行多线程处理,但它只加速了10% 你能帮助我加快速度吗?
#pic: gray value picture (large 2d-array)
#xvar,yvar: scalar values, e.g. 200
contrast=[np.std(pic[stepx-xvar:xvar+stepx:,stepy-yvar:yvar+stepy:])*2 \
for ystep in np.arange(yvar,np.int(pic.shape[1]-yvar),1)] \
for stepx in np.arange(xvar,np.int(pic.shape[0]-xvar),1)]
答案 0 :(得分:0)
最直接的方式是:
from skimage.util import view_as_windows
windows = view_as_windows(pic, (xvar, yvar))
contrast = 2 * np.std(windows, axis=(2,3))
这会将图片炸成一个包含所有窗口的数组,但不会产生额外的内存开销。优点是你摆脱了Python循环/函数调用开销。它基于Numpy" stride-trick",请参阅实施here(或者scikit-learn variant)。
有一种方法可以更好地扩展,但请参阅此处的答案:improving code efficiency: standard deviation on sliding windows