背景介绍
鉴于本人实在太过疲惫和劳累,一些简单的便于理解的废话就不在记录,耗费两天时间研究了一下光流法,本帖用于记录学习过程中源码的难点细节。
使用光流预测的核心有两个利用多张连续回波图像(变分)或者相邻两张回波图(交叉相关,LK等)计算出光流场(速度矢量场),之后利用半拉格朗日方法进行外推。
半拉格朗日方法
三时间步半拉格朗日方法,其核心公式如下
但这个有点难理解,但看一维的图就很好理解
它的核心就是迭代求Am(位移矢量),如果理解困难的话,其实质上就是通过未来迭代(猜)出当前时刻的Am找到过去的假设标量值(回波值)不变的点,延伸到二维就是两个方向迭代,ok实在是so easy~
源码中lk直接调用cv的lk,没什么好说的,需要注意的是img要转成灰度图,主要是交叉相关:
m, n = R.shape[1:]
X, Y = np.meshgrid(np.arange(n), np.arange(m))
print(X)
def f(v):
XYW = [Y + v[1], X + v[0]]
R_w = ip.map_coordinates(
R[-2, :, :], XYW, mode="constant", cval=np.nan, order=0, prefilter=False
)
mask = np.logical_and(np.isfinite(R[-1, :, :]), np.isfinite(R_w))
return -np.corrcoef(R[-1, :, :][mask], R_w[mask])[0, 1]
options = {"initial_simplex": (np.array([(0, 1), (1, 0), (1, 1)]))}
result = op.minimize(f, (1, 1), method="Nelder-Mead", options=options)
return np.stack([-result.x[0] * np.ones((m, n)), -result.x[1] * np.ones((m, n))])
首先是np.meshgrid插出坐标,其次核心公式是ip.map_coordinates,这个很难理解,查阅scipy官方文档:scipy.ndimage.map_coordinates这个函数看看,output的shape是根据坐标插值的,如果坐标不变那么output还是原来的shape,只是数值进行移动,边界进行填充:
-------未完待续---------