我们接触到的很多数学公式涉及到偏导数,那么图像的偏导数怎么求呢?
我们可以认为:图像就是一个复杂的曲面,我们要想得到曲面点的梯度,就需要对该点求偏导。
求偏导的输入:附近点的灰度值
求偏导的输出:一个数
这里有人会问了,我们的梯度是一个有方向有大小的值呀。
没错,我们这里求导的输出:两个数
一个x方向的偏导,一个y方向的偏导,合成就是总的梯度方向和大小。
我们需要用的信息是点附近的点,那么如何用呢?用窗操作,卷积操作(我不想提卷积操作,因为事实就是一个简单的相乘相加的数学公式)
对x求导
Kx = 0.25 * [-1 1; -1 1];
Ex = conv2(Im1, Kx, 'same')
这里的卷积核为Kx,被卷积图像为Im1,卷积形式为’same’——卷积后的图像大小和原图像大小相同,计算边缘的时候扩充数据,但不对扩充的数据边进行计算。
那么,有很多时候图像涉及了t,这里我们的输入就变为:图像帧
有帧二减去帧一,就能反映图像对t的导数了
Kt = 0.25 * [-1 -1; -1 -1];
Et = conv2(Im1, Kt, 'same') + conv2(Im2, -Kt, 'same');
光流法
二郎理解,它最主要的用途为寻找下一帧物体的位置(匹配)
来源于一个公式——两帧同一个物体,虽然位置变了,但是物体还是原来物体。
例如跟踪人,虽然刚才人在小卖铺前,下一帧,人买了根辣条准备回家,他位置可能变了,但是他还是他。
他还是他怎么表示呢?图像中表示为灰度值不变(当然也有说光照变了,灰度值就变了,采用梯度更合适,但是这里二郎只想说一个简单的情况,从简单的引申复杂的很有用的,不要上来就弄男的。。。。哈哈哈)
这个公式被研究光流法的玩嗨了,如何理解呢?
点的x坐标经过t+1后,变为x+u
点的y坐标经过t+1后,变为y+v
这就是时间变了,点的位置变了,但是点的灰度没有变。
利用泰勒展开,展开后一项得(具体泰勒咋展开的就不说了,有这么个形式)
从上面知道两项相等,而且∈及泰勒的高阶项都可以省略
我们通过一个式子就可以表达上面的关系了,时间变了,位置变了,但是同一个物体的像素值不会变。
一个假设:小运动,时间的变化不会引起位置的剧烈变化,因此搜索下一帧时无需在全图进行全局搜索,只需要在一个框内进行即可,在一个框内找到满足上述公式的u和v,就能知道图像变化的方向。
这个打个比方,其实是有多组数据用来求u,v的,这里用到最小二乘法
为什么用这个就能求最小二乘了?其实是有一定数学推导关系的,具体可以看我之前的博客,里面有详细讲解。
至此我们求出了点的u和v
这里会问了,我们需要把全图每个点的u,v求出来么?
没必要……因为我们只关系运动物体的角点
因此在用光流法之前可以用其他方法先确定运动物体和运动物体上的角点,进而在得到的角点像素位置进行光流法操作。
这里光流法就解释完了,其他光流法多为该方法的改进,具体问题具体分析。