高光谱拼接算法(二)Harris 角点探测

本篇算法仓位:harris

1. 拼接算法现状

首先先需要说明的是,不同于我们之前介绍的 CV 和 NLP,在这些领域中,DL 方法已经成为绝对主流,传统机器学习和统计学方法更多只作为思想上的参考。

其根本原因还是我们之前提到过的:

DL 本质上是数据驱动的方法,而这些领域恰恰拥有海量数据,从而使模型能够依靠规模持续提升性能。

而在高光谱拼接这个细分领域中,情况有所不同,可以说:

传统方法仍然非常强势,但与此同时,也已经出现了大量基于 DL 的相关模型与技术,可以预见未来 DL 方法的占比一定会持续提升。

造成这一现状的原因,大致可以归结为以下几点:

  1. 高光谱图像本身采集成本高、设备昂贵、波段标准不统一,因此公开数据集相对稀缺
  2. 拼接问题往往不存在唯一严格正确的结果,导致高质量监督标签难以构建
  3. 拼接问题本质上仍然属于几何配准与优化问题,而传统数学方法在这一领域已经发展得非常成熟。
  4. 高光谱数据与传感器、光照、成像系统等物理过程密切相关,因此物理建模天然具有较强适用性。

因此,虽然在后续我们会逐步引入 DL 相关方法,但这不代表近几篇的数学方法过时,事实上,即使是在这个领域的最新论文中,依然能够频繁看到传统数学算法的身影。

2. Harris 角点探测(Harris Corner Detector)

Harris 起源于 1988 年的论文 A Combined Corner and Edge Detector,它可以说影响了整个局部特征检测时代。

虽然现在的论文里看不到这种原始方法了,但数学不能跳过加减乘除直接去学积分,我们可以在后续大部分相关算法中都看到它的思想。

简单来说,我们可以把图像内容分成下面几类:

  1. 平坦区域:往任何方向移动,内容几乎没变化,比如背景里的天空。
  2. 边缘:沿着边缘方向移动,变化不大;但垂直边缘方向移动变化很大,比如墙的边。
  3. 角点:从这个位置往任何方向移动,变化都很大,比如窗户角(物理上的,不是"角所在的那个像素点")。

Harris 的检测目标就是第三种:各方向都敏感的位置

因此,要强调的是:Harris 不是边缘检测算法,也不是"特殊像素点"检测算法,而是局部特征检测算法。

这种局部特征检测逻辑在后续会作为拼接算法的一环,来找到不同图像中的相同物体。

2.1 图像数据中的近似偏导

在展开具体逻辑前,首先,我们知道:要求某个变量发生微小变化带来的变化量,就要去求偏导:

\\\frac{\\partial I}{\\partial x} = \\lim_{h \\to 0} \\frac{I(x+h,y) - I(x,y)}{h} \\

也就是说:如果一个位置在多个方向上都存在较大导数值,那么它更可能是角点。

但这里有一个问题:标准求导需要的是连续 函数,但我们现在只有离散的图像数据(以灰度图为例):

\\\begin{bmatrix} 12 \& 34 \& 7 \& 45 \& 23 \\\\ 5 \& 89 \& 16 \& 2 \& 51 \\\\ 73 \& 28 \& 64 \& 19 \& 37 \\\\ 41 \& 9 \& 55 \& 82 \& 14 \\\\ 66 \& 93 \& 11 \& 38 \& 77 \\end{bmatrix} \\

显然,我们没法直接计算每个元素在两个方向的导数值,因此,一种最基础的方法就是用差分法来近似导数 ,比如(以 \(x\) 方向为例):

  1. 前向差分:

\I_x \\approx I(x+1)-I(x) \\

  1. 后向差分:

\I_x \\approx I(x)-I(x-1) \\

  1. 中心差分(最常用)

\I_x \\approx \\frac{I(x+1)-I(x-1)}{2} \\

而 Harris 里常用的是信号处理中最基础的 Sobel 算子 (同样以 \(x\) 方向为例),我们 之前 用过它来进行边缘检测。

