首页 > 代码库 > 斑点检测(LoG,DoG)(下)

斑点检测(LoG,DoG)(下)

斑点检测(LoG,DoG)(下)

LoG, DoG, 尺度归一化

上篇文章斑点检测(LoG,DoG)(上)介绍了基于二阶导数过零点的边缘检测方法,现在我们要探讨的是斑点检测。在边缘检测中,寻找的是二阶导数的零点,可是在斑点检测中寻找的是极值点,这是为什么呢?而且在使用二阶导数寻找斑点时不仅在图像上寻找极值点,还要求在尺度空间上也是极值点,又是为什么呢?还有为什么DoG是LoG的简化版本呢??

这篇文章主要内容就是回答这三个问题。

From edges to blobs

对于阶跃信号,其二阶导数在对应跃变得位置会产生一个波,该波的过零点正对应着待检测的边缘位置。

技术分享

1474424864226.jpg

而所谓的斑点区域就是两条边形成的中间区域,如下图中,对于蓝色的目标区域,红色的椭圆就是在检测边缘,黑色的椭圆就是在检测斑点区域。

技术分享

1474425468660.jpg

那么边缘检测到斑点检测的过程对二阶导数有什么影响呢?

技术分享

1474425595728.jpg

这个示意图中上一行从左到右表示的是原始矩形脉冲信号,脉冲信号的周期越来越短,而下一行则表示对应周期在相同尺度下的LoG结果。可以发现总的LoG曲线其实是两条边界上产生的LoG函数的叠加,当两条边界足够小时,在该尺度脉冲下就被作为了blob,这时候LoG曲线的极值就对应着blob的中心。

所以边缘检测对应的是LoG的过零点,而斑点检测对应的是LoG的极值点。

这里我们可以发现判断是不是blob时,尺度非常重要,只有尺度大于一定值得时候blob才可以通过LoG的极值判定。

那么尺度该如何选择呢?

尺度的选择

先来看看同一个阶跃信号在不同尺度下的响应

技术分享

1474426170925.jpg

可以发现随着尺度的不断增大,LoG曲线由双波谷逐渐融合成单波谷,但是响应的幅值越来越弱。这是因为,随着尺度的增大,LoG算子的最大幅度逐渐减小,导致响应也随着尺度的增大而减小。

这种情况我们没法知道选定的尺度是否合适,进而不知道这个尺度下找到的极值点是不是对应着blob的中心点,万一是边缘产生波的极值点怎么办!所以我们这时候应该对进行LoG算在进行尺度的归一化。

下图给出了阶跃信号的一阶Gaussian滤波曲线

技术分享

1474426585595.jpg

可以发现对于稳定信号,响应的最大幅值是和技术分享成正比的,那么为了消除尺度的影响,可以对一阶高斯滤波算子乘上个技术分享,那么对于不同的尺度,其响应的强度就是相同的了。这里可以这么理解,在0点处积分结果为

技术分享

技术分享的函数表示与尺度有关,乘上一个技术分享之后就与尺度无关了,称为尺度的归一化

而LoG算子是Gaussian 滤波的二阶导数,所以应该乘上个技术分享做尺度归一化。

再来看看矩形脉冲在不同尺度经过尺度归一化后的响应

技术分享

1474427171097.jpg

可以发现当尺度等于脉冲宽度的一半的时候,不仅极值对应着blob的中心位置,而且这时候的响应强度比其他尺度响应强度都强。

那么我们在检测blob时就可以使用不同的尺度计算HoG响应,选择产生最强响应的尺度,在该尺度上对应的极值就是blob的中心位置了。

对于不同尺寸的blob,理想的尺度应该是多少呢?
理论表明,对于一个圆形blob,当二维LoG算子的零点值曲线和目标圆形边缘重合时取得最强响应。

下图是LoG剖面示意

技术分享

1474428032289.jpg

所以由LoG算子的目标式技术分享可得最优尺寸为技术分享.

在使用LoG算子进行Blob检测时,首先在不同尺寸上对图像进行LoG,然后检测在尺度空间和图像空间都是极值的点,就是blob区域的中心点。

技术分享

1474428242180.jpg

LoG to DoG

为什么DoG可以近似LoG使用呢?
先来看看归一化之后的LoG算子(该过程将高斯函数带入化简可得)

技术分享

而高斯差分算子

技术分享

所以

技术分享

因为k-1是常量不影响函数极值点,所以检测归一化的LoG在尺度空间的极值,即近似于检测DoG空间的极值。

DoG进行Blob检测流程
首先使用不同尺度的高斯算子对图像进行平滑
其次计算相邻尺度下平滑图像的差分图像(DoG空间)
最后在DoG空间寻找极值点


斑点检测(LoG,DoG)(下)