试试通俗的解释一下SIFT算法

一、SIFT是什么?

SIFT中文名为尺度不变特征变换,我不知道为什么叫这个名字,我觉得叫尺度变换特征不变更合理。即SIFT特征提取出来的图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。大白话就是无论图片怎么剪裁,旋转,提取到的特征点还是那些。

二、SIFT算法步骤

1.尺度空间极值检测

尺度就是图片的大小,即在不同尺寸上对图片提取极值点,这个极值点就是特征点。
试试通俗的解释一下SIFT算法_第1张图片
上图左边很明显的分为较大和较小的两部分,代表着同一个图片的不同尺寸,这个尺寸变化是通过降采样实现的,简单来说就是对一定区域内的像素点取平均值,用这个平均值代替这个区域内的像素,以此实现缩小图片的目的。两部分中又包含5个尺寸相同的图片,这五个图片虽然尺寸相同,但是模糊程度不同,那么怎么让图片变模糊呢?通过高斯函数。通过设置不同的尺度空间坐标σ,来让图片的模糊程度不同。上图左边只有两组,实际上组数可能更多,很想金字塔,因此称为高斯模糊金字塔。

上图左边两组内图片两两“相减”,得到右边的蓝色部分,这个“相减”称为高斯差分,看名字就像个包含数学的复杂的过程,博主最头痛数学了。
右边的到的金字塔称为高斯差分金字塔。

得到高斯差分金字塔后,开始最重要的步骤:检测极值点。
试试通俗的解释一下SIFT算法_第2张图片
如图,叉点是我们待检测的点,将叉点与其周边、上下层一共26个点进行比较,这里又是一番数学的东西,令人头疼。反正一通操作猛如虎,极值点就算出来了。

下图是以上全过程的实例。感受一下高斯模糊和高斯差分的结果。
试试通俗的解释一下SIFT算法_第3张图片

2.关键点定位

通过第1步算出了极值点,然而图像的像素点是一个一个的,学名叫“离散”。而真正的极值点是在连续的“线”上找到的,比如在sinx函数上找极值点,假如你只有sinx图像上0、π/3,、π这三个点,那我们找到的极值点是π/3,而实际的极值点应该是π/2上。图像找到的极值点也类似,我们需要对图像上的点拟合一个连续的函数,找到真正的极值点。
试试通俗的解释一下SIFT算法_第4张图片

3.方向赋值

经过上一步,我们找到了很多极值点,这个极值点反应在图像上一般是物体的边缘、明暗对比比较强烈的地方。接下来确定极值点的方向。

首先在找到的极值点周围画个圈,类似这样。箭头暂时先不用管。
试试通俗的解释一下SIFT算法_第5张图片
然后我们对圆圈内所有的点求方向,那么什么叫点的方向呢?请看下图。
试试通俗的解释一下SIFT算法_第6张图片
图中Target Pixel就是我们要求方向的点了,图中点的像素值和坐标已经标出。接下来又是数学问题,这次的数学问题比较简单,我们只要相减就够了。就像这样。
在这里插入图片描述
得到了差值之后,再计算arctan值,得到的角度就是方向了。
在这里插入图片描述
还可以求图像梯度。
在这里插入图片描述
刚才上图圆圈中的箭头就是这么来的了,箭头的长度根据的是图像梯度。

将箭头不同方向的数量统计一下,箭头数量最多的就是主方向了。有时候会把数量第二多的方向作为辅方向。

试试通俗的解释一下SIFT算法_第7张图片

4.关键点描述

最后一步就是描述得到的关键点信息。上图是取得是88的范围,实际上SIFT取得是1616的范围。试试通俗的解释一下SIFT算法_第8张图片
其中划分为44的大方格,统计每个大方格中各个方向的数量。试试通俗的解释一下SIFT算法_第9张图片
近似取8个方向,方向的数量以箭头长短表示。那么16个格子,每个格子8个方向,一共需要16
8=128个描述。因此,每个SIFT特征点是用128维的向量表示的,一个图片有n个特征点,那么描述这个图片的矩阵就是n*128维。

总结

由于SIFT算法的关键点选区,经过了图片的尺寸放缩、模糊,特征描述向量里也包含了方向,因此它对一些常见的图像攻击具有鲁棒性。

实验结果

同一图片截图比对
试试通俗的解释一下SIFT算法_第10张图片
同一图片的旋转比对,有点乱但感觉好像还行哈哈哈哈。
试试通俗的解释一下SIFT算法_第11张图片
想跑一下代码试试的朋友们可以去github上搜sift,代码有很多,我也是github上找的。

你可能感兴趣的:(学习笔记,算法,python,计算机视觉,sift算法)