\K_x = \\begin{bmatrix} -1 \& 0 \& 1 \\\\ -2 \& 0 \& 2 \\\\ -1 \& 0 \& 1 \\end{bmatrix} \\

你可能会觉得怎么突然从公式跳到矩阵了,但我们把这个矩阵对应的运算展开,你会发现这就是用加入平滑的差分法来近似导数

对应图像里的一个 3×3 小块:

\I = \\begin{bmatrix} p_{11} \& p_{12} \& p_{13} \\\\ p_{21} \& p_{22} \& p_{23} \\\\ p_{31} \& p_{32} \& p_{33} \\end{bmatrix} \\

其运算就是:

\I_x = (-1)p_{11} + 0p_{12} + 1p_{13} + (-2)p_{21} + 0p_{22} + 2p_{23} + (-1)p_{31} + 0p_{32} + 1p_{33} \\

展开逻辑:

  1. 中间列全零,表示不参与左右对比。
  2. -2 和 2 是权重,表示中心信息更重要。
  3. 上下两行的元素用来进行平滑,降低噪声。

值得一提的是,如果是 RGB 图像,可以对三个通道分别求各方向的近似偏导,再融合,也可以直接对三通道值加权融合后再计算近似偏导,方法并不唯一,更多通道也是同理。

最终,你会发现这个公式的语义是:

\I_x \\approx (\\text{右边强度}) - (\\text{左边强度}) \\

结果 \(I_x\) 就表示这个 \(3×3\) 小区域在 \(x\) 方向上的变化强度。 在这个例子里,它就表示 \(p_{22}\) 位置在 \(x\) 方向上的近似偏导。

现在,对整幅灰度图像分别应用两个方向的 Sobel 算子,我们就得到了每个位置在 \(x\) 方向和 \(y\) 方向上的近似偏导,即梯度 : \(I_x\) 和 \(I_y\) 。

这里还有一个细节:在图像的边界,卷积核会"伸出图像外"。因此,需要对这一圈数据进行边界处理,如抛弃、零填充、边缘复制或镜像填充,镜像填充是实际工程中最常见的。

2.2 窗口变化函数

我们已经得到了图像中每个位置的梯度 \(I_x\) 和 \(I_y\),下一步问题是:

如何利用这些梯度判断一个区域是不是角点?

这里就引出了 Harris 的经典思想:

不看单个像素,而看一个局部窗口在发生微小位移后,整体变化有多大。

原因首先是单个点的噪声因素过多,没有统计稳定性,并且很难区分边缘和角点。

并且,"角点"本身就是应该是局部结构,因为物理意义上的角点几乎不可能只占一个像素。

最终,Harris 的结论是:真正稳定的角点特征,应该在一个小区域内都体现出明显变化。

因此,它定义了一个"窗口变化函数":

\E(u,v)= \\sum_{(x,y)\\in W} w(x,y) \\left\[ I(x+u,y+v)-I(x,y) \\right^2 \]

具体展开:

  1. \(W\):局部窗口,在具体实现里尺寸在 \(3 \sim 21\) 的范围内都有。
  2. \((x,y)\):窗口内偏移,注意是相对坐标,不是绝对坐标。
  3. \((u,v)\):整个窗口的平移。
  4. \(w(x,y)\):权重,通常是二维高斯权重
  5. 平方项:避免正负抵消,并强化变化明显的位置。
  6. \(E(u,v)\) 表示:这个窗口移动后,与原窗口的差异大小。

这里简单补充一下二维高斯权重:

\w(x,y)=\\exp\\left(-\\frac{x\^2+y\^2}{2\\sigma\^2}\\right) \\

在这里,其逻辑就是:让"中心像素更重要,离中心越远越不重要"。 这样会削弱边缘噪声,同时不让微小平移过多影响输出。

式子里的 \(\sigma\) 是超参数,分析就会发现:

  1. 小 \(\sigma\):权重集中在中心,只看"非常局部",对细节敏感。
  2. 大 \(\sigma\):权重分布更"平"、边缘部分的权重增加、更稳定但更粗糙。

