大家好,又见面了,我是你们的朋友全栈君。
毕设要做图像配准,计划使用KAZE特征进行特征点的检测,以下是我对KAZE算法原理的理解,有什么不对的地方,希望提出来大家相互讨论学习。
一、KAZE算法的由来
KAZE算法是由法国学者在在2012年的ECCV会议中提出的,是一种比SIFT更稳定的特征检测算法。KAZE的取名是为了纪念尺度空间分析的开创者—日本学者Iijima。KAZE在日语中是‘风’的谐音,寓意是就像风的形成是空气在空间中非线性的流动过程一样,KAZE特征检测是在图像域中进行非线性扩散处理的过程。
KAZE算法的原英文文献《KAZE Features》的地址为:https://link.springer.com/chapter/10.1007/978-3-642-33783-3_16
二、KAZE算法的原理
SITF、SURF算法是通过线性尺度空间,在线性尺度空间来检测特征点的,容易造成边界模糊和细节丢失;而KAZE算法是通过构造非线性尺度空间,并在非线性尺度空间来检测特征点,保留了更多的图像细节。KAZE算法主要包括以下步骤:
(1)非线性尺度空间的构建;
(2)特征点的检测与精确定位;
(3)特征点主方向的确定;
(4)特征描述子的生成。
下面详细讲述每一步的具体过程。
1.非线性尺度空间的构建
KAZE算法作者通过非线性扩散滤波和加性算子分裂(AOS)算法来构造非线性尺度空间。在此有必要了解下非线性扩散滤波和AOS算法。
(1) 非线性扩散滤波
非线性扩散滤波方法是将图像亮度(L)在不同尺度上的变化视为某种形式的流动函数的散度,可以通过非线性偏微分方程来描述:
其中c(x,y,t)为传导函数,可由下式来构造:
其中的▽Lσ是高斯平滑后的图像Lσ的梯度,《KAZE Features》一文中给出了g()函数的几种表达形式:
其中g1能够保留高对比度的边缘,g2能够保留宽度较大的区域,g3能够有效平滑区域内部而保留边界信息,《KAZE Features》一文中选择g2。参数k是控制扩散级别的对比度因子,决定保留多少边缘信息,其值越大,保留的边缘信息越少。
(2)AOS算法
非线性扩散滤波中的偏微分方程没有解析解。因此,需要使用数值方法来逼近微分方程。将上述偏微分方程离散化:
其中Al是表示图像在各维度(l)上传导性的矩阵,τ为时间步长。该方程的解如下:
了解了非线性扩散滤波和AOS算法后,下面进入我们的正题——非线性尺度空间的构建。
KAZE特征的尺度空间构造与SIFT类似,尺度级别按对数递增,但KAZE的各个层级均采用与原始图像相同的分辨率。
SIFT算法中线性尺度空间的构建是由由高斯金字塔相邻两层相减得到DOG金字塔的。需对对原始图像进行下采样,每次下采样所得到的新图像为金字塔的一层,多次下采样操作便构成了图像金字塔。为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave)。由SIFT算法特征点的检测过程知道,要使每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,高斯金字塔每组需S+3层图像。
那么,构建尺度空间的参数:
如何确定呢?
以上三个参数具有关系:
其中是σ0基准层尺度,o为组octave的索引,s为组内层的索引。关键点的尺度参数就是按关键点所在的组和组内的层数,结合上式计算来的(所以在后面特征描述符的生成中,对于对于处在同一组的同一层中的特征点的描述符相同)。
在构建高斯金字塔时,组内每层的尺度参数按如下公式计算:
其中
其中σ0为初始尺度,lowe取1.6,s为组内的层索引,S=3。由上式可知,不同组相同层的组内尺度参数相同。
在计算组内某一层图像的尺度时,直接使用如下公式进行计算:
为了保证尺度空间的连续性,下一组的第1层图像是由上一组的倒数第三层下采样得到的。假设第一组的初始尺度为σ,则第一组中每层的尺度参数依次为:σ,kσ,kkσ,kkkσ,kkkkσ…倒数第三层的尺度为
而DoG金字塔中间的层数被选出来检测极值点,第一组是kσ,kkσ,kkkσ,第二组是2kσ,2kkσ,2kkkσ,而kkkσ=2σ,2kσ,2kkσ,2kkkσ=kkkkσ,kkkkkσ,kkkkkkσ,和第一组的连续起来了,保证了尺度空间的连续性。下图是SIFT算法构造尺度空间的过程。
而KAZE的不同之处是,无需对图像进行下采样,各个层级均采用与原始图像相同的分辨率。非线性扩散滤波模型是以时间为单位的,故需要将尺度参数转换为时间(此处称为进化时间)。在高斯尺度空间下,使用标准差为σ的高斯核对图像进行卷积,相当于对图像进行持续时间为t=σσ/2的滤波,故两者的转换公式为:t=σσ/2。根据一组进化时间,利用AOS算法即可得到非线性尺度空间的所有图像:
2.特征点的检测与精确定位
(1)特征点的检测
KAZE的特征点检测与SIFT类似。是通过寻找不同尺度归一化后的Hessian行列式的局部极大值(或者极小值)点来实现的。
如上图中画×的特征点,比较其与同一层中周围的8个像素点,再加上相邻层的9+9=18个像素点,即26个像素点,当其大于(或者小于)所有相邻点时,该点就是极值点。
(2).特征点的精确定位
这一过程和SIFT一样,通过泰勒表达式:
对其求导数,并令导数等于零,解得
将解带入泰勒表达式,得
时保留该特征点,否则剔除。
3.特征点主方向的确定
这一过程和SURF一样。若特征点的尺度参数为σi,则搜索半径设为6σi。在这个圆形领域内做一个60度的扇形区域,统计这个扇形区域内的haar小波特征总和,然后转动扇形区域,再统计小波特征总和。小波特征总和最大的方向为主方向。
4.特征描述子的生成
对于尺度参数为σi的特征点,在梯度图像上以特征点为中心取一个24σi×24σi的窗口,并将窗口划分为4×4个子区域,每个子区域大小为9σi×9σi,相邻的子区域有宽度为2σi的交叠带(此处我认为应该是相邻的子区域有宽度为4σi的交叠带,不然24σi不够划分为4×4个子区域)。每个子区域都用一个高斯核(σ1 =2.5σi)进行加权,然后计算出长度为4的子区域描述向量:
再通过另一个大小为4×4的高斯窗口(σ2 =1.5σi)对每个子区域的向量dv进行加权,最后进行归一化处理。这样就得到了4×4×4=64维的描述向量。
到此KAZE特征检测算法的原理算是讲完了,下面说一下KAZE特征的优缺点。
优点:
(1)在图像模糊、噪声干扰和压缩重构等造成的信息丢失的情况下,KAZE特征的鲁棒性明显优于其它特征。
(2)相比于线性尺度空间,非线性尺度空间不会造成边界模糊和细节丢失,而且更稳定。
缺点:
(1)KAZE算法在尺度不变性上是逊于SIFT的。
(2)KAZE特征的匹配对参数的设置比较敏感。
(3)KAZE特征的检测时间高于SURF,但与SIFT相近。
但KAZE特征是如何保证尺度不变性的?首先尺度不变性是指,不论原图怎么缩放,都能够找到相同的特征点。我个人看法是,在图像配准过程中,虽然浮动图像和参考图像可能在尺度上存在一定的缩放,但他们在非线性尺度空间中,肯定存在两幅图像在尺度上是相同的(由非线性尺度空间的构建可知),那么在这两幅相同尺度的图像中进行特征点的检测,生成的描述子应该是相同的,进而保证了尺度不变性。
但这只是我的个人见解,本人太菜,也不知道正确与否,哪里有不对的地方,欢迎留言讨论,相互学习!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148463.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...