2025-03-05
Image Matching 的一种方法:先从两个照片中找到关键点,然后再做关键点匹配,形成 Correpondance,再去解两个视角的关系.
关键点检测的第一个要求是显著性(Saliency),必须足够具有特征. 第二个要求是重复性(Repeatability),对于不同的图(视角,尺寸等)要能检测出相同的. 第三个是能有足够精确的位置(Accurate localization). 并且最后希望量足够大(Quantity).
一种简单的 Keypoint 是 Corner.
Corner 的特征是,有多个方向的梯度,而非像 Edge 一样只有正交方向.
Harris Corner Detection:将一个滑动窗口,看向各个方向移动,intensity 会不会有什么明显变化. Edge 的话只会有一个方向有极大的变化,而 Corner 在每个方向都有剧烈变化.
考虑定义一个 Window Function. 最简单的用 1 表示在窗口内,0 表示不在窗口内. 对于 \((x,y)\),定义强度差为 \(D(x,y)=[I(x+u,y+v)-I(x,y)]^2\),而又因为对于中心 \((x_0,y_0)\),\(w_{x,y}=w_{x-x_0,y-y_0}\),于是我们强度差总和为 \(\sum w(x-x_0,y-y_0)D(x,y)=\sum w(x_0-x,y_0-y)D(x,y)\),写成卷积就是\((w*D)(x_0,y_0)\). 上述是对于固定的 \(u,v\) 来说的.
如果将 \(I(x+u,y+v)-I(x,y)\) 做一阶泰勒近似,得到 \(uI_x+vI_y\),其中 \(I_x\) 为 \(x\) 方向 \(I\) 的偏导数,\(I_y\) 为 \(y\) 方向的偏导数,那么 \(D(x,y)=[u,v]\left[\begin{matrix}I_x^2(x,y)& I_xI_y(x,y)\\I_xI_y(x,y)& I_y^2(x,y)\end{matrix}\right][u\ v]^T\). 也就是说对于位置 \((x,y)\),\((u,v)\) 方向的强度差可以用一个双线性形式表示.
那么我们考虑令中间那个矩阵为 \(B_{x,y}\),那么我们考虑用卷积的形式(注意,\(B\) 的每个元素是一个矩阵),那么对于位置 \(x_0,y_0\),这个总和的双线性形式就是 \(M_{x_0,y_0}=(w*B)_{x_0,y_0}\).
我们把内部的 \((x,y)\) 给提出去(这样矩阵的元素就是算子),可以得到 \(M=\left[\begin{matrix}w*I_x^2& w*I_xI_y\\w*I_xI_y& w*I_y^2\end{matrix}\right]\).
上一步是为了方便并行计算. 无论如何,我们已经能得知了 \((x_0,y_0)\) 处的双线性形式,现在就是该如何判断一个点是否是 Corner 或者 Edge.
我们要关注的对象是是否对于所有向量 \(v\),\(vM_{x_0,y_0}v^T\) 都比较大. 那么我们自然地想到对 \(M_{x_0,y_0}\) 进行对角化,得到特征值 \(\lambda_1,\lambda_2\). 若两者都较大,那么就意味着是 Corner. 若一者相比于另一者过大,那就以为这是 Edge. 否则就是 Flat. 我们想要寻找一个合理的算子来体现这件事情.
首先是要都比较大. Harris Corner Detector 的这套理论选择了使用 \(\lambda_1\lambda_2-2t\) 作为贡献.
然后是比值要比较大. 这里选择了 \(\lambda_1\lambda_2-2a(\lambda_1+\lambda_2)^2>0\),可以解出来 \(a=\frac{1}{2}(k+1/k)^2\),其中 \(\lambda_1/\lambda_2\in(\frac{1}{k},k)\). \(k=3\) 的时候有 \(\alpha=0.045\).
然后我们把这两项叠加起来,化简得到 \(\theta=\lambda_1\lambda_2-\alpha(\lambda_1+\lambda_2)^2-t\).
有人知道为什么会这么设计这个函数吗?????
反正我们发现这个其实就是原矩阵的行列式,减去 \(\alpha\) 倍的 Trace 的平方,再减去 \(t\).
并且还有一件事情,就是 \(w\) 太方方正正了,不满足对旋转的不变性. 所以不如选择一个 Gaussian Filter \(g\) 作为 Window Function.
然后我们再看回算子,得到 \(\theta=(g(I_x^2)g(I_y^2)-[g(I_xI_y)]^2)-\alpha[g(I_x^2)+g(I_y^2)]^2-t\).
总体来说操作其实就像是,写好几个卷积核,然后跑.
然后再做一个 \(\theta>0\) 的 Thresholding 和 Non-maximum Suppression 就好了.
实际上上面所谓的不变性其实应该叫一种等变性 (Equivariance). 即图片发生变化的时候,输出也跟着发生相同的变化.
等变性最基础的定义就是,对于 \(f:V\to V\)(比如卷积,网络)和简单的变换 \(T\)(比如旋转,平移),\(T[f(x)]=f(T(x))\).
如果是不变性,那么就是 \(f(x)=f(T(x))\).
语义类的(比如分类问题)我们希望不变,而检查类的(比如位置方向)我们希望等变.
有关平移的等变性是操演定义的. 考虑如何检查旋转的等变性. 我们将图片先看成连续光滑函数. 如果将图片旋转 \(\theta\),那么 Gradient 操作,由于 \(I_x I_y\) 的对称性显然是等变的. 而卷积的变化在于卷积中心位置绕着旋转中心转了,而我们希望卷积核是旋转不变的.
但实际上真实操作,由于像素的离散性就杜绝了旋转的严格等变的可能性. 并且实现上 Gaussian Filter 写起来也是一个 \(k\times k\) 的卷积核,所以其实旋转不变性也没法保证.
并且卷积对于拉伸也是无法等变的.
参考讲义:Lecture 3 - Classic Vision II 和 Lecture 4 - Deep Learning I.