3 image-processing computer-vision surf
假设我有一个灰度(8 位)图像并假设我有一个从同一图像创建的完整图像。图像分辨率为720x576. 根据 SURF 算法,每个八度音阶由 4 个盒式滤波器组成,它们由它们一侧的像素数定义。
第一个八度使用带有9x9, 15x15, 21x21 and 27x27像素的过滤器。
第二个八度使用带15x15, 27x27, 39x39 and 51x51像素的过滤器。
第三个八度使用带27x27, 51x51, 75x75 and 99x99像素的过滤器。如果图像足够大并且我猜720x576 足够大(对吗??!!),则添加第四个八度音程,51x51, 99x99, 147x147 and 195x195. 这些八度音程彼此部分重叠以提高插值结果的质量。
// so, we have:
//
// 9x9 15x15 21x21 27x27
// 15x15 27x27 39x39 51x51
// 27x27 51x51 75x75 99x99
// 51x51 99x99 147x147 195x195
Run Code Online (Sandbox Code Playgroud)
问题是:每个过滤器中的值是
什么?我应该对这些值进行硬编码,还是应该计算它们?
如何准确地(在数字上)将过滤器应用于积分图像?
此外,计算黑森州行列式我发现了两个近似:
det(HessianApprox) = DxxDyy ? (0.9Dxy)^2和det(HessianApprox) = DxxDyy ? (0.81Dxy)^2
哪一个是正确的?
(Dxx、Dyy 和 Dxy 是高斯二阶导数)。
我不得不返回原始论文以找到您问题的准确答案。
先来点背景
SURF 利用常见的图像分析方法进行感兴趣区域检测,称为斑点检测。斑点检测的典型方法是高斯差分。这有几个原因,第一个是模仿人类大脑视觉皮层中发生的事情。
高斯差分 (DoG) 的缺点是计算时间太昂贵而无法应用于大图像区域。
为了绕过这个问题,SURF 采用了一种简单的方法。DoG 只是计算两个高斯平均值(或等效地,应用高斯模糊)然后取它们的差。一个快速而肮脏的近似(对于小区域不是那么脏)是通过框模糊来近似高斯模糊。
框模糊是给定矩形中所有图像值的平均值。它可以通过积分图像有效地计算。
使用积分图像
内的积分图像,每个像素值是所有像素的总和那名以上,并在其左侧的原始图像上。因此,积分图像中左上角的像素值为 0,积分图像最右下角的像素因此具有所有原始像素值的总和。
然后,您只需要注意框模糊等于给定矩形内所有像素的总和(不是源自图像最左上角的像素)并应用以下简单的几何推理。
如果您有一个角为 ABCD(左上角、右上角、左下角、右下角)的矩形,则框式过滤器的值由下式给出:
boxFilter(ABCD) = A + D - B - C,
Run Code Online (Sandbox Code Playgroud)
其中 A、B、C、D 是 IntegralImagePixelAt(A)(分别为 B、C、D)的快捷方式。
SURF 中的积分图像
SURF 不直接使用大小为 9x9 等的框模糊。它使用的是几个阶的高斯导数,或类似 Haar 的特征。
让我们举个例子。假设您要计算 9x9 过滤器输出。这对应于给定的 sigma,因此是固定的音阶/八度音程。
西格玛是固定的,你把你的 9x9 窗口放在感兴趣的像素上。然后,计算每个方向(水平、垂直、对角线)的二阶高斯导数的输出。论文中的图 1 为您展示了垂直和对角线滤波器。
Hessian 行列式
有一个因素需要考虑规模差异。让我们相信行列式等于的论文:
Det = DxxDyy - (0.9 * Dxy)^2.
Run Code Online (Sandbox Code Playgroud)
最后,行列式由下式给出:Det = DxxDyy - 0.81*Dxy^2。