Roxy's Library

Back

Line Fitting#

很多特点都以线的形式存在,比如道路边界,建筑物边缘,物体轮廓等,因此我们需要一种方法来拟合这些线条

最小二乘法#

数据:(x1,y1),(x2,y2),...,(xn,yn)(x_1,y_1), (x_2,y_2), ..., (x_n,y_n)

目标:找到一条线y=ax+by = ax + b,使得所有点到这条线的垂直距离的平方和最小,即minimize E=i=1n(yiaxib)2E=\sum_{i=1}^n (y_i - ax_i - b)^2

Y=[yi],X=[xi,1],B=[a,b]TY = [y_i], X=[x_i,1], B=[a,b]^T

写成矩阵形式就是

E=YXB2=(YXB)T(YXB)=YTY2(XB)TY+(XB)T(XB)E = |Y-XB|^2 = (Y-XB)^T(Y-XB) = Y^TY-2(XB)^TY+(XB)^T(XB)

BB求导,令其为00,得到

dEdB=2XTY+2XTXB=0\frac{\mathrm{d} E}{\mathrm{d} B} = -2X^TY + 2X^TXB = 0

解出B=(XTX)1XTYB = (X^TX)^{-1} X^TY

这种方法有一个问题,就是不能拟合垂直的线条(当aa趋近于无穷大时),因此我们需要一种更一般的方法来拟合线条

General case

我们可以把线条表示ax+by+c=0ax + by + c = 0,这样就可以拟合任意方向的线条了,此时

E=i=1n(axi+byi+c)2E = \sum_{i=1}^n (ax_i + by_i + c)^2

A=[xi,yi,1],h=[a,b,c]TA = [x_i,y_i,1], h=[a,b,c]^T,则写成矩阵形式就是E=Ah2E = |Ah|^2

我们想要最小化Ah|Ah|,但是为了避免平凡解h=0h=0,我们需要加上一个约束条件h=1|h|=1

AA进行SVD分解,得到

An×3=Un×nΣn×3V3×3TA_{n\times 3} = U_{n\times n}\Sigma_{n\times 3} V^T_{3\times 3}

其中Σ\Sigma是一个对角矩阵,三个奇异值设为λ1λ2λ3\lambda_1 \geq \lambda_2 \geq \lambda_3UUVV是正交矩阵

V=[c1,c2,c3]V = [c_1, c_2, c_3],其中cic_iVV的第ii列,这三列构成了一个正交基,因此我们可以把hh表示成c1,c2,c3c_1, c_2, c_3的线性组合,即

h=α1c1+α2c2+α3c3,α12+α22+α32=1h = \alpha_1 c_1 + \alpha_2 c_2 + \alpha_3 c_3,\quad\alpha_1^2+\alpha_2^2+\alpha_3^2 = 1

那么Ah=Un×n[λ1α1,λ2α2,λ3α3,O]TAh = U_{n\times n}[\lambda_1\alpha_1, \lambda_2\alpha_2, \lambda_3\alpha_3, O]^T

因此Ah2=(λ1α1)2+(λ2α2)2+(λ3α3)2λ32|Ah|^2 = (\lambda_1\alpha_1)^2 + (\lambda_2\alpha_2)^2 + (\lambda_3\alpha_3)^2\geq \lambda_3^2,此时h=c3h = c_3,也就是说我们需要选择VV的最后一列作为我们的解

RANSAC#

在实际应用中,数据中往往会存在一些离群点(outliers),这些离群点可能会对我们的拟合结果产生很大的影响,因此我们需要一种方法来处理这些离群点,RANSAC就是一种常用的方法

具体步骤:

  • 选择所需样本量最小的随机样本进行模型拟合
  • 从取样的点中拟合模型
  • 计算所有点到拟合模型的距离,判断哪些点是inliers,哪些点是outliers
  • 迭代多次,保留inliers数量最多的模型

那么我们应该选取多少个样本点进行拟合,以及该迭代多少次?

设下面几个参数:

  • nn:确定模型所需的最少点数(最小样本数)
  • ϵ\epsilon:内点比例,0<ϵ<10<\epsilon<1
  • kk:迭代次数
  • pp:期望的成功概率,即以概率pp保证至少有一次采样全是内点

从数据中随机选取nn个点,全部是内点的概率为ϵn\epsilon^n,单次采样至少包含一个离群点的概率为1ϵn1-\epsilon^n,迭代kk次至少有一次采样全是内点的概率为1(1ϵn)k1-(1-\epsilon^n)^k,而我们希望这个概率大于pp,因此有

1(1ϵn)kpklog(1p)log(1ϵn)1-(1-\epsilon^n)^k \geq p \Rightarrow k \geq \frac{\log(1-p)}{\log(1-\epsilon^n)}

观察上面的公式,我们可以看到,固定ppϵ\epsilon,当nn增加时,迭代次数kk会急剧增加,因此我们应该尽量选择较小的nn,比如拟合一条线时n=2n=2,拟合一个平面时n=3n=3

一些超参数:

  • threshold:如果一个点到拟合模型的距离小于这个threshold,那么这个点就被认为是inlier
  • kk:迭代次数,因为实际上我们不知道ϵ\epsilon的值,因此无法计算出kk

Corner Detection#

除了edge,keypoint也是图像中的重要特征。keypoint一般有以下特点:

  • 可重复性:在两幅图像中独立地检测出相同的点
  • 显著性:在图像中具有明显的特征
  • 算法可以精确定位
  • 有足够的数量
  • 在不同光照、视角、尺度下具有鲁棒性

corner就是一种keypoint,下面我们介绍用于检测corner的一些算法

Harris Corner Detector#

在corner处,图像的梯度在两个方向上都有显著的变化,可以利用这一点来检测corner

corner

我们设I(x,y)I(x,y)为图像的灰度值,(u,v)(u,v)为一个小的位移,我们定义Intensity difference为

Du,v(x,y)=[I(x+u,y+v)I(x,y)]2D_{u,v}(x,y) = [I(x+u,y+v) - I(x,y)]^2

用一个窗函数w(x,y)w(x,y)来描述范围

w(x,y)={1,if bx,yb0,otherwisew(x,y) = \begin{cases}1, & \text{if } -b\leq x,y \leq b \\0, & \text{otherwise}\end{cases}

如下图,我们计算某个点(x0,y0)(x_0,y_0)处移动一个小位移(u,v)(u,v)后窗口内的Intensity difference的变化Ex0,y0(u,v)E_{x_0,y_0}(u,v)

corner2

图中Ex0,y0(u,v)E_{x_0,y_0}(u,v)本质上是Du,v(x,y)D_{u,v}(x,y)w(x,y)w(x,y)的卷积,即

Ex0,y0(u,v)=(Du,vw)(x0,y0)E_{x_0,y_0}(u,v) = (D_{u,v} * w)(x_0, y_0)

Du,v(x,y)D_{u,v}(x,y)进行泰勒展开,得到

Du,v(x,y)(Ixu+Iyv)2=[u,v][Ix2IxIyIxIyIy2][uv]D_{u,v}(x,y) \approx (I_x u + I_y v)^2 = [u, v] \begin{bmatrix}I_x^2 & I_x I_y \\ I_x I_y & I_y^2\end{bmatrix} \begin{bmatrix}u \\ v\end{bmatrix}

那么Ex0,y0(u,v)E_{x_0,y_0}(u,v)就可以写成

Ex0,y0(u,v)=[u,v]M(x0,y0)[uv]E_{x_0,y_0}(u,v) = [u, v] M(x_0,y_0) \begin{bmatrix}u \\ v\end{bmatrix}

其中MM是一个2x2的对称、半正定矩阵

M(x,y)=[Ix2wIxIywIxIywIy2w]M(x,y) = \begin{bmatrix}I_x^2 * w & I_x I_y * w \\ I_x I_y *w & I_y^2 * w\end{bmatrix}

MM可以对角化为Q diag{λ1,λ2} QTQ\ diag\{\lambda_1,\lambda_2\}\ Q^T,其中λ1λ20\lambda_1\geq \lambda_2\geq 0

因为QQ为正交矩阵,可以将[u,v][u,v]变换为另一组正交基,即[u,v]=[u,v]Q[u',v'] = [u,v]Q,此时

Ex0,y0(u,v)=[u,v][λ100λ2][uv]=λ1u2+λ2v2E_{x_0,y_0}(u,v) = [u', v'] \begin{bmatrix}\lambda_1 & 0 \\ 0 & \lambda_2\end{bmatrix} \begin{bmatrix}u' \\ v'\end{bmatrix} = \lambda_1 u'^2 + \lambda_2 v'^2

由此我们可以进行直观上的分类:

  • λ10,λ20\lambda_1 \approx 0, \lambda_2 \approx 0:平坦区域 (不管怎么移动,Intensity difference都不变)
  • λ10,λ20\lambda_1 \gg 0, \lambda_2 \approx 0: 边缘 (在某个方向上Intensity difference有显著变化,在另一个方向不变)
  • λ10,λ20\lambda_1 \gg 0, \lambda_2 \gg 0:角点 (在两个方向上Intensity difference都有显著变化)

corner3

  • 角点也可以按照图中分类,要求λ1\lambda_1λ2\lambda_2都大于某个threshold,并且λ1/λ2\lambda_1/\lambda_2也不能太大

对于上面的条件,进行一些数学上的转换:

λ1,λ2>bλ1λ22t>0,t=b22\lambda_1,\lambda_2 > b \Rightarrow \lambda_1\lambda_2 - 2t > 0,\quad t = \frac{b^2}{2} 1k<λ1λ2<kλ1λ22α(λ1+λ2)2>0,α=12(k+1k)2\frac{1}{k}<\frac{\lambda_1}{\lambda_2} < k \Rightarrow \lambda_1\lambda_2 - 2\alpha(\lambda_1+\lambda_2)^2 > 0,\quad \alpha = \frac{1}{2(k + \frac{1}{k})^{2}}

因此我们可以定义一个corner response function θ\theta

θ=12(λ1λ22t)+12(λ1λ22α(λ1+λ2)2)=λ1λ2α(λ1+λ2)2t=det(M)αtrace(M)2t\begin{aligned} \theta & = \frac{1}{2}(\lambda_1\lambda_2 - 2t) + \frac{1}{2}(\lambda_1\lambda_2 - 2\alpha(\lambda_1+\lambda_2)^2) \\ & = \lambda_1\lambda_2 - \alpha(\lambda_1+\lambda_2)^2 - t \\ & = \det(M) - \alpha \cdot \mathrm{trace}(M)^2 - t \end{aligned}

θ>0\theta > 0或某个threshold时,我们认为这个点是一个corner

Harris Detector Process#

  1. 计算图像的梯度IxI_xIyI_y
  2. 计算Ix2,Iy2,IxIyI_x^2, I_y^2, I_x I_y
  3. 用窗函数对Ix2,Iy2,IxIyI_x^2, I_y^2, I_x I_y进行卷积
  4. 计算corner response function θ\theta,找到所有θ\theta大于某个threshold的点
  5. 对于所有θ\theta大于threshold的点,进行NMS计算,保留局部最大的点

Harris 算子的特点#

关于不变性(invariant)和等变性(equivariant):

  • 不变性:对于某个变换TT,如果算法的输出不受TT的影响,即f(T(I))=f(I)f(T(I)) = f(I),则称算法具有不变性
  • 等变性:对于某个变换TT,如果算法的输出也发生相同的变换,即f(T(I))=T(f(I))f(T(I)) = T(f(I)),则称算法具有等变性

Harris算子具有平移等变性,显然求导数和卷积操作都是平移等变的

对于使用具有各向同性(isotropic)的窗函数(即窗函数具有旋转不变性),比如高斯窗或矩形窗,Harris算子还具有旋转等变性

但不具有尺度不变性 scale

Classic Vision II
https://astro-pure.js.org/blog/cvintro_03_18
Author GreyRat
Published at March 29, 2026
Comment seems to stuck. Try to refresh?✨