MINIBLOG

Blog Note Tags Links About
Home Search
Mar 20, 2026
miniyuan

线检测与角点检测


Convolution Operator

Convolution VS Cross-Correlation

卷积与互相关的核心思想相同:滑动一个核(kernel)在输入图像上,在每个位置计算对应元素乘积的和。

1D

卷积:

(f∗g)[n]=∑m=−∞∞f[m] g[n−m](f * g)[n] = \sum_{m=-\infty}^{\infty} f[m] \, g[n - m](f∗g)[n]=m=−∞∑∞​f[m]g[n−m]

互相关:

(f⋆g)[n]=∑m=−∞∞f[m] g[n+m](f \star g)[n] = \sum_{m=-\infty}^{\infty} f[m] \, g[n + m](f⋆g)[n]=m=−∞∑∞​f[m]g[n+m]

2D

卷积:

(f∗g)[i,j]=∑m=−∞∞∑n=−∞∞f[i−m,j−n] g[m,n](f * g)[i, j] = \sum_{m=-\infty}^{\infty} \sum_{n=-\infty}^{\infty} f[i - m, j - n] \, g[m, n](f∗g)[i,j]=m=−∞∑∞​n=−∞∑∞​f[i−m,j−n]g[m,n]

互相关:

(f⋆g)[i,j]=∑m=−∞∞∑n=−∞∞f[i+m,j+n] g[m,n](f \star g)[i, j] = \sum_{m=-\infty}^{\infty} \sum_{n=-\infty}^{\infty} f[i + m, j + n] \, g[m, n](f⋆g)[i,j]=m=−∞∑∞​n=−∞∑∞​f[i+m,j+n]g[m,n]

Difference

卷积在滑动前会将核翻转(flip),在一维中是时间反转;互相关不翻转核。我们一般使用的是互相关运算,但是库函数称之为 convolution,实际上两者不同。

卷积 (Convolution)互相关 (Correlation)
直观理解滤波 (Filter)模板匹配 (Template matching)
交换律YN
结合律YN
分配律YN
卷积定理F(f∗g)=F(f)⋅F(g)\mathcal{F}(f * g) = \mathcal{F}(f) \cdot \mathcal{F}(g)F(f∗g)=F(f)⋅F(g)
(时域卷积 = 频域乘积)
F(f⋆g)=F(f)⋅F(g)‾\mathcal{F}(f \star g) = \mathcal{F}(f) \cdot \overline{\mathcal{F}(g)}F(f⋆g)=F(f)⋅F(g)​
(频域包含复共轭)

Padding

Importance

  • 防止输出空间尺寸缩小(spatial shrinkage),在深网络中保持尺寸一致很重要。
  • 保留边缘信息。若不 padding,图像边缘像素被卷积核覆盖次数少,信息利用率低。

Padding Types

  • Zero padding:以 0 填充。
  • Replicate padding:以边缘像素复制填充。

Output Size

注意这是对某个方向 output size 的计算。各个方向应该分别计算。

Wout=⌊Win+2P−KS⌋+1W_{out} = \left\lfloor \frac{W_{in} + 2P - K}{S} \right\rfloor + 1Wout​=⌊SWin​+2P−K​⌋+1

其中:

  • WinW_{in}Win​:该方向的输入宽度。
  • PPP:该方向每侧的填充像素数,假设两侧填充一致。
  • KKK:该方向的卷积核宽度。
  • SSS:该方向的步幅。
  • WoutW_{out}Wout​:该方向的输出宽度。

Implementation of Convolution

用循环实现卷积在 CPU/GPU 上效率低。想办法将卷积转化为矩阵乘法并使用并行可以大大提高速率。

im2col

符号定义:

符号含义维度
X∈RCin×H×W\mathbf{X} \in \mathbb{R}^{C_{in} \times H \times W}X∈RCin​×H×W输入特征图(Cin,H,W)(C_{in}, H, W)(Cin​,H,W)
K∈RCout×Cin×K×K\mathbf{K} \in \mathbb{R}^{C_{out} \times C_{in} \times K \times K}K∈RCout​×Cin​×K×K卷积核权重(Cout,Cin,K,K)(C_{out}, C_{in}, K, K)(Cout​,Cin​,K,K)
b∈RCout\mathbf{b} \in \mathbb{R}^{C_{out}}b∈RCout​偏置向量(Cout,)(C_{out},)(Cout​,)
Y∈RCout×Hout×Wout\mathbf{Y} \in \mathbb{R}^{C_{out} \times H_{out} \times W_{out}}Y∈RCout​×Hout​×Wout​输出特征图(Cout,Hout,Wout)(C_{out}, H_{out}, W_{out})(Cout​,Hout​,Wout​)
(sh,sw)(s_h, s_w)(sh​,sw​)步长-
(ph,pw)(p_h, p_w)(ph​,pw​)填充-

其中输出空间尺寸:

Hout=⌊H+2ph−Ksh⌋+1,Wout=⌊W+2pw−Ksw⌋+1H_{out} = \left\lfloor \frac{H + 2p_h - K}{s_h} \right\rfloor + 1, \quad W_{out} = \left\lfloor \frac{W + 2p_w - K}{s_w} \right\rfloor + 1Hout​=⌊sh​H+2ph​−K​⌋+1,Wout​=⌊sw​W+2pw​−K​⌋+1

