图像拼接_图像拼接matlab - CSDN
精华内容
参与话题
  • 图像拼接

    2020-03-31 19:55:14
    图像拼接算法一般基于如下思路: 对每张图像进行特征点提取; 特征点匹配; 特征点筛选 计算投影矩阵; 进行投影变换 进行图像简单拼接; 对重叠部分进行融合; 特征点提取 选择不同的特征点提取算法,会对...

    图像拼接算法一般基于如下思路:

    1. 对每张图像进行特征点提取;
    2. 特征点匹配;
    3. 特征点筛选
    4. 计算投影矩阵;
    5. 进行投影变换
    6. 进行图像简单拼接;
    7. 对重叠部分进行融合;

    特征点提取

    选择不同的特征点提取算法,会对拼接的结果产生影响。

    分别测试了sift,surf,orb对特征点进行提取,在其他步骤一样的情况下,最终的拼接效果sift≈surf>orb

    特征点匹配

    特征点筛选

    排序筛选:根据匹配度进行排序,选择前特定数量或者特定百分比的特征点作为优秀特征点。

    使用orb特征,当分别选择前30%和前50%特征点的最终效果。

    阈值筛选:当匹配度大于一定阈值,认为该点为优秀特征点。

    findhomography计算单应性矩阵(3*3)

    单应性矩阵(Homography)是一个从一张图像到另一张图像映射关系的转换矩阵(3*3)。

     

    以上图为例,点(x1,y1)到点(x2,y2)的单应性变换为:

    相比于使用getPerspectiveTransform根据4个点来获得投影变换矩阵,findHomography使用优化算法从一系列点中筛选出最优解。

    Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC);

     

    计算配准图的四个顶点坐标

    在执行投影变换之前,计算投影变换后四个顶点在拼接后图像的位置,进而得出存放拼接后图像的尺寸大小。

     

    按照单应性变换公式,求解顶点变换后的坐标位置。

    例如,以左上角顶点(0,0)为例,变换后的坐标为:

        v2[0] = 0;
        v2[1] = 0;
        v2[2] = 1;
        V2 = Mat(3, 1, CV_64FC1, v2);  
        V1 = Mat(3, 1, CV_64FC1, v1);  
        V1 = H * V2;
        x = v1[0] / v1[2];
        y = v1[1] / v1[2];

    执行投影变换

    对右边图像执行投影变换。

    图像简单拼接

    将左边图像覆盖叠加在右边图像上。

    左边为surf的拼接效果,右边为orb的拼接效果

    简单拼接完成后就可以看出最终效果了,简单拼接错位严重的话,说明特征点提取步骤就存在问题,融合完成后效果也不会好到哪里去。

    重叠部分融合

    左边为surf的融合效果,右边为orb的融合效果,右边存在明显的重影现象,栏杆区域重叠度不好。

    图像融合对重叠部分采用加权融合的方式,在重叠部分由前一幅图像慢慢过渡到第二幅图像,非重叠部分直接采用原图像。

    重叠部分的权值公式:

    其中x为当前处理点到重叠区域左边界距离。

    参考:

    https://www.cnblogs.com/skyfsm/p/7411961.html

    https://blog.csdn.net/weixin_42717395/article/details/85768313

     

    opencv中使用stitcher将图像拼接算法封装起来,便于调用

    https://blog.csdn.net/zhaocj/article/details/78989548

     

    展开全文
  • 图像拼接算法总结(一)

    万次阅读 多人点赞 2017-06-13 10:08:56
    图像拼接技术包括三大部分:特征点提取与匹配、图像配准、图像融合。 1、基于SRUF 的特征点的提取与匹配 为了使拼接具有良好的精度和鲁棒性,同时又使其具有较好的实时性,本实验采用SURF 算法完成图像序列特征点...
    图像的拼接技术包括三大部分:特征点提取与匹配、图像配准、图像融合。
    1、基于SRUF 的特征点的提取与匹配
    为了使拼接具有良好的精度和鲁棒性,同时又使其具有较好的实时性,本实验采用SURF 算法完成图像序列特征点的提取。
    SURF 算法又称快速鲁棒特征,借鉴了SIFT 中简化近似的思想,将DoH 中的高斯二阶微分模板进行了近似简化,使得模板对图像的滤波只需要进行几个简单的加减法运算,并且这种运算与滤波模板的尺寸无关。实验证明,SURF 算法较SIFT 在运算速度上要快3 倍左右,综合性能要优于SIFT 算法。
    SURF 特征点提取与描述主要包含4 个步骤:
    1)检测尺度空间极值。
    2)精炼特征点位置。
    3)计算特征点的描述信息。

    4)生成描述特征点的特征向量。

    SURF的匹配算法是通过计算两个特征点藐视算子之间的欧式距离得到的,即找出与特征点描述符pi欧式距离最近和次近的两个邻居特征点描述符qi'和qi'',然后计算pi与qi'以及pi与qi'' 两组描述符之间欧式距离的比值r。如果比值r小于规定阈值规则视为匹配成功,(pi,qi')点对则为图像序列中的一对匹配点,否则匹配失败。这种匹配方法简便快捷,但是会差生误匹配。在图像配准模块会使用RANSAC进行误匹配点的筛选。

    2、图像配准

    图像配准是一种确定待拼接图像间的重叠区域以及重叠位置的技术,它是整个图像拼接的核心。本节采用的是基于特征点的图像配准方法,即通过匹配点对构建图像序列之间的变换矩阵,从而完成全景图像的拼接。

    变换矩阵H求解是图像配准的核心,其求解的算法流程如下。

    1)检测每幅图像中特征点。

    2)计算特征点之间的匹配。

    3)计算图像间变换矩阵的初始值。

    4)迭代精炼H变换矩阵。

    5)引导匹配。用估计的H去定义对极线附近的搜索区域,进一步确定特征点的对应。

    6)重复迭代4)和5)直到对应点的数目稳定为止。

    设图像序列之间的变换为投影变换

    可用4组最佳匹配计算出H矩阵的8 个自由度参数hi=( i=0,1,...,7),并以此作为初始值。

    为了提高图像配准的精度,本节采用RANSAC算法对图像变换矩阵进行求解与精炼,达到了较好的图像拼接效果。RANSAC算法的基本原理可通过图9-1来描述。


    图9-1:RANSAC算法

    RANSAC算法的思想简单而巧妙:首先随机地选择两个点,这两个点确定了一条直线,并且称在这条直线的一定范围内的点为这条直线的支撑。这样的随机选择重复数次,然后,具有最大支撑集的直线被确认为是样本点集的拟合。在拟合的误差距离范围内的点被认为是内点,它们构成一致集,反之则为外点。根据算法描述,可以很快判断,如果只有少量外点,那么随机选取的包含外点的初始点集确定的直线不会获得很大的支撑,值得注意的是,过大比例的外点将导致RANSAC算法失败。在直线拟合的例子中,由点集确定直线至少需要两个点;而对于透视变换,这样的最小集合需要有4个点。

    图9-1中蓝色点属于内点(正确点),而第红色点属于外点(偏移点)。此时用最小二乘法拟合这组数据,实际的最佳拟合直线是那条穿越了最多点数的蓝色实线。

    3、图像合成

    根据图像间变换矩阵H,可以对相应图像进行变换以确定图像间的重叠区域,并将待融和图像映射到到一幅新的空白图像中形成拼接图。需要注意的是,由于普通的相机在拍摄照片时会自动选取曝光参数,这会使输入图像间存在亮度差异,导致拼接后的图像缝合线两端出现明显的明暗变化。因此,在融和过程中需要对缝合线进行处理。进行图像拼接缝合线处理的方法有很多种,如颜色插值和多分辨率样条技术等,本节采用了快速简单的加权平滑算法处理拼接缝问题。该算法的主要思想是:图像重叠区域中像素点的灰度值Pixel 由两幅图像中对应点的灰度值Pixel_L和_R加权平均得到,即Pixel=k×Pixel_L+(1-k)× Pixel_R,其中k是可调因子。图9-2为加权平滑算法图。


    图9-2:加权平滑算法

    通常情况下0<k<1,即在重叠区域中,沿图像1向图像2的方向,k由1渐变为0,从而实现重叠区域的平滑拼接。为使图像重叠区域中的点与两幅图像建立更大的相关性,令k=d1/(d1+d2),其中d1,d2分别表示重叠区域中的点到两幅图像重叠区域的左边界和右边界的距离。即使用公式Pixel = ×Pixel_L + ×Pixel_R进行缝合线处理。



    展开全文
  • 图像拼接算法及实现

    万次阅读 2014-10-30 18:14:55
    图像拼接解决的问题一般式,通过对齐一系列空间重叠的图像,构成一个无缝的、高清晰的图像,它具有比单个图像更高的分辨率和更大的视野。  早期的图像拼接研究一直用于照相绘图学,主要是对大量
    第一章  绪论
    

      1.1 图像拼接技术的研究背景及研究意义

      图像拼接(image mosaic)是一个日益流行的研究领域,他已经成为照相绘图学、计算机视觉、图像处理和计算机图形学研究中的热点。图像拼接解决的问题一般式,通过对齐一系列空间重叠的图像,构成一个无缝的、高清晰的图像,它具有比单个图像更高的分辨率和更大的视野。

      早期的图像拼接研究一直用于照相绘图学,主要是对大量航拍或卫星的图像的整合。近年来随着图像拼接技术的研究和发展,它使基于图像的绘制(IBR)成为结合两个互补领域——计算机视觉和计算机图形学的坚决焦点,在计算机视觉领域中,图像拼接成为对可视化场景描述(Visual Scene Representaions)的主要研究方法:在计算机形学中,现实世界的图像过去一直用于环境贴图,即合成静态的背景和增加合成物体真实感的贴图,图像拼接可以使IBR从一系列真是图像中快速绘制具有真实感的新视图。

      在军事领域网的夜视成像技术中,无论夜视微光还是红外成像设备都会由于摄像器材的限制而无法拍摄视野宽阔的图片,更不用说360 度的环形图片了。但是在实际应用中,很多时候需要将360 度所拍摄的很多张图片合成一张图片,从而可以使观察者可以观察到周围的全部情况。使用图像拼接技术,在根据拍摄设备和周围景物的情况进行分析后,就可以将通过转动的拍摄器材拍摄的涵盖周围360 度景物的多幅图像进行拼接,从而实时地得到超大视角甚至是360 度角的全景图像。这在红外预警中起到了很大的作用。

      微小型履带式移动机器人项目中,单目视觉不能满足机器人的视觉导航需要,并且单目视觉机器人的视野范围明显小于双目视觉机器人的视野。利用图像拼接技术,拼接机器人双目采集的图像,可以增大机器人的视野,给机器人的视觉导航提供方便。在虚拟现实领域中,人们可以利用图像拼接技术来得到宽视角的图像或360 度全景图像,用来虚拟实际场景。这种基于全景图的虚拟现实系统,通过全景图的深度信息抽取,恢复场景的三维信息,进而建立三维模型。这个系统允许用户在虚拟环境中的一点作水平环视以及一定范围内的俯视和仰视,同时允许在环视的过程中动态地改变焦距。这样的全景图像相当于人站在原地环顾四周时看到的情形。在医学图像处理方面,显微镜或超声波的视野较小,医师无法通过一幅图像进行诊视,同时对于大目标图像的数据测量也需要把不完整的图像拼接为一个整体。所以把相邻的各幅图像拼接起来是实现远程数据测量和远程会诊的关键环节圆。在遥感技术领域中,利用图像拼接技术中的图像配准技术可以对来自同一区域的两幅或多幅图像进行比较,也可以利用图像拼接技术将遥感卫星拍摄到的有失真地面图像拼接成比较准确的完整图像,作为进一步研究的依据。

    从以上方面可以看出,图像拼接技术的应用前景十分广阔,深入研究图像拼接技术有着很重要的意义

      1.2图像拼接算法的分类

      图像拼接作为这些年来图像研究方面的重点之一,国内外研究人员也提出了很多拼接算法。图像拼接的质量,主要依赖图像的配准程度,因此图像的配准是拼接算法的核心和关键。根据图像匹配方法的不同仁阔,一般可以将图像拼接算法分为以下两个类型:
      (1) 基于区域相关的拼接算法。
          这是最为传统和最普遍的算法。基于区域的配准方法是从待拼接图像的灰度值出发,对待配准图像中一块区域与参考图像中的相同尺寸的区域使用最小二乘法或者其它数学方法计算其灰度值的差异,对此差异比较后来判断待拼接图像重叠区域的相似程度,由此得到待拼接图像重叠区域的范围和位置,从而实现图像拼接。也可以通过FFT 变换将图像由时域变换到频域,然后再进行配准。对位移量比较大的图像,可以先校正图像的旋转,然后建立两幅图像之间的映射关系。
    当以两块区域像素点灰度值的差别作为判别标准时,最简单的一种方法是直接把各点灰度的差值累计起来。这种办法效果不是很好,常常由于亮度、对比度的变化及其它原因导致拼接失败。另一种方法是计算两块区域的对应像素点灰度值的相关系数,相关系数越大,则两块图像的匹配程度越高。该方法的拼接效果要好一些,成功率有所提高。
     (2) 基于特征相关的拼接算法。
         基于特征的配准方法不是直接利用图像的像素值,而是通过像素导出图像的特征,然后以图像特征为标准,对图像重叠部分的对应特征区域进行搜索匹配,该类拼接算法有比较高的健壮性和鲁棒性。
    基于特征的配准方法有两个过程:特征抽取和特征配准。首先从两幅图像中提取灰度变化明显的点、线、区域等特征形成特征集冈。然后在两幅图像对应的特征集中利用特征匹配算法尽可能地将存在对应关系的特征对选择出来。一系列的图像分割技术都被用到特征的抽取和边界检测上。如canny 算子、拉普拉斯高斯算子、区域生长。抽取出来的空间特征有闭合的边界、开边界、交叉线以及其他特征。特征匹配的算法有:交叉相关、距离变换、动态编程、结构匹配、链码相关等算法。

      1.3本文的主要工作和组织结构

    本文的主要工作:
    (1) 总结了前人在图像拼接方面的技术发展历程和研究成果。

    (2) 学习和研究了前人的图像配准算法。

    (3) 学习和研究了常用的图像融合算法。

    (4) 用matlab实现本文中的图像拼接算法

    (5) 总结了图像拼接中还存在的问题,对图像拼接的发展方向和应用前景进行展望。

      本文的组织结构:

      第一章主要对图像拼接技术作了整体的概述,介绍了图像拼接的研究背景和应用前景,以及图像拼接技术的大致过程、图像拼接算法的分类和其技术难点。第二章主要介绍讨论了图像预处理中的两个步骤,即图像的几何校正和噪声点的抑制。第三章主要介绍讨论了图像配准的多种算法。第四章主要介绍讨论了图像融合的一些算法。第五章主要介绍图像拼接软件实现本文的算法。第六章主要对图像拼接中还存在的问题进行总结,以及对图像拼接的发展进行展望。

      1.4 本章小结

      本章主要对图像拼接技术作了整体的概述,介绍了图像拼接的研究背景和应用前景,以图像拼接算法的分类和其技术难点,并且对全文研究内容进行了总体介绍。
      第二章  图像拼接的基础理论及图像预处理

      2.1图像拼接

        图像拼接技术主要有三个主要步骤:图像预处理、图像配准、图像融合与边界平滑,

    如图

        图像拼接技术主要分为三个主要步骤:图像预处理、图像配准、图像融合与边界平滑,图像预处理主要指对图像进行几何畸变校正和噪声点的抑制等,让参考图像和待拼接图像不存在明显的几何畸变。在图像质量不理想的情况下进行图像拼接,如果不经过图像预处理,很容易造成一些误匹配。图像预处理主要是为下一步图像配准做准备,让图像质量能够满足图像配准的要求。图像配准主要指对参考图像和待拼接图像中的匹配信息进行提取,在提取出的信息中寻找最佳的匹配,完成图像间的对齐。图像拼接的成功与否主要是图像的配准。待拼接的图像之间,可能存在平移、旋转、缩放等多种变换或者大面积的同色区域等很难匹配的情况,一个好的图像配准算法应该能够在各种情况下准确找到图像间的对应信息,将图像对齐。图像融合指在完成图像匹配以后,对图像进行缝合,并对缝合的边界进行平滑处理,让缝合自然过渡。由于任何两幅相邻图像在采集条件上都不可能做到完全相同,因此,对于一些本应该相同的图像特性,如图像的光照特性等,在两幅图像中就不会表现的完全一样。图像拼接缝隙就是从一幅图像的图像区域过渡到另一幅图像的图像区域时,由于图像中的某些相关特性发生了跃变而产生的。图像融合就是为了让图像间的拼接缝隙不明显,拼接更自然

      2.2 图像的获取方式

      图像拼接技术原理是根据图像重叠部分将多张衔接的图像拼合成一张高分辨率全景图 。这些有重叠部分的图像一般由两种方法获得 : 一种是固定照相机的转轴 ,然后绕轴旋转所拍摄的照片 ;另一种是固定照相机的光心 ,水平摇动镜头所拍摄的照片。其中 ,前者主要用于远景或遥感图像的获取 ,后者主要用于显微图像的获取 ,它们共同的特点就是获得有重叠的二维图像。

      2.3 图像的预处理

      2.3.1 图像的校正

      当照相系统的镜头或者照相装置没有正对着待拍摄的景物时候,那么拍摄到的景物图像就会产生一定的变形。这是几何畸变最常见的情况。另外,由于光学成像系统或电子扫描系统的限制而产生的枕形或桶形失真,也是几何畸变的典型情况。几何畸变会给图像拼接造成很大的问题,原本在两幅图像中相同的物体会因为畸变而变得不匹配,这会给图像的配准带来很大的问题。因此,解决几何畸变的问题显得很重要。

      图象校正的基本思路是,根据图像失真原因,建立相应的数学模型,从被污染或畸变的图象信号中提取所需要的信息,沿着使图象失真的逆过程恢复图象本来面貌。实际的复原过程是设计一个滤波器,使其能从失真图象中计算得到真实图象的估值,使其根据预先规定的误差准则,最大程度地接近真实图象。

      2.3.2 图像噪声的抑制

      图像噪声可以理解为妨碍人的视觉感知,或妨碍系统传感器对所接受图像源信息进行理解或分析的各种因素,也可以理解成真实信号与理想信号之间存在的偏差。一般来说,噪声是不可预测的随机信号,通常采用概率统计的方法对其进行分析。噪声对图像处理十分重要,它影响图像处理的各个环节,特别在图像的输入、采集中的噪声抑制是十分关键的问题。若输入伴有较大的噪声,必然影响图像拼接的全过程及输出的结果。根据噪声的来源,大致可以分为外部噪声和内部噪声;从统计数学的观点来定义噪声,可以分为平稳噪声和非平稳噪声。各种类型的噪声反映在图像画面上,大致可以分为两种类型。一是噪声的幅值基本相同,但是噪声出现的位置是随机的,一般称这类噪声为椒盐噪声。另一种是每一点都存在噪声,但噪声的幅值是随机分布的,从噪声幅值大小的分布统计来看,其密度函数有高斯型、瑞利型,分别成为高斯噪声和瑞利噪声,又如频谱均匀分布的噪声称为白噪声等。

      1.均值滤波

        所谓均值滤波实际上就是用均值替代原图像中的各个像素值。均值滤波的方法是,对将处理的当前像素,选择一个模板,该模板为其邻近的若干像素组成,用模板中像素的均值来替代原像素的值。如图2.4所示,序号为0是当前像素,序号为1至8是邻近像素。求模板中所有像素的均值,再把该均值赋予当前像素点((x, y),作为处理后图像在该点上的灰度g(x,y),即

     g(x,y)=图像拼接算法及实现 图像拼接算法及实现                                                      (2-2-2-1)

    其中,s为模板,M为该模板中包含像素的总个数。


    图2.2.2.1模板示意图

      2.中值滤波

      中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。它的核心算法是将模板中的数据进行排序,这样,如果一个亮点(暗点)的噪声,就会在排序过程中被排在数据序列的最右侧或者最左侧,因此,最终选择的数据序列中见位置上的值一般不是噪声点值,由此便可以达到抑制噪声的目的。
    取某种结构的二维滑动模板,将模板内像素按照像素值的大小进行排序,生成单调上升(或下降)的二维数据序列。二维德中值滤波输出为
                                     ( 2-2-2-2 )                            

    其中,f(x,y),g (x,y)分别为原图像和处理后的图像,w二维模板,k ,l为模板的长宽,Med 为取中间值操作,模板通常为3  3 、5 5 区域,也可以有不同形状,如线状、圆形、十字形、圆环形。

      2.4 本章小结

      本章主要介绍了图像几何畸变校正和图像噪声抑制两种图像预处理.

      第三章  图像配准算法

      3.1 图像配准的概念

        图像配准简而言之就是图像之间的对齐。图像配准定义为:对从不同传感器或不同时间或不同角度所获得的两幅或多幅图像进行最佳匹配的处理过程。为了更清楚图像配准的任务,我们将图像配准问题用更精确的数学语言描述出来。配准可以用描述为如下的问题:

    给定同一景物的从不同的视角或在不同的时间获取的两个图像I ,I 和两个图像间的相似度量S(I ,I ),找出I ,I 中的同名点,确定图像间的最优变换T,使得S(T(I ),I )达到最大值。

        图像配准总是相对于多幅图像来讲的,在实际工作中,通常取其中的一幅图像作为配准的基准,称它为参考图,另一幅图像,为搜索图。图像配准的一般做法是,首先在参考图上选取以某一目标点为中心的图像子块,并称它为图像配准的模板,然后让模板在搜索图上有秩序地移动,每移到一个位置,把模板与搜索图中的对应部分进行相关比较,直到找到配准位置为止。

        如果在模板的范围内,同一目标的两幅图像完全相同,那么完成图像配准并不困难。然而,实际上图像配准中所遇到的同一目标的两幅图像常常是在不同条件下获得的,如不同的成像时间、不同的成像位置、甚至不同的成像系统等,再加上成像中各种噪声的影响,使同一目标的两幅图像不可能完全相同,只能做到某种程度的相似,因此图像配准是一个相当复杂的技术过程。
      3.2 基于区域的配准

      3.2.1 逐一比较法

    设搜索图为s待配准模板为T,如图3.1所示,S大小为M N,T大小为U V,如图所示。


                  图3.1搜索图S与模板T示意图

     逐一比较法的配准思想是:

        在搜索图S中以某点为基点(i,j),截取一个与模板T大小一样的分块图像,这样的基点有(M-U+1) 图像拼接算法及实现(N-V+1)个,配准的目标就是在(M-U+1) 图像拼接算法及实现(N-V+1)个分块图像中找一个与待配准图像最相似的图像,这样得到的基准点就是最佳配准点。

        设模板T在搜索图s上移动,模板覆盖下的那块搜索图叫子图S ,(i,j)为这块子图的左上角点在S图中的坐标,叫做参考点。然后比较T和S 图像拼接算法及实现的内容。若两者一致,则T和S图像拼接算法及实现 之差为零。在现实图像中,两幅图像完全一致是很少见的,一般的判断是在满足一定条件下,T和S图像拼接算法及实现 之差最小。

    根据以上原理,可采用下列两种测度之一来衡量T和S 的相似程度。D(i,j)的值越小,则该窗口越匹配。

              D(i,j)= 图像拼接算法及实现 图像拼接算法及实现  [S图像拼接算法及实现 (m,n)-T(m,n)]图像拼接算法及实现              (3-1)

              D(i,j)=图像拼接算法及实现 图像拼接算法及实现  图像拼接算法及实现 [S图像拼接算法及实现 (m,n)-T(m,n)图像拼接算法及实现              (3-2)

    或者利用归一化相关函数。将式(3-1)展开可得:

    D(i,j)=图像拼接算法及实现 图像拼接算法及实现  [S (m,n)] -2 图像拼接算法及实现 图像拼接算法及实现 S (m,n)*T(m,n)+图像拼接算法及实现 图像拼接算法及实现  [T(m,n)]  (3-3)

        式中等号右边第三项表示模板总能量,是一常数,与(i,j)无关;第一项是与模板匹配区域的能量,它随((i,j)的改变而改变,当T和S 匹配时的取最大值。因此相

    关函数为:

    R(i,j)=图像拼接算法及实现                                             (3-4)

    当R(i,j)越大时,D(i,j)越小,归一化后为:

     R(i,j)=图像拼接算法及实现                      (3-5)

    根据Cauchy-Schwarz不等式可知式(3-5)中0图像拼接算法及实现 R(i,j)图像拼接算法及实现 1,并且仅当值S (m, n)/T (m, n)=常数时,R(i,j)取极大值。

        该算法的优点:

        (1)算法思路比较简单,容易理解,易于编程实现。

        (2)选用的模板越大,包含的信息就越多,匹配结果的可信度也会提高,同时能够对参考图像进行全面的扫描。

        该算法的缺点:

        (1)很难选择待配准图像分块。因为一个如果分块选择的不正确,缺少信息量,则不容易正确的匹配,即发生伪匹配。同时,如果分块过大则降低匹配速度,如果分块过小则容易降低匹配精度。

        (2)对图像的旋转变形不能很好的处理。算法本身只是把待配准图像分块在标准参考图像中移动比较,选择一个最相似的匹配块,但是并不能够对图像的旋转变形进行处理,因此对照片的拍摄有严格的要求。

      

    3.2.2 分层比较法

      图像处理的塔形(或称金字塔:Pyramid)分解方法是由Burt和Adelson首先提出的,其早期主要用于图像的压缩处理及机器人的视觉特性研究。该方法把原始图像分解成许多不同空间分辨率的子图像,高分辨率(尺寸较大)的子图像放在下层,低分辨率(尺寸较小)的图像放在上层,从而形成一个金字塔形状。

        在逐一比较法的思想上,为减少运算量,引入了塔形处理的思想,提出了分层比较法。利用图像的塔形分解,可以分析图像中不同大小的物体。同时,通过对低分辨率、尺寸较小的上层进行分析所得到的信息还可以用来指导对高分辨率、尺寸较大的下层进行分析,从而大大简化分析和计算。在搜索过程中,首先进行粗略匹配,每次水平或垂直移动一个步长,计算对应像素点灰度差的平方和,记录最小值的网格位置。其次,以此位置为中心进行精确匹配。每次步长减半,搜索当前最小值,循环这个过程,直到步长为零,最后确定出最佳匹配位置。

        算法的具体实现步骤如下:

        (1)将待匹配的两幅图像中2 图像拼接算法及实现 2邻域内的像素点的像素值分别取平均,作为这一区域(2 图像拼接算法及实现 2)像素值,得到分辨率低一级的图像。然后,将此分辨率低一级的图像再作同样的处理,也就是将低一级的图像4 图像拼接算法及实现 4邻域内的像素点的像素值分别取平均,作为这一区域(4图像拼接算法及实现  4)点的像素值,得到分辨率更低一级的图像。依次处理,得到一组分辨率依次降低的图像。

        (2)从待匹配的两幅图像中分辨率最低的开始进行匹配搜索,由于这两幅图像像素点的数目少,图像信息也被消除一部分,因此,此匹配位置是不精确的。所以,在分辨率更高一级的图像中搜索时,应该在上一次匹配位置的附近进行搜索。依次进行下去,直到在原始图像中寻找到精确的匹配位置。

        算法的优点:

          (1)该算法思路简单,容易理解,易于编程实现。

          (2)该算法的搜索空间比逐一比较要少,在运算速度较逐一比较法有所提高。

        算法的缺点:

          (1)算法的精度不高。在是在粗略匹配过程中,移动的步长较大,很有可能将第一幅图像上所取的网格划分开,这样将造成匹配中无法取出与第一幅图像网格完全匹配的最佳网格,很难达到精确匹配。

          (2)对图像的旋转变形仍然不能很好的处理。与逐一比较法一样,该算法只是对其运算速度有所改进,让搜索空间变小,并无本质变化,因此对图像的旋转变形并不能进行相应处理。

      

    3.2.3 相位相关法

      相位相关度法是基于频域的配准常用算法。它将图像由空域变换到频域以后再进行配准。该算法利用了互功率谱中的相位信息进行图像配准,对图像间的亮度变化不敏感,具有一定的抗干扰能力,而且所获得的相关峰尖锐突出,位移检测范围大,具有较高的匹配精度。

        相位相关度法思想是利用傅立叶变换的位移性质,对于两幅数字图像s,t,其对应的傅立叶变换为S,T,即:

    S=F{s}=图像拼接算法及实现 e图像拼接算法及实现    T=F{t}=图像拼接算法及实现 e图像拼接算法及实现              (3-6)

    若图像s,t相差一个平移量(x ,y ),即有:

          s(x,y) = t(x-x ,y-y )                               (3-7)

        根据傅立叶变换的位移性质,上式的傅立叶变换为:

         S(图像拼接算法及实现 )=e图像拼接算法及实现 T(图像拼接算法及实现 )                        (3-8)

        也就是说,这两幅图像在频域中具有相同的幅值,只是相位不同,他们之间的相位差可以等效的表示为互功率谱的相位。两幅图的互功率谱为:

     图像拼接算法及实现=e 图像拼接算法及实现                       (3-9)

        其中*为共扼符号, 表示频谱幅度。通过对互功率谱式(3-9)进行傅立叶逆变换,在((x,y)空间的(x ,y ),即位移处,将形成一个单位脉冲函数 ,脉冲位置即为两幅被配准图像间的相对平移量x 和y

        式(3-9)表明,互功率谱的相位等价于图像间的相位差,故该方法称作相位相关法。

        相位相关度法的优点:

          (1)该算法简单速度快,因此经常被采用。对于其核心技术傅立叶变换,现在己经出现了很多有关的快速算法,这使得该算法的快速性成为众多算法中的一大优势。另外,傅立叶变换的硬件实现也比其它算法容易。

          (2)该算法抗干扰能力强,对于亮度变化不敏感。

      相位相关度法的缺点:

        (1)该算法要求图像有50%左右的重叠区域,在图像重叠区域很小的时,算法的结果很难保证,容易造成误匹配。

        (2)由于Fourier变换依赖于自身的不变属性,所以该算法只适用于具有旋转、平移、比例缩放等变换的图像配准问题。对于任意变换模型,不能直接进行处理,而要使用控制点方法,控制点方法可以解决诸如多项式、局部变形等问题。

      3.3 基于特征的配准

      3.3.1 比值匹配法

      比值匹配法算法思路是利用图像中两列上的部分像素的比值作为模板,即在参考图像T的重叠区域中分别在两列上取出部分像素,用它们的比值作为模板,然后在搜索图S中搜索最佳的匹配。匹配的过程是在搜索图S中,由左至右依次从间距相同的两列上取出部分像素,并逐一计算其对应像素值比值;然后将这些比值依次与模板进行比较,其最小差值对应的列就是最佳匹配。这样在比较中只利用了一组数据,而这组数据利用了两列像素及其所包含的区域的信息。

        该算法的具体实现步骤如下:

        (1)在参考图像T中间隔为c个像素的距离上的两列像素中,各取m个像素,计算这m个像素的比值,将m个比值存入数组中,将其作为比较的模板。

        (2)从搜索图S中在同样相隔c个像素的距离上的两列,各取出m+n个像素,计算其比值,将m+n个比值存入数组。假定垂直错开距离不超过n个像素,多取的n个像素则可以解决图像垂直方向上的交错问题。

        (3)利用参考图像T中的比值模板在搜索图S中寻找相应的匹配。首先进行垂直方向上的比较,即记录下搜索图S中每个比值数组内的最佳匹配。再将每个数组的组内最佳匹配进行比较,即进行水平方向的比较,得到的最小值就认为是全局最佳匹配。此时全局最佳匹配即为图像间在水平方向上的偏移距离,该全局最佳匹配队应的组内最佳匹配即为图像间垂直方向上的偏移距离。

        比值匹配法的优点:

        (1)算法思路清晰简单,容易理解,实现起来比较方便。

        (2)在匹配计算的时候,计算量小,速度快。

        比值匹配法的缺点:

        (1)利用图像的特征信息太少。只利用了两条竖直的平行特征线段的像素的信息,没有能够充分利用了图像重叠区域的大部分特征信息。虽然算法提到,在搜索图S中由左至右依次从间距相同的两列上取出部分像素,计算其对应像素的比值,然后将这些比值依次与模版进行比较,好像是利用了搜索图S中的重叠区域的大部分图像信息,但在参考图像T中,只是任意选择了两条特征线,没有充分利用到参考图像T的重叠区域的特征信息。

        (2)对图片的采集提出了较高的要求。此算法对照片先进行垂直方向上的比较,然后再进行水平方向上的比较,这样可以解决上下较小的错开问题。在采集的时候只能使照相机在水平方向上移动。然而,有时候不可避免的照相机镜头会有小角度的旋转,使得拍摄出来的照片有一定的旋转,在这个算法中是无法解决的。而且对重叠区域无明显特征的图像,比较背景是海洋或者天空,这样在选取特征模版的时候存在很大的问题。由于照片中存在大块纹理相同的部分,所以与模版的差别就不大,这样有很多匹配点,很容易造成误匹配。

        (3)不易对两条特征线以及特征线之间的距离进行确定。算法中在参考图像T的重叠区域中取出两列像素上的部分像素,并没有给出选择的限制。然而在利用拼接算法实现自动拼接的时候,如果选取的特征线不是很恰当,那么这样的特征线算出来的模版就失去了作为模版的意义。同时,在确定特征线间距时,选的过大,则不能充分利用重叠区域的图像信息。选择的过小,则计算量太大。


    展开全文
  • 【OpenCV】图像拼接技术

    万次阅读 热门讨论 2018-08-21 16:57:15
    转载自:OpenCV探索之路(二十四)图像拼接图像融合技术 测试环境为Vs2015+OpenCV2.4.9 一、OpenCV自带的拼接算法stitch 这部分在opencv自带的例程中也有相应的sample,可以参照。 #include &lt;...

    转载自:OpenCV探索之路(二十四)图像拼接和图像融合技术

    测试环境为Vs2015+OpenCV2.4.9

    一、OpenCV自带的拼接算法stitch

    这部分在opencv自带的例程中也有相应的sample,可以参照。

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/stitching/stitcher.hpp>
    using namespace std;
    using namespace cv;
    bool try_use_gpu = false;
    vector<Mat> imgs;
    string result_name = "dst1.jpg";
    int main(int argc, char * argv[])
    {
        Mat img1 = imread("34.jpg");
        Mat img2 = imread("35.jpg");
    
        imshow("p1", img1);
        imshow("p2", img2);
    
        if (img1.empty() || img2.empty())
        {
            cout << "Can't read image" << endl;
            return -1;
        }
        imgs.push_back(img1);
        imgs.push_back(img2);
    
    
        Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
        // 使用stitch函数进行拼接
        Mat pano;
        Stitcher::Status status = stitcher.stitch(imgs, pano);
        if (status != Stitcher::OK)
        {
            cout << "Can't stitch images, error code = " << int(status) << endl;
            return -1;
        }
        imwrite(result_name, pano);
        Mat pano2 = pano.clone();
        // 显示源图像,和结果图像
        imshow("全景图像", pano);
        if (waitKey() == 27)
            return 0;
    }

    这里写图片描述
    这里写图片描述
    经过测试,完成对两幅分辨率分别为383*445和363*445的图片的拼接耗时780ms。(测试电脑比较渣,仅参考数量级就好。)

    二、基于SURF的图像拼接

    (也可以采用其他算子进行特征点匹配)

    #include "highgui/highgui.hpp"    
    #include "opencv2/nonfree/nonfree.hpp"    
    #include "opencv2/legacy/legacy.hpp"   
    #include <iostream>  
    
    using namespace cv;
    using namespace std;
    
    void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst);
    
    typedef struct
    {
        Point2f left_top;
        Point2f left_bottom;
        Point2f right_top;
        Point2f right_bottom;
    }four_corners_t;
    
    four_corners_t corners;
    
    void CalcCorners(const Mat& H, const Mat& src)
    {
        double v2[] = { 0, 0, 1 };//左上角
        double v1[3];//变换后的坐标值
        Mat V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
        Mat V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
    
        V1 = H * V2;
        //左上角(0,0,1)
        cout << "V2: " << V2 << endl;
        cout << "V1: " << V1 << endl;
        corners.left_top.x = v1[0] / v1[2];
        corners.left_top.y = v1[1] / v1[2];
    
        //左下角(0,src.rows,1)
        v2[0] = 0;
        v2[1] = src.rows;
        v2[2] = 1;
        V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
        V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
        V1 = H * V2;
        corners.left_bottom.x = v1[0] / v1[2];
        corners.left_bottom.y = v1[1] / v1[2];
    
        //右上角(src.cols,0,1)
        v2[0] = src.cols;
        v2[1] = 0;
        v2[2] = 1;
        V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
        V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
        V1 = H * V2;
        corners.right_top.x = v1[0] / v1[2];
        corners.right_top.y = v1[1] / v1[2];
    
        //右下角(src.cols,src.rows,1)
        v2[0] = src.cols;
        v2[1] = src.rows;
        v2[2] = 1;
        V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
        V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
        V1 = H * V2;
        corners.right_bottom.x = v1[0] / v1[2];
        corners.right_bottom.y = v1[1] / v1[2];
    
    }
    
    int main(int argc, char *argv[])
    {
        Mat image01 = imread("g5.jpg", 1);    //右图
        Mat image02 = imread("g4.jpg", 1);    //左图
        imshow("p2", image01);
        imshow("p1", image02);
    
        //灰度图转换  
        Mat image1, image2;
        cvtColor(image01, image1, CV_RGB2GRAY);
        cvtColor(image02, image2, CV_RGB2GRAY);
    
    
        //提取特征点    
        SurfFeatureDetector Detector(2000);  
        vector<KeyPoint> keyPoint1, keyPoint2;
        Detector.detect(image1, keyPoint1);
        Detector.detect(image2, keyPoint2);
    
        //特征点描述,为下边的特征点匹配做准备    
        SurfDescriptorExtractor Descriptor;
        Mat imageDesc1, imageDesc2;
        Descriptor.compute(image1, keyPoint1, imageDesc1);
        Descriptor.compute(image2, keyPoint2, imageDesc2);
    
        FlannBasedMatcher matcher;
        vector<vector<DMatch> > matchePoints;
        vector<DMatch> GoodMatchePoints;
    
        vector<Mat> train_desc(1, imageDesc1);
        matcher.add(train_desc);
        matcher.train();
    
        matcher.knnMatch(imageDesc2, matchePoints, 2);
        cout << "total match points: " << matchePoints.size() << endl;
    
        // Lowe's algorithm,获取优秀匹配点
        for (int i = 0; i < matchePoints.size(); i++)
        {
            if (matchePoints[i][0].distance < 0.4 * matchePoints[i][1].distance)
            {
                GoodMatchePoints.push_back(matchePoints[i][0]);
            }
        }
    
        Mat first_match;
        drawMatches(image02, keyPoint2, image01, keyPoint1, GoodMatchePoints, first_match);
        imshow("first_match ", first_match);
    
        vector<Point2f> imagePoints1, imagePoints2;
    
        for (int i = 0; i<GoodMatchePoints.size(); i++)
        {
            imagePoints2.push_back(keyPoint2[GoodMatchePoints[i].queryIdx].pt);
            imagePoints1.push_back(keyPoint1[GoodMatchePoints[i].trainIdx].pt);
        }
    
    
    
        //获取图像1到图像2的投影映射矩阵 尺寸为3*3  
        Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC);
        也可以使用getPerspectiveTransform方法获得透视变换矩阵,不过要求只能有4个点,效果稍差  
        //Mat   homo=getPerspectiveTransform(imagePoints1,imagePoints2);  
        cout << "变换矩阵为:\n" << homo << endl << endl; //输出映射矩阵      
    
       //计算配准图的四个顶点坐标
        CalcCorners(homo, image01);
        cout << "left_top:" << corners.left_top << endl;
        cout << "left_bottom:" << corners.left_bottom << endl;
        cout << "right_top:" << corners.right_top << endl;
        cout << "right_bottom:" << corners.right_bottom << endl;
    
        //图像配准  
        Mat imageTransform1, imageTransform2;
        warpPerspective(image01, imageTransform1, homo, Size(MAX(corners.right_top.x, corners.right_bottom.x), image02.rows));
        //warpPerspective(image01, imageTransform2, adjustMat*homo, Size(image02.cols*1.3, image02.rows*1.8));
        imshow("直接经过透视矩阵变换", imageTransform1);
        imwrite("trans1.jpg", imageTransform1);
    
    
        //创建拼接后的图,需提前计算图的大小
        int dst_width = imageTransform1.cols;  //取最右点的长度为拼接图的长度
        int dst_height = image02.rows;
    
        Mat dst(dst_height, dst_width, CV_8UC3);
        dst.setTo(0);
    
        imageTransform1.copyTo(dst(Rect(0, 0, imageTransform1.cols, imageTransform1.rows)));
        image02.copyTo(dst(Rect(0, 0, image02.cols, image02.rows)));
    
        imshow("b_dst", dst);
    
    
        OptimizeSeam(image02, imageTransform1, dst);
    
    
        imshow("dst", dst);
        imwrite("dst.jpg", dst);
    
        waitKey();
    
        return 0;
    }
    
    
    //优化两图的连接处,使得拼接自然
    void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst)
    {
        int start = MIN(corners.left_top.x, corners.left_bottom.x);//开始位置,即重叠区域的左边界  
    
        double processWidth = img1.cols - start;//重叠区域的宽度  
        int rows = dst.rows;
        int cols = img1.cols; //注意,是列数*通道数
        double alpha = 1;//img1中像素的权重  
        for (int i = 0; i < rows; i++)
        {
            uchar* p = img1.ptr<uchar>(i);  //获取第i行的首地址
            uchar* t = trans.ptr<uchar>(i);
            uchar* d = dst.ptr<uchar>(i);
            for (int j = start; j < cols; j++)
            {
                //如果遇到图像trans中无像素的黑点,则完全拷贝img1中的数据
                if (t[j * 3] == 0 && t[j * 3 + 1] == 0 && t[j * 3 + 2] == 0)
                {
                    alpha = 1;
                }
                else
                {
                    //img1中像素的权重,与当前处理点距重叠区域左边界的距离成正比,实验证明,这种方法确实好  
                    alpha = (processWidth - (j - start)) / processWidth;
                }
    
                d[j * 3] = p[j * 3] * alpha + t[j * 3] * (1 - alpha);
                d[j * 3 + 1] = p[j * 3 + 1] * alpha + t[j * 3 + 1] * (1 - alpha);
                d[j * 3 + 2] = p[j * 3 + 2] * alpha + t[j * 3 + 2] * (1 - alpha);
    
            }
        }
    
    }

    这里写图片描述
    这里写图片描述

    展开全文
  • 基于SIFT特征的全景图像拼接(Qt)

    千次下载 热门讨论 2020-07-30 23:32:33
    基于SIFT特征的全景图像拼接(Qt) 主要分为以下几个步骤: (1) 读入两张图片并分别提取SIFT特征 (2) 利用k-d tree和BBF算法进行特征匹配查找 (3) 利用RANSAC算法筛选匹配点并计算变换矩阵 (3) 图像融合 运行前请自己...
  • 图像拼接技术

    千次阅读 2018-09-03 20:13:36
    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,你用你的...
  • 图像拼接算法(zz)

    万次阅读 2018-07-25 20:32:54
    图像拼接算法原理 1: http://planckscale.info/?p=7 http://planckscale.info/?p=84 http://blog.csdn.net/xiaolizi399/article/details/41931809 文章来源(planckscale.info) 360°全景拼接技术简介   核心...
  • matlab图像拼接融合(四种方法)

    万次阅读 多人点赞 2020-10-13 15:47:05
    matlab图像拼接的四种方法 1、直接拼接, 2、亮度调整后拼接, 3、按距离比例融合, 4、亮度调整后按距离比例融合 流程: 1。读入左,右图,并取出重合部分,并转化为亮度图 2。分别把每点的亮度值相加,得到一个...
  • MATLAB 程序 实现图像拼接,自动匹配特征点 将图片拼接成长图,MATLAB 程序 实现图像拼接,自动匹配特征点 将图片拼接成长图MATLAB 程序 实现图像拼接,自动匹配特征点 将图片拼接成长图
  • 1、单张图片拼接 # 图片拼接 from PIL import Image # pil paste可以进行图片拼接 import cv2 import numpy as np path="F:/out/"+str(0)+".jpg" img_out=cv2.imread(path) num=5 for i in ...
  • 图像拼接算法及实现 图像拼接

    热门讨论 2020-07-19 23:34:43
    图像拼接(image mosaic)技术是将一组相互间重叠部分的图像序列进行空间匹配对准,经重采样合成后形成一幅包含各图像序列信息的宽视角场景的、完整的、高清晰的新图像的技术。图像拼接在摄影测量学、计算机视觉、遥感...
  • 序列图像拼接程序

    热门讨论 2020-07-30 23:32:34
    本程序主要针对对平面场景拍摄图像拼接,典型应用就是航拍影像的拼接,投影模型使用了相似变换、仿射变换以及透视模型, 或者前两种和透视投影的组合,优化算法使用LM算法,基本思路是每拼接一副影像便使用LM算法...
  • 图像拼接之MATLAB实现

    万次阅读 多人点赞 2018-11-24 22:31:44
    图像拼接是一项应用广泛的图像处理技术。根据特征点的相互匹配,可以将多张小视角的图像拼接成为一张大视角的图像,在广角照片合成、卫星照片处理、医学图像处理等领域都有应用。早期的图像拼接主要是运用像素值匹配...
  • CV——图像拼接

    2019-03-24 15:31:00
    何谓图像拼接,顾名思义,就是把两张具有重叠区域的图片拼接在一起,形成一个更完整的图片,如下图: 我们把第一个图片和第二个图片拼接起来,形成了第三个图片。 图像拼接步骤 检测特征点 特征点匹配 确定对应...
  • 图像拼接(十三):OpenCV单应变换模型拼接多幅图像 这篇博客中实现了用单应变换模型拼接多幅图像图像拼接使用的OpenCV库函数warpPerspective()。因为这个函数只有在右侧图像变换到左侧图像时才能完整显示,所以...
  • python opencv 图像拼接

    万次阅读 热门讨论 2018-08-21 10:28:50
    高级图像拼接也叫作基于特征匹配的图像拼接拼接时消去两幅图像相同的部分,实现拼接合成全景图。 具有相同尺寸的图A和图B含有相同的部分与不同的部分,如图所示:   用基于特征的图像拼接实现后: 设图像...
  • 图像拼接代码

    热门讨论 2020-07-30 23:32:22
    配置环境:VS2010+OpenCV2.4.9 实现了基本的图像拼接,使用的是OpenCV里面的Stitcher类的各个成员函数,分析了Stitcher类,同时给出了拼接技术的流水线。为要用OpenCV做图像拼接技术的人员提供了一个入门教程。
  • 本博客与以下文档资料一起服用效果更佳。 Stanford University CS 131 Computer Vision: ...多幅图像拼接matlab实现-CSDN下载 开始正文。梳理一下本篇博客图像拼接的原理: 特征检测:SIFT角点检测 特征描述:SIFT描述
  • 图像处理之图像拼接(python)

    千次阅读 2019-06-22 14:02:04
    要实现两张图片的简单拼接,其实只需找出两张图片中相似的点 (至少四个,因为 homography 矩阵的计算需要至少四个点,此内容在上一篇中讲过), 计算一张图片可以变换到另一张图片的变换矩阵 (homography 单应性矩阵)...
  • 图像拼接源代码

    2020-07-30 23:30:32
    图像拼接原代码,VC++,图像拼接在制作全景图的过程中具有重要作用。对多幅图像进行特定模式投影后,用约束的相位相关度法求取水平垂直偏移量,然后寻找最佳缝合线,实现图像拼接,最后采用多分辨率算法对全图进行...
1 2 3 4 5 ... 20
收藏数 89,154
精华内容 35,661
关键字:

图像拼接