sift与全景拼接.
Project2: 360度全景图像的拼接
一、实验介绍:
全景图像拼接技术让我们能有效地把局部图片整理起来,获取完善的整体信息。全景图像的拼接
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
为:
1. 拍取一些列互有重叠的部分景图片。
2. 把单个图片变换到柱面坐标下。
3. 从变换后的图片中提取特征
4. 使用RANSAC算法对齐相邻图片
5. 写下相邻图片的平移转换关系
6. 求出平移变换量
7. 读取变换后的图片并进行图像融合
8. 得到融合后的结果及最后的全景图。
二、 柱面映射
由于相机得到的是平面图像,在空间上不存在深度感,并且对于同一景物在相机底片上在尺度和形变上有一定的差异。所以我们一般把它统一映射到一个柱面上。
Fig1. 坐标映射情况
变换
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
:
Wx/2,,,,10,xR,,(tan()),,R2 ,HHW,x/2,1,,y,,(y,)cos(tan()),R22,
,0W其中为平面图像的宽度,R为相机焦距,图像张角满足 2
W/2W,0tan(),, 2R2R
柱面映射的结果:
Fig 2.3 原图与经过柱面坐标变换后的图像
三、特征提取与图像匹配
特征提取基本上采取SIFT算法的思想。但对于准备拼接成全景的部分图片,一般没有特征尺度上的差异。所以在本次实验中,我们不考虑图片的尺度变换,所使用的SIFT算子也比较简单。
特征检测:采用DOG算子。选择一些处理后的局部极值点作为特征点,为防止特征点相隔太近,可以进一步仍掉一些临近的特征点。本次实验中,我们还利用Hessian矩阵的特征值,去掉一些可能不是角点的特征点。最后按数值的大小从特征点中刷选出指定数目的点数。
Fig 4.5 原图与DOG特征点检测后的结果
特征点的描述:
在得到特征点的坐标和尺度的时候,我们还需要对其进行描述,描述后的特征点才能用来做匹配,对于每个特征点的描述子我们采用了4*4*8=128维的向量来表示,即把特征点的周围分成按距离4*4共16个区,每一个区又用到类似于求主方向的方向求出对应的方向直
方图。在特征显示的图中,我们画出了该特征点区域内最大个数的主方向。
Fig 6:特征点描述子结构
图像的匹配:
我们利用特征点的平方归一化128维描述向量。对两幅图片的特征点逐个进行匹配比较,选择出最匹配的一对特征点。最匹配的特征点与次匹配的特征点在满足一定关系的情况下才可以认为两点匹配成功。
Fig 7.8 两幅图像的特征点描述子示意图
Fig 9.两幅图像的匹配连线图
四、 图像排序
找到某图像两组匹配图像之后,我们就要判断匹配图像与当前图像的相对位置,在柱面全景中,只存在两种情况,即左边或者右边。由于我们实验用到的图像有着很强的水平特征,因而这里我们只需要用到平移的变换公式,其变换矩阵和变换关系可以写成:
,10dxxx,,,,,,
,,,,,,,H,01dyy,Hy , ,,,,,,
,,,,,,00111,,,,,,
其中dx和dy就代表着图像的相对移动。这时我们只要知道一点匹配点就可以通过解线性方程组来得到变换矩阵H。此时如果dx小于0则代表图像需要左移,即匹配图像在源图像的右边,反之亦然。
在求解H的过程中我们通常采用的是RANSAC算法。首先在前面得到的两幅图像的所有的匹配点中随机的找到一点。根据这个匹配点的关系,通过解线性方程组,便可以得到dx和dy的值,然后把这时的解当成已知量来遍历所有的匹配点,判断这个变换关系是否对于其它的点也同样满足,记这些满足的点为内点,我们设定一个终止条件,让其通过多次遍历可以得到多组数据,记下所有情况下内点数最多时的变换矩阵,把这时的变换矩阵作为两幅图像间的最终变换关系。
但在本次实验中,我们采取另外一种更加简便的偏移求解算法。我们求到了所有x方向上的偏移量dx(i),y方向上的偏移量dy(i),最后的偏移量(mdx,mdy)可以取它们的平均值,即mdx=average(dx(i)),mdy=average(dy(i)),这种方法显然很容易受到错误匹配的影响。所以最关键的就是要去掉错误的偏移量。一般情况下我们总认为正确的匹配是占绝大多数的,所以我们可以分别把x、y方向上的偏移量做一个统计,在此我们进行三段的统计,保留个数最多的一段并把它们的均值偏移量作为整体最后的偏移量。以下是我们获得的偏移量的结果:
每行四个数据,前两个是两幅图像的编号,第三个是x方向上的偏移量mdx,第四个是y方向上的偏移量mdy。
图1 图2 mdx mdy
得到上述结果之后,我们首先进行图像的排序。显然,x方向的偏移量为正时,第二幅
图像要排在第一幅图片的右端。我们只要把x偏移量为正偏移找出来:
并任意选择一对图片开始从左到右排序,得到最后的排序结果为:
8 25 24 23 22 21 20 19 18 11 16 15 14
13 12 17 10 9 8
最后我们按这个顺序把图像连接起来。
五、图像融合与全景图像的生成
在得到图像间的排列关系以及它们的变换矩阵之后,我们需要把两幅图像进行无缝的拼接,使我们在视觉上能尽可能将其认为是一幅图像。这时我们通常使用的方法有基于最佳缝合线的融合,以及渐进融合技术。本实验中我使用的是渐进融合的方法来实现图像拼接的,渐进融合的基本思想是在两幅图像的重叠部分进行加权叠加,这里我使用的是渐进叠加的方法。在前面我们已经得到了图像的排序和图像之间的x、y方向偏移,根据偏移我们可以计算两幅图片的重叠部分,重叠的部分宽度等于前一副图片的宽度减去x方向上的偏移量。在重叠部分我们使用该渐进融合方法。根据y方向上的偏移量再调整两幅图片的上下位置。最后我们根据图片的先后顺序得到最后的全景拼接图。
Fig 10. 渐进加权图
Fig 11. 两幅图像的融合
Fig 12. 全景拼接图
六、总结
本实验是在实验一的基础上,通过特征点的匹配来进行图像拼接的。考虑到matlab代
码的效率,我们只编写一个没有尺度变换的SIFT。其次,我们先计算特征点的描述子,并保存到文件中。再从文件中读取描述子,进行下一步的图像拼接工作,显然大大提高了执行效率。
七、代码:
本次实验的代码文件分为:simSift.m, match.m , panorama.m, test_sift.m
simSift.m用于获取sift描述子。函数调用为
[locs,descriptors]=simSift(img,draw) ,若draw为1,表示提取描述子后画图。默认为零。
match.m 用于两幅图像之间的匹配。函数调用为
[num,matched]= match(image1,image2,loc1,des1,loc2,des2)
如果我们有两幅图像的描述子,则代入到参数loc1,des1,loc2,des2中,这样match可以不用再调用simSift函数,节省运行时间,否则只代入两幅图像image1,image2。返回参数num为匹配的点数,matched为匹配后的映射向量,包含各点匹配的具体情况。match里面有一个参数draw,改为1可以画匹配后的连线图。
panorama.m用于全景图像的拼接。函数function panorama(save_feature)可以代入一个参数,若save_feature为1,则重新计算众多待拼接图像的描述子,这需要很长的一段时间。如果描述子已保存到文件中,则使用默认的save_feature为0。将从文件中读取描述子,最后得到并显示最终的全景拼接图像。
test_sifmatch.m 。t.m可以不用。在此主要是来测试simSift.m, 和
书中横卧着整个过去的灵魂——卡莱尔
人的影响短暂而微弱,书的影响则广泛而深远——普希金
人离开了书,如同离开空气一样不能生活——科洛廖夫
书不仅是生活,而且是现在、过去和未来文化生活的源泉 ——库法耶夫
书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者———史美尔斯
书籍便是这种改造灵魂的工具。人类所需要的,是富有启发性的养
料。而阅读,则正是这种养料———雨果