令 N=Hout⋅WoutN = H_{out} \cdot W_{out}N=Hout​⋅Wout​ 表示输出位置的总数。

Kernel Flattening:

将每个输出通道的卷积核展平为行向量:

Wi=vec(Ki,:,:,:)⊤∈R1×(Cin⋅K2)\mathbf{W}_{i} = \text{vec}\left(\mathbf{K}_{i, :, :, :}\right)^\top \in \mathbb{R}^{1 \times (C_{in} \cdot K^2)}Wi​=vec(Ki,:,:,:​)⊤∈R1×(Cin​⋅K2)

其中 vec(⋅)\text{vec}(\cdot)vec(⋅) 表示按通道优先顺序展平:

vec(Ki,:,:,:)=[vec(Ki,0,:,:)⊤,vec(Ki,1,:,:)⊤,…,vec(Ki,Cin−1,:,:)⊤]⊤\text{vec}\left(\mathbf{K}_{i, :, :, :}\right) = \left[ \text{vec}\left(\mathbf{K}_{i, 0, :, :}\right)^\top, \text{vec}\left(\mathbf{K}_{i, 1, :, :}\right)^\top, \ldots, \text{vec}\left(\mathbf{K}_{i, C_{in}-1, :, :}\right)^\top \right]^\topvec(Ki,:,:,:​)=[vec(Ki,0,:,:​)⊤,vec(Ki,1,:,:​)⊤,…,vec(Ki,Cin​−1,:,:​)⊤]⊤

堆叠所有输出通道形成权重矩阵:

W=[W0W1⋮WCout−1]∈RCout×(Cin⋅K2)\mathbf{W} = \begin{bmatrix} \mathbf{W}_0 \\ \mathbf{W}_1 \\ \vdots \\ \mathbf{W}_{C_{out}-1} \end{bmatrix} \in \mathbb{R}^{C_{out} \times (C_{in} \cdot K^2)}W=​W0​W1​⋮WCout​−1​​​∈RCout​×(Cin​⋅K2)

Patch Flattening:

对于每个输出位置 (i,j)(i, j)(i,j),i∈[0,Hout)i \in [0, H_{out})i∈[0,Hout​), j∈[0,Wout)j \in [0, W_{out})j∈[0,Wout​),定义对应的输入感受野:

Pi,j={(c,h,w) | c∈[0,Cin), h∈[h0,h0+K), w∈[w0,w0+K)}\mathcal{P}_{i,j} = \left\{ (c, h, w) \,\middle|\, c \in [0, C_{in}),\, h \in [h_0, h_0+K),\, w \in [w_0, w_0+K) \right\}Pi,j​={(c,h,w)∣c∈[0,Cin​),h∈[h0​,h0​+K),w∈[w0​,w0​+K)}

其中 (h0,w0)=(i⋅sh−ph,j⋅sw−pw)(h_0, w_0) = (i \cdot s_h - p_h, j \cdot s_w - p_w)(h0​,w0​)=(i⋅sh​−ph​,j⋅sw​−pw​)。

提取 patch 并展平为列向量:

xi,j=vec(X:,h0:h0+K,w0:w0+K)∈RCin⋅K2\mathbf{x}_{i,j} = \text{vec}\left(\mathbf{X}_{:, h_0:h_0+K, w_0:w_0+K}\right) \in \mathbb{R}^{C_{in} \cdot K^2}xi,j​=vec(X:,h0​:h0​+K,w0​:w0​+K​)∈RCin​⋅K2

im2col:

将所有输出位置对应的列向量按列拼接,形成 im2col 矩阵:

Xcol=[x0,0⋯x0,Wout−1x1,0⋯xHout−1,Wout−1]∈R(Cin⋅K2)×N\mathbf{X}_{col} = \begin{bmatrix} \mathbf{x}_{0,0} & \cdots & \mathbf{x}_{0,W_{out}-1} & \mathbf{x}_{1,0} & \cdots & \mathbf{x}_{H_{out}-1,W_{out}-1} \end{bmatrix} \in \mathbb{R}^{(C_{in} \cdot K^2) \times N}Xcol​=[x0,0​​⋯​x0,Wout​−1​​x1,0​​⋯​xHout​−1,Wout​−1​​]∈R(Cin​⋅K2)×N

其中列索引 t=i⋅Wout+jt = i \cdot W_{out} + jt=i⋅Wout​+j 对应输出位置 (i,j)(i, j)(i,j)。

GEMM:

执行矩阵乘法并加上偏置:

Ymat=W⋅Xcol+b⋅1N⊤∈RCout×N\mathbf{Y}_{mat} = \mathbf{W} \cdot \mathbf{X}_{col} + \mathbf{b} \cdot \mathbf{1}_N^\top \in \mathbb{R}^{C_{out} \times N}Ymat​=W⋅Xcol​+b⋅1N⊤​∈RCout​×N

其中 1N∈RN\mathbf{1}_N \in \mathbb{R}^{N}1N​∈RN 为全 1 向量,偏置通过广播机制相加。

Reconstruction:

将结果矩阵 reshape 回张量形式:

Y=reshape(Ymat,(Cout,Hout,Wout))\mathbf{Y} = \text{reshape}\left(\mathbf{Y}_{mat}, (C_{out}, H_{out}, W_{out})\right)Y=reshape(Ymat​,(Cout​,Hout​,Wout​))

