如何解决使用 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 举报,一经查实,本站将立刻删除。