在连续图片序列中,从第t帧到第t+1帧,每个像素的运动速度和运动方向。
稀疏光流:只计算图片中特定点的光流
稠密光流:每个像素都要计算光流。
光流的表示
用三维数组 $[height, width, 2]$ 表示。其中$height$表示图像的高度,$width$表示图像的宽度,2表示x,y两个方向。
光流是个和原来图像大小相等的双通道图像。
在x方向上,正值表示物体向左移动,而负值表示物体向右移动;在y方向上,正值表示物体向上移动,而负值表示物体向下移动。
光流提取
- 传统算法 Lucas-Kanade (稀疏)
- 深度学习算法 FlowNet/FlowNet2.0 (稠密)
https://zhuanlan.zhihu.com/p/74460341
光流可视化
稀疏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| //[11,11,2] //通道1 [[ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5] [ 2.5 2. 1.5 1. 0.5 0. -0.5 -1. -1.5 -2. -2.5]] //通道2 [[ 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5] [ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. ] [ 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. ] [ 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5] [-1. -1. -1. -1. -1. -1. -1. -1. -1. -1. -1. ] [-1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5] [-2. -2. -2. -2. -2. -2. -2. -2. -2. -2. -2. ] [-2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5]]
|
稠密
warp
将生成的光流应用到一张图像
在x方向上,正值表示物体向左移动,负值表示物体向右移动;
在y方向上,正值表示物体向上移动,而负值表示物体向下移动。
x0 = pos_x + x, y0 = pos_y + y。pos_x和pos_y是原始的像素坐标,x和y是光流(向下取整),x0和y0就是warp后的像素坐标。以x方向为例,原始坐标加上一个负值,得到的结果变小了,也就相当于这个像素像左移了,如果加一个正值,结果变大,像素右移。
坐标变换后,很多坐标并没有相应的原始像素与之对应,需要通过插值来处理。
插值
图像的很多处理得到的结果是连续的,为了得到离散点上的值,就需要插值。典型代表就是图像坐标的空间变换,如仿射变换,坐标经仿射变换后通常是小数,而图像只保存整数坐标位置上的像素值,所以需要插值。
- 四个角上的点 $P_{x, y}, P_{x+1, y}, P_{x, y+1}, P_{x+1, y+1}$ 是整数坐标位置上的已知点;
- 红色的点 $P_{x_{p}, y_{p}}$ 是待插值的点;
- 红色虚线连着的两个点 $P_{x_{p}, y}, P_{x_{p}, y+1}$ 是两个辅助点。
最邻近和双线性两种插值方法都比较简单,仅需要源图像和待插值的坐标。
nearest
最邻近插值算法将距离$P_{x_{p}, y_{p}}$最近的已知点的像素值直接赋给$P_{x_{p}, y_{p}}$,对${x_{p}, y_{p}}$四舍五入得到${x, y}$,直接令$P_{x_{p}, y_{p}}=P_{x, y}$即可
- 简单,但缺失精度,造成插值的图像灰度上的不连续,变化地方可能出现明显锯齿状
bilinear
双线性插值从两个方向进行线性插值
参考:https://blog.csdn.net/bby1987/article/details/105851870