本篇文章给大家谈谈图像拼接算法,以及急求!图像拼接算法代码对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
GPU上图像拼接的快速计算
图像拼接已被研究并广泛应用于计算机科学的许多领域,但在特征匹配、扭曲和混合步骤中存在大量计算。从而无法满足某些应用的实时性需求。幸运的是,已经在图形处理器单元(GPU)上开发并实现了一些可以加快拼接过程的相关并行操作。在本文中,我们使用统一计算设备架构(CUDA)提出了基于GPU的图像拼接的并行实现。我们在执行时间方面获得了比在中央处理单元(CPU)上实现更好的结果。在实验中使用集成GPUGTX745时,我们对大输入图像实现了高达27.6倍的加速比。
典型的拼接过程主要包括三个不同的图像处理步骤,即配准、扭曲和插值以及混合。图像配准是图像拼接的关键任务。配准是指在描绘同一场景的一对图像之间建立几何变换,该变换由一个8自由度的平面单应性决定。
GPU以其强大的并行计算能力吸引许多领域的研究,作为一种协处理器对计算量大的算法加速已成为实践的重要途径。在前人的研究中,他们都避免了考虑两个极其耗时的步骤,即特征匹配和随机样本共识(RANSAC)。作为图像配准中的两个关键过程,在提出的GPU加速并行算法中应考虑它们。
使用GPU并行计算会遇到两个限制
CUDA的出现解决了上述问题,并且CUDA使用C语言,最初为CPU编写的C语言函数可以移植到CUDA内核,无需修改。
在CUDA中,一定数量的线程被分组到一个块中,一定数量的块以规则的网格模式在逻辑上排列(见图1)。每个块都映射到一个多处理器,一个多处理器可以同时运行多个线程块。由于本地资源(寄存器和共享内存)在块之间进行划分,包含在同一块中的线程可以访问相同的共享内存并快速实现同步操作。但是,不同块中的线程并不能直接实现通信和同步。除了本地寄存器和共享内存,所有线程都可以访问全局内存、常量内存和纹理内存。
A.特征匹配
令点经过仿射变换后得到,即
向量是平移分量,控制缩放、旋转效果。利用齐次坐标系,方程(2)也可以写为
接着计算两幅图像特征点之间的欧几里得距离,并将距离按照升序排序,比较升序排序中第一和第二的比值如果小于某个阈值,则认为是匹配点。
由于中有六个未知参数,随机选择3对不共线的点匹配,使用该矩阵计算剩余对匹配点的误差。执行大量迭代,直到内点对最多。可以使用最小二乘估计器估计所有六个参数。
B.变形和插值
扭曲变形过程中,可能使像素点位置出现负值或者没有数值与之对应,在这种抢矿下需要插值算法创建更平滑和准确的数值,进一步减少翘曲中产生的变形。最常用的插值方法是最近邻插值、双线性插值和双三次插值。考虑到精度和计算复杂度之间的权衡,实验采用双线性插值算法。
C.混合
为了实现并行计算,本文采用了基于羽化的混合方法,其混合函数可以表示为:
其中是像素的权重函数。
A.并行匹配
匹配分为粗匹配和精匹配。粗匹配过程中,块线程数由特征元素数决定,每个块可以实现一个关键点之间的匹配,每个线程计算两个图像两个特征向量的距离。在计算完所有距离后,使用并行计算的归并排序对距离值排序。最后,所有块得到的匹配结果存储在全局内存中,然后传送到CPU。
精匹配过程,设计内核执行RANSAC迭代,只启动一个block,线程数为,首先用CPU将三个非共线点计算得到的变换矩阵,然后将、阈值和剩余个点传到GPU,判断内外点。
通过内存分配,可以实现精细匹配优化。
B.平行变形和插值
将矩阵的逆矩阵存放在常量内存中,由于需要频繁地调用。将待校正的图像存放在纹理内存中,纹理内存是专门为本地访问模式设计的。
为了进一步提升性能,若两个坐标小数部分小于0.2则强度值分配为整数部分,否则使用双线性插值。
C.并行混合
由于混合数是像素和像素的混合,因此线程数等于重叠部分包含的像素。令重叠图像的列数设置为16的倍数。gridDim.x的大小等于重叠图像的行数,gridDim.y的大小等于重叠图像的列数重叠图像除以16。
基于CPU的算法在配备16GMBDDR3RAM的IntelCorei7-4790、3.60GHz处理器上实现。基于GPU的算法在NVIDIAGeForceGTX745集成显卡上进行测试,每块最大1024个线程和4096MB全局内存。
可以清楚地看到,这两种图像之间几乎没有差异。原因是实验中使用的GPU卡支持浮点计算,与CPU版本相比产生的误差非常小。
在本文中,我们提出了一种使用CUDA架构在GPU上运行的并行图像拼接方法。顺序算法通过几个CUDA内核转换为并行版本。通过使用不同类型的内存,我们实现了并行算法的优化。同时,将GPU获得的结果与CPU获得的结果进行比较,我们实现了高达27.6的加速比。尽管所提出的方法显着提高了计算性能,但仍有许多工作要做。例如,更精确的插值方法(双三次插值)和可变权重c(x,y)可以考虑进一步改善镶嵌结果。此外,并行镶嵌算法也可以在多个GPU平台上运行,对于大数据可以更有效地执行算法。在今后的工作中,我们将一一处理这些问题。
android 全景图像拼接算法哪种方案最好
首先介绍一下流程:
1.选图,两张图的重叠区域不能太小,我个人认为最少不少于15%,这样才能保证有足够的角点匹配。
2.角点检测。这一步OpenCV提供了很多种方法,譬如Harris角点检测,而监测出的角点用CvSeq存储,这是一个双向链表。
3.角点提纯。在提纯的时候,需要使用RANSAC提纯。OpenCV自带了一个函数,FindHomography,不但可以提纯,还可以计算出3x3的转换矩阵。这个转换矩阵十分重要。
4.角点匹配。经过提纯后的角点,则需要匹配。
5.图像变换。这一步我曾经尝试过很多办法,最后选择了FindHomography输出的变换矩阵,这是一个透视变换矩阵。经过这个透视变换后的图像,可以直接拿来做拼接。
6.图象拼接。完成上面步骤之后,其实这一步很容易。
7.球面变换。这一步需要对坐标系进行转换,从平面坐标到球面坐标。
急求!图像拼接算法代码
算法描述
procedureImageMatching
{
输入FirstImage;
输入SecondImage;
//获得两幅图象的大小
Height1=GetImageHeight(FirstImage);
Height2=GetImageHeight(SecondImage);
Width1=GetImageWidth(FirstImage);
Width2=GetImageWidth(SecondImage);
//从第二幅图象取网格匹配模板
SecondImageGrid=GetSecondImageGrid(SecondImage);
//粗略匹配,网格在第一幅图象中先从左向右移动,再从下到上移动,每次移动一个网格间距,Step_Width或Step_Height,当网格移出重叠区域后结束
y=Heitht1-GridHeight;
MinValue=MaxInteger;
While(y<Height1-OverlapNumber)//当网格移出重叠部分后结束
{
x=Grid_Width/2;//当网格位于第一幅图象的最左边时,A点的横坐标。
While(x<(Width1-Grid_Width/2))
{
FirstImageGrid=GetImgaeGrid(FirstImgaeGrid,x,y);
differ=CaculateDiff(FirstImgaeGrid,SecondImageGrid);//计算象素值差的平
//方和
if(differ<MinValue)
{
BestMatch_x=x;
BestMatch_y=y;
MinValue=differ;
}
x=x+Step_width;
}
y=y-Step_Height;
}
//精确匹配
Step_Width=Step_Width/2;
Step_Height=Step_Height/2;
While(Step_Height>0&Step_Width>0)//当水平步长和垂直步长均减为零时结束
{
if(Step_Height==0)//当仅有垂直步长减为零时,将其置为1
Step_Height=1;
If(Step_Width==0)//当仅有水平步长减为零时,将其置为1
Step_Width=1;
temp_x=BestMatch_x;
temp_y=BestMatch_y;
for(i=-1;i<1;i++)
for(j=-1;j<1;j++)
{
if((i=0&j!=0)|(i!=0&j=0))
{
FirstImageGrid=GetImgaeGrid(FirstImgaeGrid,
temp_x+i*Step_Width,temp_y+j*Step_Height);
differ=CaculateDiff(FirstImgaeGrid,SecondImageGrid);
if(differ<MinValue)
{
BestMatch_x=x;
BestMatch_y=y;
MinValue=differ;
}
}
}
Step_Height=Step_Height/2;
Step_Width=Step_Width/2;
}
}
不懂的可以问我,相互交流
关于图像拼接算法到此分享完毕,希望能帮助到您。