动机
在计算机视觉领域,经常需要检测极值位置,比如SIFT关键点检测、模板匹配获得最大响应位置、统计直方图峰值位置、边缘检测等等,有时只需要像素精度就可以,有时则需要亚像素精度。本文尝试总结几种常用的一维离散数据极值检测方法,几个算法主要来自论文《A Comparison of Algorithms for Subpixel Peak Detection》,加上自己的理解和推导。
问题定义
给定如下离散值,求其极值位置。可知125为观察极值。
[ 60 , 80 , 100 , 120 , 125 , 105 , 70 , 55 ] [60, 80, 100, 120, 125, 105, 70, 55] [60,80,100,120,125,105,70,55]
如果这些离散值是从某个分布 f f f中等间距采样获得,其真正的极值位置应位于120和125之间。
下面给出形式化的定义:给定一组离散值,令 x x x为观测到的极值点位置,其值为 f ( x ) f(x) f(x),其左右相邻位置的值为 f ( x − 1 ) f(x-1) f(x−1)和 f ( x + 1 ) f(x+1) f(x+1),真正的极值点位置为 x + δ x+\delta x+δ,令 δ ^ \hat{\delta} δ^为 δ \delta δ的估计值。
算法
假设** x x x的邻域**可通过某个模型进行近似,如高斯近似、抛物线近似,则可以利用 x x x的邻域信息根据模型估计出极值。使用的模型不同就有不同的算法,具体如下。
高斯近似
一维高斯函数如下:
y = y m a x ⋅ e x p ( − ( x − μ ) 2 2 σ 2 ) y = y_{max} \cdot exp(-\frac{(x-\mu)^2}{2\sigma^2}) y=ymax⋅exp(−2σ2(x−μ)2)
当 y m a x = 1 2 σ π y_{max}=\frac{1}{\sqrt{2\sigma}\pi} ymax=2σπ1时为标准高斯函数,形如
假设 x x x的邻域可用高斯近似,用 ( x , f ( x ) ) (x, f(x)) (x,f(x))、 ( x − 1 , f ( x − 1 ) ) (x-1, f(x-1)) (x−1,f(x−1))、 ( x + 1 , f ( x + 1 ) ) (x+1, f(x+1)) (x+1,f(x+1))三点对高斯函数进行拟合,获得模型参数 μ \mu μ即为峰值位置, δ ^ = μ − x \hat{\delta}=\mu - x δ^=μ−x。将三点带入上面的高斯函数两边同时取对数求得:
δ ^ = 1 2 ln ( f ( x − 1 ) ) − ln ( f ( x + 1 ) ) ln ( f ( x − 1 ) ) − 2 ln ( f ( x ) ) + ln ( f ( x + 1 ) ) \hat{\delta} = \frac{1}{2} \frac{\ln(f(x-1)) - \ln(f(x+1))}{\ln(f(x-1)) - 2\ln(f(x)) + \ln(f(x+1))} δ^=21ln(f(x−1))−2ln(f(x))+ln(f(x+1))ln(f(x−1))−ln(f(x+1))
下面可以看到,高斯近似相当于取对数后的抛物线近似。
抛物线近似
使用抛物线近似 x x x的局部,可以将 ( x , f ( x ) ) (x, f(x)) (x,f(x))、 ( x −