全景图像拼接研究Word文档格式.docx
《全景图像拼接研究Word文档格式.docx》由会员分享,可在线阅读,更多相关《全景图像拼接研究Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
2.2匹配拼接基本原理1
3程序设计3
3.1程序流程图及说明3
3.2程序主要模块介绍4
3.3算法实现的关键问题及解决方法6
4实验结果与分析7
4.1实验结果7
4.2项目创新处10
4.3存在问题及改进设想10
5心得体会10
6参考文献11
1全景图像拼接背景及要求
1.1项目前景
给定某个场景的一组互相有重叠的局部图像,如何生成包含着这组局部图像的新的较大的视图,称为图像的拼接(stitch)问题,有时也称为图像镶嵌(mosaic)。
图像拼接技术的研究是在现实应用的需求下逐渐发展起来的,现已成为计算机视觉和计算机图形学的研究焦点。
图像拼接技术广泛应用于数字视频、MPEG-4编码、运动分析、虚拟现实技术、遥感图像处理、医学图像分析等领域。
1.2作业要求
1)自行搜集与阅读相关的图像全景拼接的资料;
2)尝试对全景图像拼接进行编程,可以考虑采用上述三种函数。
3)在校园采集图像,进行全景拼接实验,并改进程序,尽可能做到无缝拼接。
2全景图像拼接原理说明
2.1什么是全景图像拼接
全景图像拼接是利用照相机平移或旋转得到的部分重叠图像样本生成一个较大的甚至左右对接的全方位图像的场景绘制方法。
2.2基本原理(匹配拼接)
2.2.1图像获取
首先网上下载图片截取分块,也可实拍取景图像。
如果实景取材的话,因为360度全景图像的素材,是通过利用普通照相机采集的照片,经过数字化得到的边界部分重叠的图像。
因为全景图像表示的是人在某一视点观察空间,视点不动而观察方向改变。
所以在拍照时将照相机固定在支架上,尽量避免转动时镜头的偏斜和俯仰,并以镜头为轴转动一周连续拍照。
拍照时使相邻图像具有一定程度的内容重叠,以便于拼接而得到全景图像。
2.2.2图像重叠区域的确定
由于基于面积的方法计算量太大,只利用一列像素又经常造成误匹配,所以算法的思路是在图像二上一定模块上相隔一定距离提取像素点,得到一个比较样本模板,然后扫描第一幅图像。
首先为了减少运算量,设一个适当的遍历“buchang”,扫描找到一个最少差值的坐标之后就确定了样本模块在图像一中的大概位置,然后再在该坐标周围的一个网格的范围内进行扫描,最小差值的坐标即为最佳匹配。
匹配分为粗略匹配部分跟精确匹配部分。
粗略匹配:
把SourceImage1跟SourceImage2分别分离R、G、B之后从redImge2的一半高度处提取一个26*26大小的网格,每隔两个格提取一个像素点,得到一个样本模板。
由于图像的重叠部分只占图像的30%-50%,所以从redImage1的二分之一宽度初开始扫描,每隔“buchang”的距离提取一个跟样本模板一样大小的网格,用样本模板跟在redImage1提取的网格进行比较,扫描一遍后可以得到一个粗略的样本模板在SourceImage1中的重叠位置min_x,min_y,跟一个粗略的最小差值min_value。
精确匹配:
这次的扫描范围是(min_x-buchang/2,min_x+buchang/2)*(min_y-buchang/2,min_y+buchang/2).跟粗略匹配一样地提取网格,这次每次移动一个像素点,然后就得到一个最佳的匹配坐标min_x,min_y,跟一个经过精确匹配的最小差值min_value,(min_x,,min_y)就是redImage2二分之一高度处提取的模板在redImage1中对应的位置。
2.2.3图像连接
找到重叠范围,如果仅仅是简单的叠加,会造成图像明显的边界,而且会发生错位,所以我们采用多种情况讨论的方法,实现图像的精确定位,总体有4种情况,具体看程序中的解析。
我们没有采用图像融合是因为,我认为在理想的图片中没有必要采用图像融合,而在实拍图像中,越远离中心焦点的像素点畸变越严重,我认为叠加的效果会更加不好。
所以就没有融合而采用拼接。
由于拍摄的是平面图,拼接出来的图片有比较明显的菱形感,我设想可以运用参考文献[6]中的方法在图像的预处理中先将平面图投射到一个柱面上去,由于过于复杂,在本次作业中没有使用,在日后希望可以得到改进。
图1拼接处理示意图
3程序设计
3.1程序流程图及说明
图2程序流程图
3.2程序主要模块介绍
3.2.1界面设计
图3程序主界面
3.2.2部分程序
通过灰度值的处理,将图像进行粗略与精确匹配。
//以下部分为粗略匹配
for(x=(width1/2);
x<
(width1-20);
x=x+buchang)
{for(y=0;
y<
(height1-20);
y=y+buchang)
{m=0;
value=0;
for(i=0;
i<
20;
i=i+2)
{for(j=0;
j<
j=j+2)
{
IPI_GetPixelValue(redImage1,x+i,y+j,&
gray_value);
gird1[m]=gray_value;
m++;
}
}
for(m=0;
m<
100;
m++)
value+=fabs(gird1[m]-gird2[m]);
if(value<
min_value);
{
min_value=value;
min_x=x;
min_y=y;
SetCtrlVal(panel,PANEL_NUMERIC_2,min_x);
SetCtrlVal(panel,PANEL_NUMERIC_3,min_y);
SetCtrlVal(panel,PANEL_NUMERIC_4,value);
}
}
//以下为精确匹配
for(x=(min_x-3);
=(min_x+3);
x++)
{for(y=(min_y-3);
=(min_y+3);
y++)
{m=0;
for(i=0;
i=i+2)
{for(j=0;
{IPI_GetPixelValue(redImage1,x+i,y+j,&
gird1[m]=gray_value;
m++;
}
for(m=0;
value=value+fabs(gird1[m]-gird2[m]);
//求灰度值的差值
if(value<
min_value)
{min_value=value;
}
//以下两段是找到最优拼接点后两幅图像拼接,分两种情况
if(min_y>
(height2/2))
{for(i=0;
width1;
i++)
{for(j=0;
height1;
j++)
{IPI_GetPixelValue(redImage1,i,j,&
IPI_SetPixelValue(redImage,i,j,gray_value);
IPI_GetPixelValue(greenImage1,i,j,&
IPI_SetPixelValue(greenImage,i,j,gray_value);
IPI_GetPixelValue(blueImage1,i,j,&
IPI_SetPixelValue(blueImage,i,j,gray_value);
}}for(i=width1;
width;
{for(j=0;
(min_y-height2/2);
{IPI_SetPixelValue(redImage,i,j,0);
IPI_SetPixelValue(blueImage,i,j,0);
IPI_SetPixelValue(greenImage,i,j,0);
}}
for(i=min_x;
{for(j=0;
(min_y+height2/2);
{IPI_GetPixelValue(redImage2,i-min_x,j-(min_y-height2/2),&
IPI_SetPixelValue(redImage,i,j,gray_value);
IPI_GetPixelValue(greenImage2,i-min_x,j-(min_y-height2/2),&
IPI_SetPixelValue(greenImage,i,j,gray_value);
IPI_GetPixelValue(blueImage2,i-min_x,j-(min_y-height2/2),&
IPI_SetPixelValue(blueImage,i,j,gray_value);
}}
if(height>
height1)
min_x;
{for(j=height1;
height;
{IPI_SetPixelValue(redImage,i,j,0);
}}}
elseif(height==height1)
{for(i=width1;
{for(j=(height2/2+min_y);
IPI_SetPixelValue(blueImage,i,j,0);
}}}}
elseif(min_y<
=height2/2)
for(j=0;
(height2/2-min_y);
IPI_SetPixelValue(blueImage,i,j,0);
IPI_SetPixelValue(greenImage,i,j,0);
}for(i=min_x;
for(j=0;
height2;
j