文章目录
- 3. 斑点检测
- 3.1 斑点的理解
- 3.1.1 斑点定义
- 3.1.2 斑点检测
- 3.2斑点检测基本原理
- 3.3LoG计算流程及原理
- 1. 高斯函数
- 2. 拉普拉斯算子
- 3. 组合高斯和平滑
- 4. 计算 LoG
- 4.1. 一阶导数
- 4.2. 二阶导数
- 4.3. 组合二阶导数
- 5. LoG 的特性
- 6.多尺度检测
- 3.4 DOG
- 3.4.1 DoG 的基本原理
- 3.4.2 DoG 的步骤
- 1. 高斯模糊
- 2. 计算差异
- 3. 处理结果
- 3.4.3 DoG 的特性
- 3.4.4 应用
- 3.4.5 总结
- 3.5 DOH斑点检测
- 3.5.1. 定义
- 3.5.2 数学原理
- 1. Hessian 矩阵
- 2. Difference of Hessian
- 3.5.3 优缺点
- 1. 优点
- 2. 缺点
- 3.6 SIFT斑点检测算法
- 3.6.1 SIFT 算法概述
- 3.6.2 SIFT 算法的原理
- 1. 尺度空间极值检测
- 2. 特征点定位
- 2.3. 方向分配确定
- 2.4. 特征描述
- 3.6.3 SIFT 算法的推导
- 3.6.4. SIFT 算法的优缺点
- 1. 优点
- 2. 缺点
3. 斑点检测
3.1 斑点的理解
3.1.1 斑点定义
在图像处理和计算机视觉中,斑点通常指的是图像中局部区域的特征或模式。这些斑点可以是图像中的亮点、暗点或其他特征,通常用于描述图像的纹理、形状或颜色分布。
- 定义:在图像中,斑点可以被定义为一组相邻像素,其强度值或颜色值与周围像素显著不同。斑点的特征可以通过局部统计量(如均值、标准差等)来描述。
3.1.2 斑点检测
斑点检测(Spot Detection)是指识别和定位图像中局部特征或模式的过程,这些特征通常表现为与周围区域在强度、颜色或纹理上显著不同的点或区域。斑点可以是亮点、暗点、特定形状的区域,或者是某种特定特征的表现。
3.2斑点检测基本原理
利用高斯拉普通拉斯(Laplace of Gaussian, LOG)算子检测图像斑点是一种十分常用的方法,对于二维高斯函数:
G ( x , y ; σ ) = 1 2 π σ 2 exp ( − x 2 + y 2 2 σ 2 ) G(x, y ; \sigma)=\frac{1}{2 \pi \sigma^2} \exp \left(-\frac{x^2+y^2}{2 \sigma^2}\right) G(x,y;σ)=2πσ21exp(−2σ2x2+y2)
它的拉普拉斯变换为:
∇ 2 g = ∂ 2 g ∂ x 2 + ∂ 2 g ∂ y 2 \nabla^2 g=\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2} ∇2g=∂x2∂2g+∂y2∂2g
规范化的高斯拉普变换为:
∇ norm 2 = σ 2 ∇ 2 g = σ 2 ( ∂ 2 g ∂ x 2 + ∂ 2 g ∂ y 2 ) = − 1 2 π σ 2 [ 1 − x 2 + y 2 σ 2 ] ⋅ exp ( − x 2 + y 2 2 σ 2 ) \nabla_{\text {norm }}^2=\sigma^2 \nabla^2 g=\sigma^2\left(\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2}\right)=-\frac{1}{2 \pi \sigma^2}\left[1-\frac{x^2+y^2}{\sigma^2}\right] \cdot \exp \left(-\frac{x^2+y^2}{2 \sigma^2}\right) ∇norm 2=σ2∇2g=σ2(∂x2∂2g+∂y2∂2g)=−2πσ21[1−σ2x2+y2]⋅exp(−2σ2x2+y2)
规范化算法子在二维图像上显示是一个圆对称函数,如下图所示。我们可以用这个算子来检测图像中的斑点, 并且可以通过改变 σ \sigma σ 的值, 可以检测不同尺寸的二维斑点。
3.3LoG计算流程及原理
Laplace of Gaussian (LoG) 是一种结合高斯平滑和拉普拉斯算子的边缘检测方法。通过对高斯函数进行二阶导数计算,LoG 能够有效地检测图像中的边缘和斑点。它涉及高斯函数的定义、拉普拉斯算子的应用以及一阶和二阶导数的计算。LoG 在图像处理和计算机视觉中被广泛应用于特征提取和边缘检测。
1. 高斯函数
首先,我们定义一个二维高斯函数,它用于平滑图像,以减少噪声的影响。二维高斯函数的形式为:
G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e−2σ2x2+y2
其中:
- ( x , y ) (x, y) (x,y) 是图像中的坐标。
- σ \sigma σ 是高斯分布的标准差,控制平滑的程度。
2. 拉普拉斯算子
拉普拉斯算子是一个二阶微分算子,用于检测图像中的边缘。二维拉普拉斯算子的定义为:
Δ f ( x , y ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \Delta f(x, y) = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} Δf(x,y)=∂x2∂2f+∂y2∂2f
其中 f ( x , y ) f(x, y) f(x,y) 是图像的强度函数。
3. 组合高斯和平滑
LoG 算法的核心思想是先用高斯函数对图像进行平滑,然后计算其拉普拉斯。我们可以将高斯函数与拉普拉斯算子结合,得到 LoG 的表达式:
L ( x , y ) = Δ G ( x , y ) = ∂ 2 G ( x , y ) ∂ x 2 + ∂ 2 G ( x , y ) ∂ y 2 L(x, y) = \Delta G(x, y) = \frac{\partial^2 G(x, y)}{\partial x^2} + \frac{\partial^2 G(x, y)}{\partial y^2} L(x,y)=ΔG(x,y)=∂x2∂2G(x,y)+∂y2∂2G(x,y)
4. 计算 LoG
为了计算 LoG,我们需要先计算高斯函数的二阶导数。首先计算一阶导数:
4.1. 一阶导数
高斯函数的 x 方向一阶导数为:
∂ G ( x , y ) ∂ x = − x σ 2 G ( x , y ) \frac{\partial G(x, y)}{\partial x} = \frac{-x}{\sigma^2} G(x, y) ∂x∂G(x,y)=σ2−xG(x,y)
y 方向一阶导数为:
∂ G ( x , y ) ∂ y = − y σ 2 G ( x , y ) \frac{\partial G(x, y)}{\partial y} = \frac{-y}{\sigma^2} G(x, y) ∂y∂G(x,y)=σ2−yG(x,y)
4.2. 二阶导数
接下来,我们计算二阶导数。首先计算 x 方向的二阶导数:
∂ 2 G ( x , y ) ∂ x 2 = ∂ ∂ x ( − x σ 2 G ( x , y ) ) \frac{\partial^2 G(x, y)}{\partial x^2} = \frac{\partial}{\partial x} \left( \frac{-x}{\sigma^2} G(x, y) \right) ∂x2∂2G(x,y)=∂x∂(σ2−xG(x,y))
使用乘积法则:
∂ 2 G ( x , y ) ∂ x 2 = − 1 σ 2 G ( x , y ) + − x σ 2 ∂ G ( x , y ) ∂ x \frac{\partial^2 G(x, y)}{\partial x^2} = \frac{-1}{\sigma^2} G(x, y) + \frac{-x}{\sigma^2} \frac{\partial G(x, y)}{\partial x} ∂x2∂2G(x,y)=σ2−1G(x,y)+σ2−x∂x∂G(x,y)
将一阶导数代入:
∂ 2 G ( x , y ) ∂ x 2 = − 1 σ 2 G ( x , y ) + x 2 σ 4 G ( x , y ) = ( x 2 − σ 2 σ 4 ) G ( x , y ) \frac{\partial^2 G(x, y)}{\partial x^2} = \frac{-1}{\sigma^2} G(x, y) + \frac{x^2}{\sigma^4} G(x, y) = \left( \frac{x^2 - \sigma^2}{\sigma^4} \right) G(x, y) ∂x2∂2G(x,y)=σ2−1G(x,y)+σ4x2G(x,y)=(σ4x2−σ2)G(x,y)
同样地,y 方向的二阶导数为:
∂ 2 G ( x , y ) ∂ y 2 = ( y 2 − σ 2 σ 4 ) G ( x , y ) \frac{\partial^2 G(x, y)}{\partial y^2} = \left( \frac{y^2 - \sigma^2}{\sigma^4} \right) G(x, y) ∂y2∂2G(x,y)=(σ4y2−σ2)G(x,y)
4.3. 组合二阶导数
将 x 和 y 方向的二阶导数结合起来,得到 LoG:
L ( x , y ) = Δ G ( x , y ) = ∂ 2 G ( x , y ) ∂ x 2 + ∂ 2 G ( x , y ) ∂ y 2 L(x, y) = \Delta G(x, y) = \frac{\partial^2 G(x, y)}{\partial x^2} + \frac{\partial^2 G(x, y)}{\partial y^2} L(x,y)=ΔG(x,y)=∂x2∂2G(x,y)+∂y2∂2G(x,y)
L ( x , y ) = ( x 2 − σ 2 σ 4 + y 2 − σ 2 σ 4 ) G ( x , y ) L(x, y) = \left( \frac{x^2 - \sigma^2}{\sigma^4} + \frac{y^2 - \sigma^2}{\sigma^4} \right) G(x, y) L(x,y)=(σ4x2−σ2+σ4y2−σ2)G(x,y)
L ( x , y ) = 1 σ 4 ( x 2 + y 2 − 2 σ 2 ) G ( x , y ) L(x, y) = \frac{1}{\sigma^4} \left( x^2 + y^2 - 2\sigma^2 \right) G(x, y) L(x,y)=σ41(x2+y2−2σ2)G(x,y)
5. LoG 的特性
- 边缘检测:LoG 在图像中边缘的地方会产生零交叉(zero-crossing),即从正值变为负值或从负值变为正值的地方,这些点对应于图像的边缘。
- 尺度不变性:通过调整 σ \sigma σ 的值,可以检测到不同尺度的边缘和特征。
6.多尺度检测
注意到当 σ \sigma σ 尺度一定时, 只能检测对应半径的斑点, 那么检测的是多大半径的斑点呢,我们可以通过对规范化的二维拉普拉斯高斯算子求导:
规范化的高斯拉普拉斯函数为:
∇ norm 2 = − 1 2 π σ 2 [ 1 − x 2 + y 2 σ 2 ] ⋅ exp ( − x 2 + y 2 2 σ 2 ) \nabla_{\text {norm }}^2=-\frac{1}{2 \pi \sigma^2}\left[1-\frac{x^2+y^2}{\sigma^2}\right] \cdot \exp \left(-\frac{x^2+y^2}{2 \sigma^2}\right) ∇norm 2=−2πσ21[1−σ2x2+y2]⋅exp(−2σ2x2+y2)
求 ∇ norm 2 \nabla_{\text {norm }}^2 ∇norm 2 的极点值等价于求取下式:
∂ ( ∇ norm 2 ) ∂ σ = 0 \frac{\partial\left(\nabla_{\text {norm }}^2\right)}{\partial \sigma}=0 ∂σ∂(∇norm 2)=0
得到:
( x 2 + y 2 − 2 σ 2 ) ⋅ exp ( − ( x 2 + y 2 ) 2 σ 2 ) r 2 − 2 σ 2 = 0 \begin{gathered} \left(x^2+y^2-2 \sigma^2\right) \cdot \exp \left(-\frac{\left(x^2+y^2\right)}{2 \sigma^2}\right) \\ r^2-2 \sigma^2=0 \end{gathered} (x2+y2−2σ2)⋅exp(−2σ2(x2+y2))r2−2σ2=0
对于图像中的斑点,在尺度 σ = r / 2 \sigma=\mathrm{r} / \sqrt{2} σ=r/2 时,高斯拉普拉斯响应值达到最大。同理,如果图像中的圆形斑点黑白反向,那么,它的高斯拉普拉斯响应值在 σ = r / 2 \sigma=\mathrm{r} / \sqrt{2} σ=r/2 时达到最小。将高斯拉普拉斯响应达到峰值时的尺度 σ \sigma σ 值,称为特征尺度。
那么在多尺度的情况下, 同时在空间和尺度上达到最大值(或最小值)的点就是我们所期望的斑点。对于二维图像 I( x , y x, y x,y ),计算图像在不同尺度下的离散拉普拉斯响应值,然后检查位置空间中的每个点;如果该点的拉普拉斯响应值都大小于或小于其他 26 个立方空间领域 ( 9 + 8 + 9 ) (9+8+9) (9+8+9) 的值, 那么该点就是被检测到的图像斑点。
3.4 DOG
当然可以!以下是关于 Difference of Gaussian (DoG) 的介绍,使用美元符号( )表示字母,公式用双美元符号( )表示字母,公式用双美元符号( )表示字母,公式用双美元符号($))表示。
3.4.1 DoG 的基本原理
Difference of Gaussian (DoG) 是一种常用的图像处理技术,主要用于边缘检测和特征提取。它通过计算两个不同标准差的高斯函数之间的差异来实现,能够有效地检测图像中的边缘和斑点。DoG 方法的基本思想是通过高斯模糊来平滑图像,然后通过计算不同尺度下的高斯函数的差异来突出图像中的特征。
其数学表达式为:
D ( x , y ) = G ( x , y , σ 1 ) − G ( x , y , σ 2 ) D(x, y) = G(x, y, \sigma_1) - G(x, y, \sigma_2) D(x,y)=G(x,y,σ1)−G(x,y,σ2)
其中:
- D ( x , y ) D(x, y) D(x,y) 是 DoG 的输出。
- G ( x , y , σ ) G(x, y, \sigma) G(x,y,σ) 是标准差为 σ \sigma σ 的二维高斯函数,定义为:
G ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y, \sigma) = \frac{1}{2\pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y,σ)=2πσ21e−2σ2x2+y2
- σ 1 \sigma_1 σ1 和 σ 2 \sigma_2 σ2 是两个不同的标准差,通常满足 σ 1 < σ 2 \sigma_1 < \sigma_2 σ1<σ2。
3.4.2 DoG 的步骤
DoG 的实现通常包括以下几个步骤:
1. 高斯模糊
对输入图像进行两次高斯模糊,使用不同的标准差 σ 1 \sigma_1 σ1 和 σ 2 \sigma_2 σ2:
- 计算 G ( x , y , σ 1 ) G(x, y, \sigma_1) G(x,y,σ1)
- 计算 G ( x , y , σ 2 ) G(x, y, \sigma_2) G(x,y,σ2)
2. 计算差异
计算两个高斯模糊图像之间的差异:
D ( x , y ) = G ( x , y , σ 1 ) − G ( x , y , σ 2 ) D(x, y) = G(x, y, \sigma_1) - G(x, y, \sigma_2) D(x,y)=G(x,y,σ1)−G(x,y,σ2)
3. 处理结果
通过阈值化或其他后处理方法来提取特征点或边缘。
3.4.3 DoG 的特性
- 边缘检测:DoG 能够有效地检测图像中的边缘,因为边缘处的强度变化会导致 D ( x , y ) D(x, y) D(x,y) 输出的局部极值。
- 尺度不变性:通过选择不同的 σ \sigma σ 值,DoG 可以检测到不同尺度的特征,这使得它在多尺度特征提取中非常有用。
- 近似 LoG:DoG 可以被视为对拉普拉斯高斯(LoG)算子的近似,LoG 是一种经典的边缘检测方法。DoG 的计算效率通常高于直接计算 LoG。
3.4.4 应用
DoG 在计算机视觉和图像处理中的应用非常广泛,包括但不限于:
- 特征点检测:如 SIFT(尺度不变特征变换)算法中使用 DoG 来检测关键点。
- 边缘检测:用于提取图像中的边缘信息。
- 图像分割:通过检测图像中的重要特征来辅助图像分割。
3.4.5 总结
Difference of Gaussian (DoG) 是一种有效的图像处理技术,通过计算两个不同标准差的高斯函数之间的差异来实现边缘检测和特征提取。它在计算机视觉领域中具有重要的应用价值,尤其是在特征点检测和多尺度分析中。DoG 的实现简单且计算效率高,使其成为许多图像处理任务中的首选方法之一。
一个与 LOG 滤波核近似的是高斯差分 DOG 滤波核, 它的定义为:
D ( x , y , σ ) = ( G ( x , y , k σ ) − G ( x , y , σ ) ) ∗ I ( x , y ) = L ( x , y , k σ ) − L ( x , y , σ ) D(x, y, \sigma)=(G(x, y, k \sigma)-G(x, y, \sigma)) * I(x, y)=L(x, y, k \sigma)-L(x, y, \sigma) D(x,y,σ)=(G(x,y,kσ)−G(x,y,σ))∗I(x,y)=L(x,y,kσ)−L(x,y,σ)
其中 k 为两个相邻尺度间的比例因子。
-
DOG 可以看作为 LOG 的一个近似, 但是它比 LOG 的效率更高。
-
前面介绍的微分算子在近圆的斑点检测方面效果很好, 但是这些检测算子被限定于只能检测圆形斑点, 而且不能估计斑点的方向, 因为 LOG 算子等都是中心对称的。
-
如果我们定义一种二维高斯核的变形, 记它在 X 方向与 Y 方向上具有不同的方差, 则这种算子可以用来检测带有方向的斑点。
G
(
x
,
y
)
=
A
⋅
exp
(
−
[
(
a
x
2
+
2
b
x
y
+
c
y
2
)
]
)
a
=
cos
2
θ
2
σ
x
2
+
sin
2
θ
2
σ
v
2
,
b
=
−
sin
2
θ
2
σ
x
2
+
sin
2
θ
4
σ
v
2
,
c
=
sin
2
θ
2
σ
x
2
+
cos
2
θ
2
σ
y
2
\begin{aligned} &\begin{gathered} G(x, y)=\mathcal{A} \cdot \exp \left(-\left[\left(a x^2+2 b x y+c y^2\right)\right]\right) \\ a=\frac{\cos ^2 \theta}{2 \sigma_x^2}+\frac{\sin ^2 \theta}{2 \sigma_v^2}, b=-\frac{\sin 2 \theta}{2 \sigma_x^2}+\frac{\sin 2 \theta}{4 \sigma_v^2}, c=\frac{\sin ^2 \theta}{2 \sigma_x^2}+\frac{\cos ^2 \theta}{2 \sigma_y^2} \end{gathered}\\ \end{aligned}
G(x,y)=A⋅exp(−[(ax2+2bxy+cy2)])a=2σx2cos2θ+2σv2sin2θ,b=−2σx2sin2θ+4σv2sin2θ,c=2σx2sin2θ+2σy2cos2θ
$ {其中 } \mathrm{A} \text { 是规一性因子。 }$
3.5 DOH斑点检测
DOH(Difference of Hessian) 是一种用于斑点检测的图像处理技术,主要用于检测图像中的局部极值点,尤其是在特征提取和边缘检测中。DOH 方法基于 Hessian 矩阵的特性,能够有效地识别图像中的斑点和其他重要特征。Difference of Hessian (DOH) 是一种有效的斑点检测方法,通过计算图像的 Hessian 矩阵的差异来识别局部极值点。它具有高效性和多尺度特征检测的优点,但也存在计算复杂度和参数选择等缺点。DOH 在计算机视觉和图像处理领域中被广泛应用,尤其是在特征提取和边缘检测任务中。
3.5.1. 定义
Difference of Hessian (DOH) 是一种通过计算图像的 Hessian 矩阵的差异来检测斑点的方法。Hessian 矩阵是一个二阶导数矩阵,能够捕捉图像强度变化的曲率信息。DOH 通过在不同尺度下计算 Hessian 矩阵的差异,来识别图像中的局部极值点。
3.5.2 数学原理
1. Hessian 矩阵
对于一个二维图像 I ( x , y ) I(x, y) I(x,y),Hessian 矩阵定义为:
H = [ ∂ 2 I ∂ x 2 ∂ 2 I ∂ x ∂ y ∂ 2 I ∂ y ∂ x ∂ 2 I ∂ y 2 ] H = \begin{bmatrix} \frac{\partial^2 I}{\partial x^2} & \frac{\partial^2 I}{\partial x \partial y} \\ \frac{\partial^2 I}{\partial y \partial x} & \frac{\partial^2 I}{\partial y^2} \end{bmatrix} H=[∂x2∂2I∂y∂x∂2I∂x∂y∂2I∂y2∂2I]
其中:
- ∂ 2 I ∂ x 2 \frac{\partial^2 I}{\partial x^2} ∂x2∂2I 是图像在 x x x 方向的二阶导数。
- ∂ 2 I ∂ y 2 \frac{\partial^2 I}{\partial y^2} ∂y2∂2I 是图像在 y y y 方向的二阶导数。
- ∂ 2 I ∂ x ∂ y \frac{\partial^2 I}{\partial x \partial y} ∂x∂y∂2I 是图像在 x x x 和 y y y 方向的混合二阶导数。
2. Difference of Hessian
DOH 的基本思想是计算不同尺度下的 Hessian 矩阵,并通过差异来检测斑点。具体步骤如下:
-
计算 Hessian 矩阵:对于不同的尺度 σ 1 \sigma_1 σ1 和 σ 2 \sigma_2 σ2,计算 Hessian 矩阵 H ( σ 1 ) H(\sigma_1) H(σ1) 和 H ( σ 2 ) H(\sigma_2) H(σ2)。
-
计算 DOH:通过计算 Hessian 矩阵的差异来得到 DOH:
D ( x , y ) = H ( σ 1 ) − H ( σ 2 ) D(x, y) = H(\sigma_1) - H(\sigma_2) D(x,y)=H(σ1)−H(σ2)
- 寻找局部极值:在 DOH 输出中寻找局部极值点,这些点对应于图像中的斑点。
3.5.3 优缺点
1. 优点
- 高效性:DOH 方法能够快速检测图像中的斑点,适合实时应用。
- 多尺度特征检测:通过选择不同的尺度参数,DOH 可以检测到不同大小的斑点,具有良好的尺度不变性。
- 鲁棒性:对噪声和光照变化具有一定的鲁棒性,能够有效地提取图像中的重要特征。
2. 缺点
- 计算复杂度:尽管 DOH 在特征检测中效率较高,但计算 Hessian 矩阵的二阶导数仍然需要较高的计算成本,尤其是在高分辨率图像中。
- 参数选择:DOH 的性能依赖于尺度参数的选择,选择不当可能导致特征检测效果不佳。
- 对平坦区域敏感:在平坦区域,Hessian 矩阵的特征可能不明显,导致斑点检测的效果降低。
3.6 SIFT斑点检测算法
SIFT(尺度不变特征变换,Scale-Invariant Feature Transform) 是一种广泛应用于计算机视觉领域的特征检测和描述算法。该算法由 David Lowe 于 1999 年提出,并在 2004 年进行了进一步的完善。SIFT 特别适用于目标识别、图像拼接、三维建模、手势识别和视频跟踪等任务。
3.6.1 SIFT 算法概述
SIFT 算法的主要目标是从图像中提取出具有尺度和旋转不变性的局部特征点。这些特征点在不同的图像变换(如缩放、旋转、亮度变化等)下能够保持稳定性,并且具有较强的可区分性。SIFT(尺度不变特征变换)是一种强大的特征检测和描述算法,具有尺度和旋转不变性,能够有效地提取图像中的局部特征。尽管存在计算复杂度和专利问题等缺点,但其在目标识别、图像拼接和三维建模等领域的广泛应用证明了其重要性和有效性
3.6.2 SIFT 算法的原理
SIFT 算法主要包括以下几个步骤:
1. 尺度空间极值检测
- 构建尺度空间:通过对图像进行高斯模糊,生成不同尺度的图像。高斯模糊的公式为:
G ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y, \sigma) = \frac{1}{2\pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y,σ)=2πσ21e−2σ2x2+y2
- 差分高斯(DoG):通过计算不同尺度下的高斯图像之间的差异,构建 DoG 图像:
D ( x , y , σ ) = G ( x , y , k σ ) − G ( x , y , σ ) D(x, y, \sigma) = G(x, y, k\sigma) - G(x, y, \sigma) D(x,y,σ)=G(x,y,kσ)−G(x,y,σ)
其中 k k k 是尺度因子。在大尺度下(k值大)表现的是图像的概貌信息,在小尺度下(k 值小)表现的是图像的细节信息。因此大尺度对应着低分辨率,小尺度对应着高分辨率。(x, y)则表示在 σ 尺度下的图像像素坐标;
- 寻找极值点:在 DoG 图像中寻找局部极值点,这些点是潜在的具有尺度不变性和旋转不变性特征点。
2. 特征点定位
- 精确特征点定位:对检测到的特征点进行精确定位,去除低对比度的特征点和边缘响应强的特征点,以提高特征点的稳定性。
通过上一步, 得到了极值点,但这些极值点还仅仅是候选的特征点,因为它们还存在一些不确定的因素。首先是极值点的搜索是在离散空间内进行的,并且这些离散空间还是经过不断的降采样得到的。如果把采样点拟合成曲面后 会发现,原先的极值点并不是真正的极值点,也就是离散空间的极值点并不是连续空间的极值点。在这里, 是需要精确定位特征点的位置和尺度的,也就是要达到亚像素精度,因此必须进行拟合处理。
使用泰勒级数展开式作为拟合函数。如上所述, 极值点是一个三维矢量, 即它包括极值点所在的尺度, 以及它的尺度图像坐标, 即
X
=
(
x
,
y
,
σ
)
T
\boldsymbol{X}=(x, y, \sigma)^T
X=(x,y,σ)T, 因此 需要三维函数的泰勒级数展开式, 设 在
X
0
=
(
x
0
,
y
0
,
σ
0
)
T
X_0=\left(x 0, y_0, \sigma_0\right)^T
X0=(x0,y0,σ0)T 处进行泰勒级数展开, 则它的矩阵形式为:
f
(
[
x
y
σ
]
)
≈
f
(
[
x
0
y
0
σ
0
]
)
+
[
∂
f
∂
x
∂
f
∂
y
∂
f
∂
σ
]
(
[
x
y
σ
]
−
[
x
0
y
0
σ
0
]
)
+
f\left(\left[\begin{array}{l} x \\ y \\ \sigma \end{array}\right]\right) \approx f\left(\left[\begin{array}{l} x_0 \\ y_0 \\ \sigma_0 \end{array}\right]\right)+\left[\begin{array}{lll} \frac{\partial f}{\partial x} & \frac{\partial f}{\partial y} & \frac{\partial f}{\partial \sigma} \end{array}\right]\left(\left[\begin{array}{l} x \\ y \\ \sigma \end{array}\right]-\left[\begin{array}{l} x_0 \\ y_0 \\ \sigma_0 \end{array}\right]\right)+
f
xyσ
≈f
x0y0σ0
+[∂x∂f∂y∂f∂σ∂f]
xyσ
−
x0y0σ0
+
1 2 ( [ x y σ ] − [ x 0 y 0 σ 0 ] ) [ ∂ 2 f ∂ x ∂ x ∂ 2 f ∂ x ∂ y ∂ 2 f ∂ x ∂ σ ∂ 2 f ∂ x ∂ y ∂ 2 f ∂ y ∂ y ∂ 2 f ∂ y ∂ σ ∂ 2 f ∂ x ∂ σ ∂ 2 f ∂ y ∂ σ ∂ 2 f ∂ σ ∂ σ ] ( [ x y σ ] − [ x 0 y 0 σ 0 ] ) \frac{1}{2}\left(\left[\begin{array}{lll} x & y & \sigma \end{array}\right]-\left[\begin{array}{lll} x_0 & y_0 & \sigma_0 \end{array}\right]\right)\left[\begin{array}{ccc} \frac{\partial^2 f}{\partial x \partial x} & \frac{\partial^2 f}{\partial x \partial y} & \frac{\partial^2 f}{\partial x \partial \sigma} \\ \frac{\partial^2 f}{\partial x \partial y} & \frac{\partial^2 f}{\partial y \partial y} & \frac{\partial^2 f}{\partial y \partial \sigma} \\ \frac{\partial^2 f}{\partial x \partial \sigma} & \frac{\partial^2 f}{\partial y \partial \sigma} & \frac{\partial^2 f}{\partial \sigma \partial \sigma} \end{array}\right]\left(\left[\begin{array}{l} x \\ y \\ \sigma \end{array}\right]-\left[\begin{array}{l} x_0 \\ y_0 \\ \sigma_0 \end{array}\right]\right) 21([xyσ]−[x0y0σ0]) ∂x∂x∂2f∂x∂y∂2f∂x∂σ∂2f∂x∂y∂2f∂y∂y∂2f∂y∂σ∂2f∂x∂σ∂2f∂y∂σ∂2f∂σ∂σ∂2f xyσ − x0y0σ0
这是舍去高阶项的形式,而它的矢量表示形式为
f ( X ) = f ( X 0 ) + ∂ f T ∂ X ( X − X 0 ) + 1 2 ( X − X 0 ) T ∂ 2 f ∂ X 2 ( X − X 0 ) f(\boldsymbol{X})=f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}}\left(\boldsymbol{X}-\boldsymbol{X}_0\right)+\frac{1}{2}\left(\boldsymbol{X}-\boldsymbol{X}_0\right)^T \frac{\partial^2 f}{\partial \boldsymbol{X}^2}\left(\boldsymbol{X}-\boldsymbol{X}_0\right) f(X)=f(X0)+∂X∂fT(X−X0)+21(X−X0)T∂X2∂2f(X−X0)
在这里 X 0 \mathbf{X}_0 X0 表示离散空间下的插值中心(在离散空间内也就是采样点)坐标, X \mathbf{X} X 表示拟合后连续空间下的插值点坐标, 设 X ^ = X − X 0 \widehat{\mathbf{X}}=\mathbf{X}-\mathbf{X}_0 X =X−X0, 则 X ^ \widehat{\mathbf{X}} X 表示相对于插值中心, 插值后的偏移量。因此上式经过变量变换后, 又可写成
f ( X ^ ) = f ( X 0 ) + ∂ f T ∂ X X ^ + 1 2 X T ∂ 2 f ∂ X 2 X ^ f(\widehat{X})=f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}}+\frac{1}{2} \boldsymbol{X}^T \frac{\partial^2 f}{\partial \boldsymbol{X}^2} \widehat{\boldsymbol{X}} f(X )=f(X0)+∂X∂fTX +21XT∂X2∂2fX
对上式求导, 得:
∂
f
(
X
^
)
∂
X
^
=
∂
f
T
∂
X
+
1
2
(
∂
2
f
∂
X
2
+
∂
2
f
T
∂
X
2
)
X
=
∂
f
T
∂
X
+
∂
2
f
∂
X
2
X
^
\frac{\partial f(\widehat{\boldsymbol{X}})}{\partial \widehat{\mathbf{X}}}=\frac{\partial f^T}{\partial \boldsymbol{X}}+\frac{1}{2}\left(\frac{\partial^2 f}{\partial \boldsymbol{X}^2}+\frac{\partial^2 f^T}{\partial \boldsymbol{X}^2}\right) \mathscr{X}=\frac{\partial f^T}{\partial \boldsymbol{X}}+\frac{\partial^2 f}{\partial \boldsymbol{X}^2} \widehat{X}
∂X
∂f(X
)=∂X∂fT+21(∂X2∂2f+∂X2∂2fT)X=∂X∂fT+∂X2∂2fX
让原始式的导数为 0 , 即上式
=
0
=0
=0, 就可得到极值点下的相对于插值中心
X
0
X_0
X0 的偏移量:
X ^ = − ∂ 2 f − 1 ∂ X 2 ∂ f ∂ X \widehat{X}=-\frac{\partial^2 f^{-1}}{\partial X^2} \frac{\partial f}{\partial X} X =−∂X2∂2f−1∂X∂f
把公式得到的极值点带入公式 中, 就得到了该极值点下的极值:
f ( X ^ ) = f ( X 0 ) + ∂ f T ∂ X X ^ + 1 2 ( − ∂ 2 f − 1 ∂ X 2 ∂ f ∂ X ) T ∂ 2 f ∂ X 2 ( − ∂ 2 f − 1 ∂ X 2 ∂ f ∂ X ) = f ( X 0 ) + ∂ f T ∂ X X ^ + 1 2 ∂ f T ∂ X ∂ 2 f − T ∂ X 2 ∂ 2 f ∂ X 2 ∂ 2 f − 1 ∂ X 2 ∂ f ∂ X = f ( X 0 ) + ∂ f T ∂ X X ^ + 1 2 ∂ f T ∂ X ∂ 2 f − 1 ∂ X 2 ∂ f ∂ X = f ( X 0 ) + ∂ f T ∂ X X ^ + 1 2 ∂ f T ∂ X ( − X ^ ) = f ( X 0 ) + 1 2 ∂ f T ∂ X X ^ \begin{aligned} f(\widehat{\boldsymbol{X}}) & =f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}}+\frac{1}{2}\left(-\frac{\partial^2 f^{-1}}{\partial \boldsymbol{X}^2} \frac{\partial f}{\partial \boldsymbol{X}}\right)^T \frac{\partial^2 f}{\partial \boldsymbol{X}^2}\left(-\frac{\partial^2 f^{-1}}{\partial \boldsymbol{X}^2} \frac{\partial f}{\partial \boldsymbol{X}}\right) \\ & =f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}}+\frac{1}{2} \frac{\partial f^T}{\partial \boldsymbol{X}} \frac{\partial^2 f^{-T}}{\partial X^2} \frac{\partial^2 f}{\partial X^2} \frac{\partial^2 f^{-1}}{\partial X^2} \frac{\partial f}{\partial \boldsymbol{X}} \\ & =f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}}+\frac{1}{2} \frac{\partial f^T}{\partial \boldsymbol{X}} \frac{\partial^2 f^{-1}}{\partial X^2} \frac{\partial f}{\partial \boldsymbol{X}} \\ & =f\left(\boldsymbol{X}_0\right)+\frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}}+\frac{1}{2} \frac{\partial f^T}{\partial \boldsymbol{X}}(-\widehat{\boldsymbol{X}}) \\ & =f\left(\boldsymbol{X}_0\right)+\frac{1}{2} \frac{\partial f^T}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}} \end{aligned} f(X )=f(X0)+∂X∂fTX +21(−∂X2∂2f−1∂X∂f)T∂X2∂2f(−∂X2∂2f−1∂X∂f)=f(X0)+∂X∂fTX +21∂X∂fT∂X2∂2f−T∂X2∂2f∂X2∂2f−1∂X∂f=f(X0)+∂X∂fTX +21∂X∂fT∂X2∂2f−1∂X∂f=f(X0)+∂X∂fTX +21∂X∂fT(−X )=f(X0)+21∂X∂fTX
= f ( X 0 ) + 1 2 f ∂ X X ^ =f\left(\boldsymbol{X}_0\right)+\frac{1}{2} \frac{f}{\partial \boldsymbol{X}} \widehat{\boldsymbol{X}} =f(X0)+21∂XfX
对于公式 所求得的偏移量如果大于 0.5 (只要 x 、 y \mathrm{x} 、 \mathrm{y} x、y 和 σ \sigma σ 任意一个量大于 0.5 ),则表明插值点已偏移到了它的临近的插值中心,所以必须改变当前的位置,使其为它所偏移到的插值中心处, 然后在新的位置上重新进行泰勒级数插值拟合, 直到偏移量小于 0.5 为止( x 、 y \mathrm{x} 、 \mathrm{y} x、y 和 σ \sigma σ 都小于 0.5 ),为避免无限次的迭代,需要设置一个最大迭代次数,在达到了迭代次数但仍然没有满足偏移量小于 0.5 的情况下,该极值点就要被剔除掉。另外,如果由上式得到的极值 f ( X ^ ) f(\widehat{\mathbf{X}}) f(X ) 过小,即 ∣ f ( X ^ ) ∣ < 0.03 |f(\widehat{\mathbf{X}})|<0.03 ∣f(X )∣<0.03 时 (假设图像的灰度值在 0 ∼ 1.0 0 \sim 1.0 0∼1.0 之间),则这样的点易受到噪声的干扰而变得不稳定,所以这些点也应该剔除。而在 opencv 中, 使用的是下列公式来判断其是否为不稳定的极值:
∣ f ( X ^ ) ∣ < T s |f(\widehat{\boldsymbol{X}})|<\frac{T}{s} ∣f(X )∣<sT
其中 T T T 为经验阈值,系统默认初始化为 0.04 。
极值点的求取是在 DoG 尺度图像内进行的,DoG 图像的一个特点就是对图像边缘有很强的响应。一旦特征点落在图像的边缘上, 这些点就是不稳定的点。这是因为一方面图像边缘上的点是很难定位的, 具有定位的歧义性; 另一方面这样的点很容易受到噪声的干扰而变得不稳定。因此需要把这些点找到并剔除掉。它的方法与 Harris 角点检测算法相似, 即一个平坦的 DoG 响应峰值往往在横跨边缘的地方有较大的主曲率, 而在垂直边缘的方向上有较小的主曲率, 主曲率可以通过 2 × 2 2 \times 2 2×2 的 Hessian 矩阵 H \boldsymbol{H} H 求出:
H ( x , y ) = [ D x x ( x , y ) D x y ( x , y ) D x y ( x , y ) D y y ( x , y ) ] \boldsymbol{H}(x, y)=\left[\begin{array}{ll} D_{x x}(x, y) & D_{x y}(x, y) \\ D_{x y}(x, y) & D_{y y}(x, y) \end{array}\right] H(x,y)=[Dxx(x,y)Dxy(x,y)Dxy(x,y)Dyy(x,y)]
其中 D x x ( x , y ) 、 D y y ( x , y ) D_{x x}(x, y) 、 D_{y y}(x, y) Dxx(x,y)、Dyy(x,y) 和 D x y ( x , y ) D_{x y}(x, y) Dxy(x,y) 分别表示对 DoG 图像中的像素在 x x x 轴方向和 y y y 轴方向上求二阶偏导和二阶混合偏导。在这里, 不需要求具体的矩阵 H \boldsymbol{H} H 的两个特征值—— α \alpha α 和 β \beta β, 而只要知道两个特征值的比例就可以知道该像素点的主曲率。
矩阵 H \boldsymbol{H} H 的直迹和行列式分别为:
Tr ( H ) = D x x + D y y = α + β Det ( H ) = D x x D y y − ( D x y ) 2 = α β \begin{aligned} & \operatorname{Tr}(\boldsymbol{H})=D_{x x}+D_{y y}=\alpha+\beta \\ & \operatorname{Det}(\boldsymbol{H})=D_{x x} D_{y y}-\left(D_{x y}\right)^2=\alpha \beta \end{aligned} Tr(H)=Dxx+Dyy=α+βDet(H)=DxxDyy−(Dxy)2=αβ
首先剔除掉那些行列式为负数的点, 即 Det ( H ) < 0 \operatorname{Det}(\boldsymbol{H})<0 Det(H)<0, 因为如果像素的曲率有不同的符号, 则该点肯定不是特征点。设 α > β \alpha>\beta α>β, 并且 α = γ β \alpha=\gamma \beta α=γβ, 其中 γ > 1 \gamma>1 γ>1, 则
Tr ( H ) 2 Det ( H ) = ( α + β ) 2 α β = ( γ β + β ) 2 γ β 2 = ( γ + 1 ) 2 γ \frac{\operatorname{Tr}(\boldsymbol{H})^2}{\operatorname{Det}(\boldsymbol{H})}=\frac{(\alpha+\beta)^2}{\alpha \beta}=\frac{(\gamma \beta+\beta)^2}{\gamma \beta^2}=\frac{(\gamma+1)^2}{\gamma} Det(H)Tr(H)2=αβ(α+β)2=γβ2(γβ+β)2=γ(γ+1)2
上式的结果只与两个特征值的比例有关, 而与具体的特征值无关。 知道, 当某个像素的 H \boldsymbol{H} H 矩阵的两个特征值相差越大, 即 γ \gamma γ 很大, 则该像素越有可能是边缘。当两个特征值相等时, 等式的值最小, 随着 γ \gamma γ 的增加, 等式的值也增加。所以, 要想检查主曲率的比值是否小于某一阈值 γ \gamma γ, 只要检查下式是否成立即可:
Tr
(
H
)
Det
(
H
)
<
(
γ
+
1
)
2
γ
\frac{\operatorname{Tr}(\boldsymbol{H})}{\operatorname{Det}(\boldsymbol{H})}<\frac{(\gamma+1)^2}{\gamma}
Det(H)Tr(H)<γ(γ+1)2
对于不满足上式的极值点就不是特征点, 因此应该把它们剔除掉。Lowe 给出
γ
\gamma
γ 为 10 。在上面的运算中, 需要用到有限差分法求偏导, 在这里 给出具体的公式。为方便起见, 以图像为例只给出二元函数的实例。与二元函数类似, 三元函数的偏导可以很容易的得到。
设 f ( i , j ) f(i, j) f(i,j) 是 y y y 轴为 i 、 x i 、 x i、x 轴为 j j j 的图像像素值, 则在 ( i , j ) (i, j) (i,j) 点处的一阶、二阶及二阶混合偏导为:
∂ f ∂ x = f ( i , j + 1 ) − f ( i , j − 1 ) 2 h , ∂ f ∂ y = f ( i + 1 , j ) − f ( i − 1 , j ) 2 h ∂ 2 f ∂ x 2 = f ( i , j + 1 ) + f ( i , j − 1 ) − 2 f ( i , j ) h 2 , ∂ 2 f ∂ y 2 = f ( i + 1 , j ) + f ( i − 1 , j ) − 2 f ( i , j ) h 2 ∂ 2 f ∂ x ∂ y = f ( i − 1 , j − 1 ) + f ( i + 1 , j + 1 ) − f ( i − 1 , j + 1 ) − f ( i + 1 , j − 1 ) 4 h 2 \begin{gathered} \frac{\partial f}{\partial x}=\frac{f(i, j+1)-f(i, j-1)}{2 h}, \quad \frac{\partial f}{\partial y}=\frac{f(i+1, j)-f(i-1, j)}{2 h} \\ \frac{\partial^2 f}{\partial x^2}=\frac{f(i, j+1)+f(i, j-1)-2 f(i, j)}{h^2}, \quad \frac{\partial^2 f}{\partial y^2}=\frac{f(i+1, j)+f(i-1, j)-2 f(i, j)}{h^2} \\ \frac{\partial^2 f}{\partial x \partial y}=\frac{f(i-1, j-1)+f(i+1, j+1)-f(i-1, j+1)-f(i+1, j-1)}{4 h^2} \end{gathered} ∂x∂f=2hf(i,j+1)−f(i,j−1),∂y∂f=2hf(i+1,j)−f(i−1,j)∂x2∂2f=h2f(i,j+1)+f(i,j−1)−2f(i,j),∂y2∂2f=h2f(i+1,j)+f(i−1,j)−2f(i,j)∂x∂y∂2f=4h2f(i−1,j−1)+f(i+1,j+1)−f(i−1,j+1)−f(i+1,j−1)
由于在图像中, 相邻像素之间的间隔都是 1 , 所以这里的 h = 1 h=1 h=1 。
2.3. 方向分配确定
- 计算主方向:根据特征点周围的梯度方向直方图,为每个特征点分配一个或多个主方向,以确保特征描述符的旋转不变性。
2.4. 特征描述
- 构建特征描述符:在特征点的邻域内计算梯度幅度和方向,生成特征描述符。通常使用 4 × 4 4 \times 4 4×4 的网格,将每个网格的梯度方向直方图进行归一化,形成一个 128 128 128 维的特征向量。
3.6.3 SIFT 算法的推导
SIFT 算法的推导主要集中在以下几个方面:
- 尺度空间理论:通过高斯模糊和 DoG 计算,构建尺度空间以检测特征点。
- 特征点的稳定性:通过精确定位和去除低对比度特征点,确保特征点的稳定性。
- 旋转不变性:通过计算主方向,使得特征描述符在旋转时保持不变。
- 特征描述符的构建:通过计算局部区域的梯度信息,生成具有较强可区分性的特征描述符。
3.6.4. SIFT 算法的优缺点
1. 优点
- 尺度不变性:SIFT 特征能够在不同尺度下保持稳定,适用于图像的缩放。
- 旋转不变性:通过主方向的分配,SIFT 特征对图像的旋转具有不变性。
- 鲁棒性:对光照变化、噪声和视角变化具有较强的鲁棒性,能够有效地提取特征。
- 可区分性:SIFT 特征具有较强的可区分性,即使在低概率的不匹配情况下也能正确识别目标。
2. 缺点
- 计算复杂度:SIFT 算法的计算复杂度较高,尤其是在特征点检测和描述过程中,可能导致处理速度较慢。
- 专利问题:SIFT 算法曾申请专利,限制了其在某些商业应用中的使用。
- 对平坦区域敏感:在平坦区域,特征点的检测可能不明显,导致特征提取效果降低。