具体地,对于每个输出通道 coutc_{out}cout​ 和空间位置 (i,j)(i, j)(i,j):

Ycout,i,j=[Ymat]cout, i⋅Wout+j=∑d=0Cin⋅K2−1Wcout,d⋅[Xcol]d,i⋅Wout+j+bcout=Wcout⋅xi,j+bcout\begin{aligned} \mathbf{Y}_{c_{out}, i, j} &= \left[\mathbf{Y}_{mat}\right]_{c_{out},\, i \cdot W_{out} + j} \\ &= \sum_{d=0}^{C_{in} \cdot K^2 - 1} \mathbf{W}_{c_{out}, d} \cdot \left[\mathbf{X}_{col}\right]_{d, i \cdot W_{out} + j} + \mathbf{b}_{c_{out}} \\ &= \mathbf{W}_{c_{out}} \cdot \mathbf{x}_{i, j} + \mathbf{b}_{c_{out}} \end{aligned}Ycout​,i,j​​=[Ymat​]cout​,i⋅Wout​+j​=d=0∑Cin​⋅K2−1​Wcout​,d​⋅[Xcol​]d,i⋅Wout​+j​+bcout​​=Wcout​​⋅xi,j​+bcout​​​

全过程:

X→im2colXcol→W⋅(⋅)+bYmat→reshapeY\mathbf{X} \xrightarrow{\text{im2col}} \mathbf{X}_{col} \xrightarrow{\mathbf{W} \cdot (\cdot) + \mathbf{b}} \mathbf{Y}_{mat} \xrightarrow{\text{reshape}} \mathbf{Y}Xim2col​Xcol​W⋅(⋅)+b​Ymat​reshape​Y

注:

  • im2col 把许多重叠 patch 展示为独立列,内存开销较大。实现时需权衡内存与速度(例如分块实现、使用 cuDNN 优化或直接使用卷积算法)。
  • GEMM 高度向量化并在 GPU 上有专门加速(BLAS/cuBLAS),所以比逐点循环快很多。

Toplitz


Line Fitting

直线可以描述许多目标,因此线检测是经典任务。仅仅做边缘检测并不能直接得到直线,因为可能受到遮挡、非直线结构、多条线如何选择等。 两种思路:

  • 先检测边缘,再做拟合。
  • 使用投票方法(Hough Transform)或鲁棒拟合(RANSAC)。

Least Squares

若已知一系列点 (xi,yi)(x_i, y_i)(xi​,yi​),希望拟合直线 y=kx+my = kx + my=kx+m。可以用最小二乘法通过最小化残差平方和求解参数。 也即:

min⁡k,m∑i=1n(yi−(kxi+m))2\min_{k,m} \sum_{i=1}^n (y_i - (k x_i + m))^2k,mmin​i=1∑n​(yi​−(kxi​+m))2

矩阵形式:

min⁡θ∥Aθ−y∥22⇔min⁡θ(Aθ−y)T(Aθ−y)\min_{\boldsymbol{\theta}} \| A\boldsymbol{\theta} - \boldsymbol{y} \|_2^2 \Leftrightarrow \min_{\boldsymbol{\theta}} (A\boldsymbol{\theta} - \boldsymbol{y})^T (A\boldsymbol{\theta} - \boldsymbol{y})θmin​∥Aθ−y∥22​⇔θmin​(Aθ−y)T(Aθ−y)

其中

A=[x11x21⋮⋮xn1],θ=[km],y=[y1y2⋮yn]A = \begin{bmatrix} x_1 & 1 \\ x_2 & 1 \\ \vdots & \vdots \\ x_n & 1 \end{bmatrix},\quad \boldsymbol{\theta} = \begin{bmatrix} k \\ m \end{bmatrix},\quad \boldsymbol{y} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}A=​x1​x2​⋮xn​​11⋮1​​,θ=[km​],y=​y1​y2​⋮yn​​​

最小二乘解析解:

θ=(A⊤A)−1A⊤y\boldsymbol{\theta} = (A^\top A)^{-1} A^\top \boldsymbol{y}θ=(A⊤A)−1A⊤y

注: 若拟合直线接近竖直,原有斜率参数不稳定。

Imperoved Least Squares

由于前述方法下,当直线竖直时,斜率无穷,最小二乘解不稳定。故我们应当使用一般直线方程求解。也即:

min⁡a,b,d∑i=1n(axi+byi−d)2\min_{a,b,d} \sum_{i=1}^n (a x_i + b y_i - d)^2a,b,dmin​i=1∑n​(axi​+byi​−d)2

但是为了解的唯一性(并且防止平凡解 a=b=d=0a = b = d = 0a=b=d=0),我们可以添加约束 a2+b2+d2=1a^2 + b^2 + d^2 = 1a2+b2+d2=1。得到矩阵形式:

min⁡h∥Ah∥2\min_{\boldsymbol{h}} \|A \boldsymbol{h}\|^2hmin​∥Ah∥2

其中

