使用 openpiv 在 2d + time Dask 堆栈上实时计算两个后续图像之间的运动

问题描述

我正在尝试计算两个后续图像之间粒子的位移,并将生成的位移图显示为 Napari 中的叠加。我正在处理相对较大的数据集,因此提前对每一帧进行预处理并不是一个非常实用的解决方案。数据作为 3d Dask 数组(2d + 时间)加载,我想使用 extended_search_area_piv 包中的 openpiv 函数以与演示的 here 类似的方式懒惰地计算位移. openpiv 函数需要一对 2D 帧作为参数。我试图通过将数据沿时间轴重新分块为单帧来使用 map_blocks() 中的 dask.array

stack = stack.rechunk({0:1})

并为 piv 函数提供 2d+time 数组的两个偏移副本

area_search = partial(pyprocess.extended_search_area_piv,window_size=32,overlap=16,search_area_size=32)
piv_disp = da.map_blocks(area_search,stack[1:],stack[:-1],chunks=(1,*x.shape),dtype='float64')

一旦我尝试计算切片的结果,我就会收到与所提供数据的形状相关的错误。

~/.pyenv/versions/neuro_39/lib/python3.9/site-packages/OpenPIV-0.23.4-py3.9-macosx-11.2-x86_64.egg/openpiv/pyprocess.py in extended_search_area_piv()
    753 
    754     if (window_size > frame_a.shape[0]) or (window_size > frame_a.shape[1]):
--> 755         raise ValueError("window size cannot be larger than the image")
    756 
    757     # get field shape

ValueError: window size cannot be larger than the image

我假设这是将第 3 维添加到预期的 2d 帧的结果。有没有办法在数组的二维切片上按需执行计算?

请注意,我已经尝试过执行一堆延迟函数调用:

x,y = openpiv.pyprocess.get_coordinates(image_size=stack.shape[-2:],search_area_size=32,overlap=16)

@delayed
def displacement_map(frame_a,frame_b):
    u,v,s2n = pyprocess.extended_search_area_piv(frame_a,frame_b,search_area_size=32)
    displ = np.abs(np.dot(u,v))
    return displ

UV = da.stack([da.from_delayed(displacement_map(stack[tt].astype(np.int32),stack[tt+1].astype(np.int32)),x.shape,dtype='float64')
               for tt in range(stack.shape[0]-1)],axis=0)

然而,这种方法的“预编译”时间非常长。

如果您有任何建议,请告诉我谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)