九之再续:教你一步一步用c语言实现sift算法、下

                      教你一步一步用c语言实现sift算法、下


作者:July、二零一一年三月十二日
出处:http://blog.csdn.net/v_JULY_v
参考:Rob Hess维护的sift 库
环境:windows xp+vc6.0
条件:c语言实现。
说明:本BLOG内会陆续一一实现所有经典算法。
------------------------


本文接上,教你一步一步用c语言实现sift算法、上,而来:
函数编写
    ok,接上文,咱们一个一个的来编写main函数中所涉及到所有函数,这也是本文的关键部分:

五个步骤

    ok,接下来,进入重点部分,咱们依据上文介绍的sift算法的几个步骤,来一一实现这些函数。
    为了版述清晰,再贴一下,主函数,顺便再加强下对sift 算法的五个步骤的认识:

1、SIFT算法第一步:图像预处理
CvMat *ScaleInitImage(CvMat * im) ;                  //金字塔初始化
2、SIFT算法第二步:建立高斯金字塔函数
ImageOctaves* BuildGaussianOctaves(CvMat * image) ;  //建立高斯金字塔
3、SIFT算法第三步:特征点位置检测,最后确定特征点的位置
int DetectKeypoint(int numoctaves, ImageOctaves *GaussianPyr);
4、SIFT算法第四步:计算高斯图像的梯度方向和幅值,计算各个特征点的主方向
void ComputeGrad_DirecandMag(int numoctaves, ImageOctaves *GaussianPyr);
5、SIFT算法第五步:抽取各个特征点处的特征描述字
void ExtractFeatureDescriptors(int numoctaves, ImageOctaves *GaussianPyr);

ok,接下来一一具体实现这几个函数:
SIFT算法第一步
    SIFT算法第一步:扩大图像,预滤波剔除噪声,得到金字塔的最底层-第一阶的第一层:
  

SIFT算法第二步
    SIFT第二步,建立Gaussian金字塔,给定金字塔第一阶第一层图像后,计算高斯金字塔其他尺度图像,
每一阶的数目由变量SCALESPEROCTAVE决定,给定一个基本图像,计算它的高斯金字塔图像,返回外部向量是阶梯指针,内部向量是每一个阶梯内部的不同尺度图像。
  

SIFT算法第三步
    SIFT算法第三步,特征点位置检测,最后确定特征点的位置检测DOG金字塔中的局部最大值,找到之后,还要经过两个检验才能确认为特征点:一是它必须有明显的差异,二是他不应该是边缘点,(也就是说,在极值点处的主曲率比应该小于某一个阈值)。

SIFT算法第四步

SIFT算法第五步
    SIFT算法第五步:抽取各个特征点处的特征描述字,确定特征点的描述字。描述字是Patch网格内梯度方向的描述,旋转网格到主方向,插值得到网格处梯度值。
一个特征点可以用2*2*8=32维的向量,也可以用4*4*8=128维的向量更精确的进行描述。

 

ok,为了版述清晰,再贴一下上文所述的主函数(注,上文已贴出,此是为了版述清晰,重复造轮):

 

最后,再看一下,运行效果(图中美女为老乡+朋友,何姐08年照):

完。 

updated

    有很多朋友都在本文评论下要求要本程序的完整源码包(注:本文代码未贴全,复制粘贴编译肯定诸多错误),但由于时隔太久,这份代码我自己也找不到了,不过,我可以提供一份sift + KD + BBF,且可以编译正确的代码供大家参考学习,有pudn帐号的朋友可以前去下载:http://www.pudn.com/downloads340/sourcecode/graph/texture_mapping/detail1486667.html没有pudn账号的同学请加群:169056165,验证信息:sift,至群共享下载,然后用两幅不同的图片做了下匹配(当然,运行结果显示是不匹配的),效果还不错:http://weibo.com/1580904460/yDmzAEwcV#1348475194313! July、二零一二年十月十一日。

  • 7
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 142
    评论
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算法中有很多细节需要处理,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 142
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v_JULY_v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值