同时,在具体工程实现中,局部窗口大小 \(W\) 和 \(\sigma\) 设计通常是:

\W \\approx 6\\sigma + 1 \\

因为高斯在 \(\pm 3\sigma\) 外几乎为 0,过大的窗口没有意义,过小的窗口又会丢失信息。

现在,根据对同一个窗口应用不同偏移量的函数结果,我们就可以对窗口内容进行区分:

  1. 如果窗口怎么移动都差不多:平坦区域。
  2. 如果只在某个方向变化大:边缘。
  3. 如果任何方向变化都大:角点。

这里有一个关键问题:

\I(x+u,y+v) \\

对于这种"偏移后函数值"的形式,我们当然可以规定偏移量为整数,然后对每个窗口暴力枚举 不同方向的响应值,但这种方法,无论是在精度还是计算量都十分局限。

所以,我们要回归数学原理,Harris 的下一步是对这个式子进行一阶泰勒展开

\I(x+u,y+v) \\approx I(x,y) + I_xu + I_yv \\

现在,我们上一步计算的梯度就再次出现了,再代回原式:

\E(u,v) = \\sum_{(x,y)\\in W} w(x,y) \\left\[ I_xu+I_yv \\right^2 \]

展开平方:

\E(u,v) = \\sum w(x,y) \\left( I_x\^2u\^2 + 2I_xI_yuv + I_y\^2v\^2 \\right) \\

到这里,我们就使用梯度把图像局部变化写成关于位移 \((u,v)\) 的解析函数,但是到这还没结束,我们还要继续推导。

2.3 Harris 矩阵

现在, 我们进行移项,把整个式子整理为矩阵运算形式:

\E(u,v)= \\begin{bmatrix} u \& v \\end{bmatrix} M \\begin{bmatrix} u\\\\ v \\end{bmatrix} \\

其中:

\M= \\begin{bmatrix} \\sum w I_x\^2 \& \\sum w I_xI_y\\\\ \\sum w I_xI_y \& \\sum w I_y\^2 \\end{bmatrix} \\

这个矩阵就叫: Harris 矩阵,它是整个算法的核心:

  1. \(\sum I_x^2\) :表示区域内水平方向变化强度。
  2. \(\sum I_y^2\) :表示区域内竖直方向变化强度。
  3. \(\sum I_xI_y\) :表示两个方向变化的相关性。

你会发现,这个式子的形式和之前提到过的协方差矩阵几乎完全一样,但它统计的不是数据分布,而是: "这个局部区域在各方向上的整体梯度分布"。

因此, Harris 矩阵可以代表一个局部区域里的变化方向结构

而具有这种"局部结构描述工具"性质的矩阵后续一般统称为结构张量(Structure Tensor)

现在,我们知道了,通过Harris 矩阵就可以分析窗口在各个方向的变化强度,接下来就进入经典内容了:

2.4 特征值分解和结果分析

因为矩阵 \(M\) 是一个实对称矩阵:

\M= \\begin{bmatrix} a \& b\\\\ b \& c \\end{bmatrix} \\

所以它一定可以进行特征值分解。设其两个特征值为:\(\lambda_1,\lambda_2\)

它们的物理意义就是这个局部区域变化最剧烈的两个主方向的变化强度。

展开一下逻辑:

在这里,要求窗口在哪个方向变化最大,我们要看 :

\E(u,v)= \\begin{bmatrix} u \& v \\end{bmatrix} M \\begin{bmatrix} u\\\\ v \\end{bmatrix} \\

也就说我们其实在求相同长度位移得到的最大响应值

\\\max_{\|\\mathbf u\|=1} \\mathbf u\^TM\\mathbf u \\

这部分的推导我们之前在 PCA 里已经展开过了。总之,对于对称矩阵:

\\\mathbf u\^TM\\mathbf u \\

其在单位球上的最大值等于最大特征值。而取得最大值的方向就是对应特征向量。

最终,我们可以以此判断这个窗口的内容:

区域类型 特征值关系 局部变化特性 几何含义 典型例子
平坦区域 \\lambda_1 \\approx 0,\\ \\lambda_2 \\approx 0 任意方向移动,窗口变化都很小 没有明显梯度与方向结构 天空、纯色墙面
边缘区域 \\lambda_1 \\gg \\lambda_2 一个方向变化大,另一个方向变化小 仅存在单一主变化方向 墙边、纸张边缘、道路边界
角点区域 \\lambda_1 \\gg 0,\\ \\lambda_2 \\gg 0 任意方向移动都会产生明显变化 两个主方向都存在强变化 窗角、棋盘格交点、纹理交汇处

2.5 工程优化和非极大值抑制

还没结束,实际计算中,我们不可能真的对每个矩阵都求特征值,这会带来过大的计算量。

因此,Harris 又做一步工程优化:

根据齐次方程存在非零解时行列式为 0 和韦达定理,对于矩阵 :

\M= \\begin{bmatrix} a \& b\\\\ b \& c \\end{bmatrix} \\

其两个特征值满足:

\\\lambda_1+\\lambda_2=\\operatorname{trace}(M)=a+c \\

\\\lambda_1\\lambda_2=\\det(M) =ac-b\^2 \\

于是 Harris 构造了一个新的响应函数:

\R=\\det(M)-k\\cdot (\\operatorname{trace}(M))\^2 \\

其中:

  1. \(\det(M)\) 希望两个特征值都大。
  2. \((\operatorname{trace}(M))^2\) 会惩罚"单方向特别大"的情况。
  3. \(k\) 是超参数,通常 \(k\in0.04,0.06\)。

所以,Harris 的最终判定逻辑就是:

区域类型 Harris 响应 \(R\)
平坦区域 \(R\approx 0\)
边缘区域 \(R<0\)
角点区域 \(R\gg 0\)

最终,在代码里,角点判定条件就是:

\R\>阈值 \\

但到这里还还还还没有结束,因为实际应用时会出现一个问题:

真正的角点附近,往往会出现一大片连续高响应区域。

原因就是我们最开始说的:物理上的角点几乎不可能只在一个窗口或者一个像素上。

因此,在完成检测后,还会再进行非极大值抑制再输出,我们之前在检测算法那里展开过,这里的基本逻辑也是相同的:

对于每个候选点取一个局域,判断自己是不是其中最大的响应值,如果不是,就删除。

到这里,Harris 的完成逻辑才终于结束了。代码流程图如下:

Harris 虽然计算高效、旋转稳定,并首次系统性地利用梯度统计描述局部结构,但它仍存在明显局限:固定窗口导致缺乏尺度不变性,只能检测"哪里是角点"却无法描述角点本身,同时对光照变化与噪声较为敏感。

尽管如此,它提出的"局部区域结构张量化"思想深刻影响了后续大量经典方法,例如 Scale-Invariant Feature Transform、Speeded Up Robust Features 与 Optical Flow 等,其核心的梯度、局部统计与方向响应思想至今仍广泛存在于现代 CV 中。

相关推荐
哥布林学者2 天前
高光谱拼接算法(六)RANSAC 误匹配剔除
高光谱成像
哥布林学者3 天前
高光谱拼接算法(五)SIFT 的变体与发展
高光谱成像
哥布林学者4 天前
高光谱拼接算法(四)SIFT 特征匹配
高光谱成像
哥布林学者5 天前
高光谱拼接算法(三)SIFT 特征点检测
高光谱成像
哥布林学者1 个月前
高光谱拼接算法(一)扫推式成像和航带拼接算法
机器学习·高光谱成像
哥布林学者4 个月前
高光谱成像基础(完)光谱融合(Spectral Fusion)
机器学习·高光谱成像
哥布林学者4 个月前
高光谱成像(十二)光谱重建(Spectral Reconstruction)
机器学习·高光谱成像
哥布林学者4 个月前
高光谱成像(十一)异常检测算法 RX 与 KRX
机器学习·高光谱成像
哥布林学者4 个月前
高光谱成像(十)基于 LMM 的端元提取
机器学习·高光谱成像