A=[x1y11x2y21⋮⋮⋮xnyn1],h=[abd],∥h∥=1A = \begin{bmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ \vdots & \vdots & \vdots \\ x_n & y_n & 1 \end{bmatrix},\quad \boldsymbol{h} = \begin{bmatrix} a \\ b \\ d \end{bmatrix},\quad \|\boldsymbol{h}\| = 1A=​x1​x2​⋮xn​​y1​y2​⋮yn​​11⋮1​​,h=​abd​​,∥h∥=1

我们可以通过 SVD 求解。对矩阵 AAA 进行奇异值分解得:

An×3=Un×nDn×3V3×3⊤A_{n\times 3} = U_{n\times n} D_{n\times 3} V_{3\times 3}^\topAn×3​=Un×n​Dn×3​V3×3⊤​

其中 UUU 为 n×nn \times nn×n 正交阵,V=[v1Tv2Tv3T]V = \begin{bmatrix} \boldsymbol{v}_1^T \\ \boldsymbol{v}_2^T \\ \boldsymbol{v}_3^T \end{bmatrix}V=​v1T​v2T​v3T​​​ 为 3×33 \times 33×3 正交阵,D=[diag{λ1,λ2,λ3}O(n−3)×3]D = \begin{bmatrix} diag\{\lambda_1, \lambda_2, \lambda_3\} \\ O_{(n-3) \times 3} \end{bmatrix}D=[diag{λ1​,λ2​,λ3​}O(n−3)×3​​] 为类对角矩阵,包含奇异值 ∣λ1∣≥∣λ2∣≥∣λ3∣|\lambda_1| \ge |\lambda_2| \ge |\lambda_3|∣λ1​∣≥∣λ2​∣≥∣λ3​∣。 将 hhh 分解到 VVV 的正交标架下:

h=α1v1+α2v2+α3v3\boldsymbol{h} = \alpha_1 \boldsymbol{v}_1 + \alpha_2 \boldsymbol{v}_2 + \alpha_3 \boldsymbol{v}_3h=α1​v1​+α2​v2​+α3​v3​

由于 ∥h∥=1\|\boldsymbol{h}\| = 1∥h∥=1 从而 α12+α22+α32=1\alpha_1^2 + \alpha_2^2 + \alpha_3^2 = 1α12​+α22​+α32​=1 :

∥Ah∥=∥UDVTh∥=∥DVTh∥=∥D[α1α2α3]∥=∥[λ1α1λ2α2λ3α3OT]∥=(λ1α1)2+(λ2α2)2+(λ3α3)2\begin{aligned} \| Ah \| = \| U D V^T h \| = \| D V^T h \| \\ = \| D \begin{bmatrix} \alpha_1 \\ \alpha_2 \\ \alpha_3 \end{bmatrix} \| = \| \begin{bmatrix} \lambda_1 \alpha_1 \\ \lambda_2 \alpha_2 \\ \lambda_3 \alpha_3 \\ O^T \end{bmatrix} \| = (\lambda_1 \alpha_1)^2 + (\lambda_2 \alpha_2)^2 + (\lambda_3 \alpha_3)^2 \end{aligned}∥Ah∥=∥UDVTh∥=∥DVTh∥=∥D​α1​α2​α3​​​∥=∥​λ1​α1​λ2​α2​λ3​α3​OT​​∥=(λ1​α1​)2+(λ2​α2​)2+(λ3​α3​)2​

从而解析解为 h=±v3\boldsymbol{h} = \pm \boldsymbol{v}_3h=±v3​. 几何直观即:解为最小伸缩的方向。

RANSAC

最小二乘对异常值(outliers)非常敏感,少数严重偏离点会破坏整体拟合。

随机采样一致性算法(RANdom SAmple Consensus)可以解决这个问题。 思想是通过大量随机采样最小样本集,生成候选模型并统计内点,最终选择支持内点最多的模型。

Step of RANSAC

  1. 确定构成模型所需的最小样本数 sss、残差阈值 δ\deltaδ、期望成功概率 ppp(或最大迭代次数 NNN)。
  2. 从数据集中随机选择 sss 个样本。
  3. 根据所选样本拟合一个假设模型(putative model)。
  4. 计算所有点相对于该模型的残差(residual),并判断哪些点为内点(residual<δresidual \lt \deltaresidual<δ)。
  5. 若当前模型的内点数历史最佳,则更新模型与内点集。
  6. 重复上述步骤 NNN 次。结束后,用内点集合重新拟合得到最终模型(可用最小二乘或 SVD)。

The Number of Sample

上述步骤中,选择合适的迭代次数 NNN 是很重要的。

假设数据集整体服从一个真实模型。我们应当使得完成迭代后,出现一次优秀抽样(抽的 sss 个样本全是真实模型的内点)的概率尽量大。假设构成模型所需的最少样本数为 sss,真实模型中外点比例为 eee,期望出现优秀抽样的概率为 ppp。

则一次抽样为非优秀抽样( sss 个样本中存在真实模型外点)的概率:

1−(1−e)s1 - (1 - e)^s1−(1−e)s

NNN 次抽样中不存在优秀抽样的概率:

(1−(1−e)s)N=1−p(1 - (1 - e)^s)^N = 1 - p(1−(1−e)s)N=1−p

解得:

N=log⁡(1−p)log⁡(1−(1−e)s)N = \frac{\log(1 - p)}{\log(1 - (1 - e)^s)}N=log(1−(1−e)s)log(1−p)​

Imperovement

  1. 对于超参数 threshold 的选取很重要,可以动态调整进行选取。
  2. 由于对噪声的敏感性,仅做一次 RANSAC 不一定能建立很好的模型,但是可以排除很多 outliers。我们可以对剩下的 inliers 再做 Line Fitting(如使用 Least Squares 或者 SVD).

Hough Transform

霍夫变换课上不做要求,此处仅简要介绍。

给定图像空间中的样本点。我们的原始任务是:找到尽可能多点经过的直线;而我们可以利用点和线的对偶关系,把图像空间中的样本点与参数空间的曲线进行一一对应。从而任务转化为:找到尽可能多直线相交的点。

我们常采用直线的法线式方程建立对偶关系:

ρ=xcos⁡θ+ysin⁡θ\rho = x \cos{\theta} + y \sin{\theta}ρ=xcosθ+ysinθ

从而图像空间的点 (x0,  y0)(x_0, \; y_0)(x0​,y0​) 对应参数空间 (ρ,  θ)(\rho, \; \theta)(ρ,θ) 中的曲线 ρ=x0cos⁡θ+y0sin⁡θ\rho = x_0 \cos{\theta} + y_0 \sin{\theta}ρ=x0​cosθ+y0​sinθ;图像空间的点共线对应参数空间的曲线共点。

注:Hough Transform 还可以拓展到圆锥曲线,但是计算复杂度明显上升。

RANSAC VS Hough

对比:

  • 本质上两者都可以视作一种 voting,但是 RANSAC 是在原始图像空间中进行 vote,而 Hough Transform 是在参数空间中进行 vote。
  • RANSAC 适合单模态(single mode)问题(一般检测一条直线);而 Hough Transform 对多模态效果好(能同时检测多个直线)。
  • RANSAC 鲁棒性更好,而 Hough Transform 对噪声不够鲁棒。
  • RANSAC 和 Hough Transform 都有一定的超参数,RANSAC 需要选取合适的 threshold,而 Hough Transform 需要选取合适的参数空间离散程度、直线聚类参数等。

Corner Detection

Corners as Keypoints

图像的关键点应具有如下性质:

  • Saliency(显著性):与周围区域有明显区别。
  • Repeatability(可重复性):在不同视角/光照/尺度下能被稳定检测。
  • Accurate localization(精准定位):不能是一个大范围区域。
  • Quantity(数量充足):一张图片应当具有许多关键点。

角点(Corners)一般满足上述性质,是一类好的关键点。我们给出角点的数学定义,依旧使用梯度:角点处,梯度的幅值应当在两个或更多方向上取局部极大值。

Harris Detector

思想:若窗口向任意方向平移,窗口内像素强度都会显著变化,则该点可能为角点。

The Definition fo Energy

考虑一个以 (x0,y0)(x_0,y_0)(x0​,y0​) 为中心的窗口 N(x0,y0)N(x_0,y_0)N(x0​,y0​),平移 (u,v)(u,v)(u,v),窗口内像素强度的变化程度定义为该点处的能量:

Ex0,y0(u,v)=∑(x,y)∈N(x0,y0)[I(x+u,y+v)−I(x,y)]2E_{x_0,y_0}(u,v) = \sum_{(x,y)\in N(x_0,y_0)} [I(x+u,y+v) - I(x,y)]^2Ex0​,y0​​(u,v)=(x,y)∈N(x0​,y0​)∑​[I(x+u,y+v)−I(x,y)]2

其中 I(⋅,⋅)I(\cdot,\cdot)I(⋅,⋅) 为图像强度。 使用一阶泰勒展开(假设 u,  vu, \; vu,v 很小)可得:

I(x+u,y+v)−I(x,y)≈Ix(x,y)u+Iy(x,y)vI(x+u,y+v) - I(x,y) \approx I_x(x,y) u + I_y(x,y) vI(x+u,y+v)−I(x,y)≈Ix​(x,y)u+Iy​(x,y)v

代回能量:

E(u,v)≈∑(x,y)∈N(Ix(x,y)u+Iy(x,y)v)2E(u,v) \approx \sum_{(x,y)\in N} (I_x(x,y) u + I_y(x,y) v)^2E(u,v)≈(x,y)∈N∑​(Ix​(x,y)u+Iy​(x,y)v)2

利用二次型化简得:

E(u,v)≈[uv]M(x0,y0)[uv]E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M(x_0,y_0) \begin{bmatrix} u \\ v \end{bmatrix}E(u,v)≈[u​v​]M(x0​,y0​)[uv​]

其中

M(x0,y0)=∑(x,y)∈N(x0,y0)[Ix2(x,y)Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy2(x,y)]M(x_0,y_0) = \sum_{(x,y)\in N(x_0,y_0)} \begin{bmatrix} I_x^2(x,y) & I_x(x,y) I_y(x,y) \\ I_x(x,y) I_y(x,y) & I_y^2(x,y) \end{bmatrix}M(x0​,y0​)=(x,y)∈N(x0​,y0​)∑​[Ix2​(x,y)Ix​(x,y)Iy​(x,y)​Ix​(x,y)Iy​(x,y)Iy2​(x,y)​]

Window Function

我们可以进一步将二次型 MMM 表示为卷积形式。常见的有以下两种窗口:

  • Rectangle window:窗函数对窗内均匀加权,不具旋转不变性。

    M(x0,y0)=[w(x0,y0)∗Ix2w(x0,y0)∗IxIyw(x0,y0)∗IxIyw(x0,y0)∗Iy2]M(x_0,y_0) = \begin{bmatrix} w(x_0,y_0) * I_x^2 & w(x_0,y_0) * I_x I_y \\ w(x_0,y_0) * I_x I_y & w(x_0,y_0) * I_y^2 \end{bmatrix}M(x0​,y0​)=[w(x0​,y0​)∗Ix2​w(x0​,y0​)∗Ix​Iy​​w(x0​,y0​)∗Ix​Iy​w(x0​,y0​)∗Iy2​​]

    其中 w(x0,y0)={1,if(x,y)∈N(x0,y0)0,otherwisew(x_0, y_0) = \begin{cases} 1, \quad if (x, y) \in N(x_0, y_0) \\ 0, \quad otherwise\end{cases}w(x0​,y0​)={1,if(x,y)∈N(x0​,y0​)0,otherwise​

  • Gaussian window:用高斯核加权,具有旋转不变性和平滑性。

    M(x0,y0)=[gσ(x0,y0)∗Ix2gσ(x0,y0)∗IxIygσ(x0,y0)∗IxIygσ(x0,y0)∗Iy2]M(x_0,y_0) = \begin{bmatrix} g_\sigma(x_0,y_0) * I_x^2 & g_\sigma(x_0,y_0) * I_x I_y \\ g_\sigma(x_0,y_0) * I_x I_y & g_\sigma(x_0,y_0) * I_y^2 \end{bmatrix}M(x0​,y0​)=[gσ​(x0​,y0​)∗Ix2​gσ​(x0​,y0​)∗Ix​Iy​​gσ​(x0​,y0​)∗Ix​Iy​gσ​(x0​,y0​)∗Iy2​​]

    其中高斯窗口:

    gσ(x0,y0)=12πσ2exp⁡(−x02+y022σ2)g_\sigma(x_0,y_0) = \frac{1}{2\pi\sigma^2} \exp \big(-\frac{x_0^2+y_0^2}{2\sigma^2}\big)gσ​(x0​,y0​)=2πσ21​exp(−2σ2x02​+y02​​)

当然由于卷积是一种线性变换,我们可以统一写为:

M(x0,y0)=[F(x0,y0)(Ix2)F(x0,y0)(IxIy)F(x0,y0)(IxIy)F(x0,y0)(Iy2)]M(x_0,y_0) = \begin{bmatrix} \mathcal{F}^{(x_0, y_0)}(I_x^2) & \mathcal{F}^{(x_0, y_0)}(I_x I_y) \\ \mathcal{F}^{(x_0, y_0)}(I_x I_y) & \mathcal{F}^{(x_0, y_0)}(I_y^2) \end{bmatrix}M(x0​,y0​)=[F(x0​,y0​)(Ix2​)F(x0​,y0​)(Ix​Iy​)​F(x0​,y0​)(Ix​Iy​)F(x0​,y0​)(Iy2​)​]

其中 F(x0,y0):Rn×n→R\mathcal{F}^{(x_0, y_0)}: \mathbb{R}^{n \times n} \rightarrow \mathbb{R}F(x0​,y0​):Rn×n→R

Eigenvalues for Classification

MMM 是对称正半定矩阵,可做特征值分解:

M=Q[λ100λ2]Q⊤M = Q \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix} Q^\topM=Q[λ1​0​0λ2​​]Q⊤

其中 λ1,λ2≥0\lambda_1, \lambda_2 \ge 0λ1​,λ2​≥0 为 MMM 的特征值。 由此得:

E(x0,y0)(u,v)≈λ1u′2+λ2v′2E_{(x_0, y_0)}(u, v) \approx \lambda_1 u'^2 + \lambda_2 v'^2E(x0​,y0​)​(u,v)≈λ1​u′2+λ2​v′2

其中 [u′v′]=Q[uv]\begin{bmatrix} u' \\ v' \end{bmatrix} = Q \begin{bmatrix} u \\ v \end{bmatrix}[u′v′​]=Q[uv​].

由此可见 E(u,v)E(u, v)E(u,v) 是一个抛物面,两个特征值分别对应抛物面在主轴方向上的曲率。依据 λ1,λ2\lambda_1, \lambda_2λ1​,λ2​ 的大小可判定点的类型:

  • 平坦区域(Flat):能量在任方向都很小,也即 λ1≈0,λ2≈0\lambda_1 \approx 0, \lambda_2 \approx 0λ1​≈0,λ2​≈0。
  • 边缘(Edge):沿边缘方向平移能量变化小,垂直方向平移变化大,也即一个特征值大,另一个接近 0。
  • 角点(Corner):沿任意方向平移都会引起能量较大变化,也即两个特征值都大。

Corner Response Function

上述判断需要做特征分解,计算成本略高。我们使用一个近似响应函数用以判断角点。 希望角点满足:

1/k<λ1/λ2<k(1)1/k \lt \lambda_1/\lambda_2 \lt k \qquad \tag{1}1/k<λ1​/λ2​<k(1) λ1,λ2>b(2)\lambda_1, \lambda_2 \gt b \qquad \tag{2}λ1​,λ2​>b(2)

令

θ=12(λ1λ2−2α(λ1+λ2)2)⏟(1)+12(λ1λ2−2t)⏟(2)=λ1λ2−α(λ1+λ2)2−t=det⁡M−α(trM)2−t=(F(Ix2)F(Iy2)−F(IxIy)2)−α(F(Ix2)+F(Iy2))2−t\begin{aligned} \theta &= \frac{1}{2} \underbrace{(\lambda_1 \lambda_2 - 2 \alpha (\lambda_1 + \lambda_2)^2)}_{(1)} + \frac{1}{2} \underbrace{(\lambda_1 \lambda_2 - 2t)}_{(2)} \\ &= \lambda_1 \lambda_2 - \alpha (\lambda_1 + \lambda_2)^2 - t \\ &= \det{M} - \alpha (\mathbb{tr}M)^2 - t \\ &= (\mathcal{F}(I_x^2) \mathcal{F}(I_y^2) - \mathcal{F}(I_x I_y)^2) - \alpha (\mathcal{F}(I_x^2) + \mathcal{F}(I_y^2))^2 - t \end{aligned}θ​=21​(1)(λ1​λ2​−2α(λ1​+λ2​)2)​​+21​(2)(λ1​λ2​−2t)​​=λ1​λ2​−α(λ1​+λ2​)2−t=detM−α(trM)2−t=(F(Ix2​)F(Iy2​)−F(Ix​Iy​)2)−α(F(Ix2​)+F(Iy2​))2−t​

即为 Harris 响应。若 θ\thetaθ 大且为正则为角点;若 θ\thetaθ 负并且绝对值大则为边缘;若 θ\thetaθ 接近 0 则为平坦区域。

注:其中 α,  t\alpha, \; tα,t 均为超参数。

Step of Harris

Harris Detector 在实际实现中通常步骤为:

  1. 计算图像梯度 Ix,IyI_x, I_yIx​,Iy​,并计算 Ix2,Iy2,IxIyI_x^2, I_y^2, I_x I_yIx2​,Iy2​,Ix​Iy​,得到与原图像同维度的三张梯度图。
  2. 对上述三图用高斯滤波 gσg_\sigmagσ​ 卷积得到三张与原图像同维度的高斯图。
  3. 对于像素点 (x0,y0)(x_0, y_0)(x0​,y0​),使用三张高斯图对应位置的三个数构成二阶对称阵,计算 θ\thetaθ,并进行阈值二值化 θ>0\theta > 0θ>0。
  4. 非极大值抑制(NMS) 保留局部极大值作为关键点位置。

Equivariance & Invariance

设输入信号空间 V\mathbb{V}V,输出表示空间 W\mathbb{W}W,信号检测函数 f:V→Wf: \mathbb{V} \rightarrow \mathbb{W}f:V→W。

记 T\mathcal{T}T 为抽象变换集合(如平移 5 像素、旋转 π/2\pi/2π/2)。对每个 τ∈T\tau \in \mathcal{T}τ∈T,同时定义:

  • TV(τ):V→VT_{\mathbb{V}}^{(\tau)}: \mathbb{V} \rightarrow \mathbb{V}TV(τ)​:V→V(τ\tauτ 在输入空间的实现)
  • TW(τ):W→WT_{\mathbb{W}}^{(\tau)}: \mathbb{W} \rightarrow \mathbb{W}TW(τ)​:W→W(τ\tauτ 在输出空间的实现)

Equivariance(等变性):对输入信号做变换,输出表示也同样变换。

TW(τ)[f(X)]=f(TV(τ)(X)),∀τ∈TT_{\mathbb{W}}^{(\tau)}[f(X)] = f(T_{\mathbb{V}}^{(\tau)}(X)), \quad \forall \tau \in \mathcal{T}TW(τ)​[f(X)]=f(TV(τ)​(X)),∀τ∈T

Invariance(不变性):对输入信号做变换,输出表示不变。

f(X)=f(TV(τ)(X)),∀τ∈Tf(X) = f(T_{\mathbb{V}}^{(\tau)}(X)), \quad \forall \tau \in \mathcal{T}f(X)=f(TV(τ)​(X)),∀τ∈T

注:上述性质都是检测函数 fff 的。

Harris Detector 的性质:

记输入图像为 A∈Rn×nA \in \mathbb{R}^{n \times n}A∈Rn×n。

M(x0,y0)=[F(x0,y0)(Ix2)F(x0,y0)(IxIy)F(x0,y0)(IxIy)F(x0,y0)(Iy2)]M(x_0,y_0) = \begin{bmatrix} \mathcal{F}^{(x_0, y_0)}(I_x^2) & \mathcal{F}^{(x_0, y_0)}(I_x I_y) \\ \mathcal{F}^{(x_0, y_0)}(I_x I_y) & \mathcal{F}^{(x_0, y_0)}(I_y^2) \end{bmatrix}M(x0​,y0​)=[F(x0​,y0​)(Ix2​)F(x0​,y0​)(Ix​Iy​)​F(x0​,y0​)(Ix​Iy​)F(x0​,y0​)(Iy2​)​] θ=(F(Ix2)F(Iy2)−F(IxIy)2)−α(F(Ix2)+F(Iy2))2−t\theta = (\mathcal{F}(I_x^2) \mathcal{F}(I_y^2) - \mathcal{F}(I_x I_y)^2) - \alpha (\mathcal{F}(I_x^2) + \mathcal{F}(I_y^2))^2 - tθ=(F(Ix2​)F(Iy2​)−F(Ix​Iy​)2)−α(F(Ix2​)+F(Iy2​))2−t Θ(A)=[θ(i,j)]∈Rn×n\Theta(A) = [\theta(i, j)] \in \mathbb{R}^{n \times n}Θ(A)=[θ(i,j)]∈Rn×n

以下的讨论不考虑边缘处。

  • 所有的 Θ\ThetaΘ 对图像平移(Translation)等变:

    记 Tu,vT_{u, v}Tu,v​ 表示平移 (u,v)(u, v)(u,v) 个像素,也即 (Tu,v(A))x,y=Ax−u,y−v(T_{u,v}(A))_{x, y} = A_{x-u, y-v}(Tu,v​(A))x,y​=Ax−u,y−v​。则有:

    Tu,v(Θ(A))=Θ(Tu,v(A))T_{u, v}(\Theta(A)) = \Theta(T_{u, v}(A))Tu,v​(Θ(A))=Θ(Tu,v​(A))

    证明:

    只需证明以下三个引理,具体证略。

    • 平移与梯度可交换 Tu,v(∂A∂x)=∂Tu,v(A)∂x,Tu,v(∂A∂y)=∂Tu,v(A)∂yT_{u,v}\left(\frac{\partial A}{\partial x}\right) = \frac{\partial T_{u,v}(A)}{\partial x}, \quad T_{u,v}\left(\frac{\partial A}{\partial y}\right) = \frac{\partial T_{u,v}(A)}{\partial y}Tu,v​(∂x∂A​)=∂x∂Tu,v​(A)​,Tu,v​(∂y∂A​)=∂y∂Tu,v​(A)​
    • 平移与代数运算可交换 Tu,v(A⋅B)=Tu,v(A)⋅Tu,v(B)T_{u,v}(A \cdot B) = T_{u,v}(A) \cdot T_{u,v}(B)Tu,v​(A⋅B)=Tu,v​(A)⋅Tu,v​(B)
    • 平移与卷积可交换 Tu,v(g∗A)=g∗Tu,v(A)T_{u,v}(g * A) = g * T_{u,v}(A)Tu,v​(g∗A)=g∗Tu,v​(A)
  • 各向同性(Isotropic) 的 filter 产生的 Θ\ThetaΘ 对图像旋转(Rotation)等变:

    记 RϕR_\phiRϕ​ 表示图像旋转 ϕ\phiϕ 角度,即 (Rϕ(A))x,y=Ax′,y′(R_\phi(A))_{x,y} = A_{x',y'}(Rϕ​(A))x,y​=Ax′,y′​,其中 (x′,y′)(x', y')(x′,y′) 是 (x,y)(x,y)(x,y) 旋转 −ϕ-\phi−ϕ 后的坐标。 filter 为各向同性的核 ggg。 则有:

    Rϕ(Θ(A))=Θ(Rϕ(A))R_\phi(\Theta(A)) = \Theta(R_\phi(A))Rϕ​(Θ(A))=Θ(Rϕ​(A))

    证明:

    只需证明以下三个引理,具体证略。

    • 旋转与梯度可交换 Rϕ(∂A∂x)=∂Rϕ(A)∂x′,Rϕ(∂A∂y)=∂Rϕ(A)∂y′R_\phi\left(\frac{\partial A}{\partial x}\right) = \frac{\partial R_\phi(A)}{\partial x'}, \quad R_\phi\left(\frac{\partial A}{\partial y}\right) = \frac{\partial R_\phi(A)}{\partial y'}Rϕ​(∂x∂A​)=∂x′∂Rϕ​(A)​,Rϕ​(∂y∂A​)=∂y′∂Rϕ​(A)​
    • 旋转与代数运算可交换 Rϕ(A⋅B)=Rϕ(A)⋅Rϕ(B)R_\phi(A \cdot B) = R_\phi(A) \cdot R_\phi(B)Rϕ​(A⋅B)=Rϕ​(A)⋅Rϕ​(B)
    • 旋转与卷积可交换 Rϕ(g∗A)≈g∗Rϕ(A)R_\phi(g * A) \approx g * R_\phi(A)Rϕ​(g∗A)≈g∗Rϕ​(A)

    注:

    • 约等于是因为在像素网格中考虑,旋转后必须采用插值方式计算像素值。
    • kernel 的 rotation invariant 对应于 kernel convolution 的 rotation equivariant。
  • 对尺度(Scale)不等变: 放大缩小 viewpoint 会导致角点检测结果变化。

    注:SIFT 的 DoG 检测或 SURF 等是尺度不变的。

目录
  • Convolution Operator
    • Convolution VS Cross-Correlation
      • 1D
      • 2D
      • Difference
    • Padding
      • Importance
      • Padding Types
      • Output Size
    • Implementation of Convolution
      • im2col
      • Toplitz
  • Line Fitting
    • Least Squares
    • Imperoved Least Squares
    • RANSAC
      • Step of RANSAC
      • The Number of Sample
      • Imperovement
    • Hough Transform
    • RANSAC VS Hough
  • Corner Detection
    • Corners as Keypoints
    • Harris Detector
      • The Definition fo Energy
      • Window Function
      • Eigenvalues for Classification
      • Corner Response Function
      • Step of Harris
      • Equivariance & Invariance
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo