图像特征提取之DoG算子

 

DoGDifference of Gaussian)算法主要用于角点的检测,在SIFT算法中,也要用到DoG算法。所以,DoG可以是一个基本的算法。受限于专业特点,知识结构,以及实际应用场合,本文并不会去详细的推导DoG算法的合理性,更多的偏重于算法的实现过程。本文也不会贴代码,因为算法的过程说明白了,按照算法的过程逻辑一步一步的编写代码是很容易的事情(并不要求去优化等等)。

 

关注公众号,获取更多信息

 

1、合理性

 

高斯滤波的作用就是把一些细节给过滤掉(低通),而角点又是一些比较显而易见的点,一般角点处的对比度都跟其周围的像素点有明显的区别。通过高斯滤波,使得图像变得平滑,但是角点处,由于其对比度明显,并不能很好的被平滑点,从而被保留下来。但是呢,数字图像在成像时,并能使得角点处只有一个像素,有可能是几个像素,而大多数的时候,我们只需要在这个很小的领域内的一个角点,那么找到领域的极值来代表角点,也就显得合理了。(既然在高斯平滑滤波时,这些点都保留了下来,那么说明都可以作为角点,但是,最具代表性的是谁呢?显然,极值点是可以的。)

 

 

 

2、实现过程

1)读取原始图像img

2)对原始图像img在相同核大小,不同标准差下做高斯滤波,例如分别为sigma1,sigma2,sigma3,sigma4做高斯滤波得到图像G1,G2,G3,G4;

3)对相邻的滤波后的图像做差值,得到差值图像D1=G2-G1,D2=G3-G2,D3=G4-G3

4)对于中间的一副差值图像D2,遍历图中所有的点,对于每一点D2(i,j)做如下的操作

4-1)在图D2中这个点D2ij一定的领域内,例如3*3的范围内,以及D1D3中这个点D2ij)对应的相同位置处的点D1ij)和 D3ij)的相同领域内,求点D2ij)是否为极值点(极大值或极小值),如果为极值点,则标记为角点。如下图所示。

4-2)至于高斯核的选择,优点麻烦,选不好就把很多不是角点的点也搞成角点了。一般都是经验值。

 

 

 

 

 

SIFT算法是基于尺度空间的特征提取方法,可以检测并描述图像中的局部特征。以下是使用C语言编写SIFT算子图像进行特征提取的一般步骤: 1. 首先,需要对图像进行尺度空间的构建。可以通过使用高斯滤波器来实现。在C语言中,可以使用OpenCV函数库中的GaussianBlur函数来实现高斯滤波。 2. 接着,需要对每个像素点计算其在不同尺度下的高斯差分(Difference of Gaussian, DoG)。这个步骤可以通过在不同尺度下对图像进行高斯滤波,并计算滤波后的图像之间的差别来实现。 3. 然后,需要在DoG图像中检测关键点。可以通过使用极值检测方法来实现,即找到DoG图像中的局部最大值和最小值。在C语言中,可以使用OpenCV函数库中的minMaxLoc函数来实现这个步骤。 4. 接着,需要对检测到的关键点进行精确定位。可以通过使用拟合高斯函数的方法来实现。在C语言中,可以使用OpenCV函数库中的fitEllipse函数来实现这个步骤。 5. 接着,需要对每个关键点进行方向分配。可以通过计算关键点周围像素的梯度来实现。在C语言中,可以使用OpenCV函数库中的Sobel函数或Scharr函数来计算梯度。 6. 最后,需要对每个关键点进行描述符的生成。可以通过对关键点周围的像素进行采样,并计算采样点的梯度方向和大小来实现。在C语言中,可以使用OpenCV函数库中的calcHist函数来计算直方图,进而生成描述符。 以上是使用C语言编写SIFT算子图像进行特征提取的一般步骤。需要注意的是,SIFT算法中有很多细节需要处理,具体实现需要根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值