精华内容
下载资源
问答
  • 图像拼接

    2021-04-25 21:02:25
    图像拼接图像拼接基于Stitcher类的图像拼接1源码:https://docs.opencv.org/2.4.2/modules/stitching/doc/high_level.html?highlight=stitcher#stitcher2基于SURF算法的特征点检测代码运行的样例图:图像拼接结果 ...

    图像拼接

    图像拼接是将两张或两张以上、且两两图像之间具有相同的特征点的图像通过特征匹配拼接在一起。手机上照相机的全景照相就是图像拼接的一个应用

    基于Stitcher类的图像拼接

    1源码:https://docs.opencv.org/2.4.2/modules/stitching/doc/high_level.html?highlight=stitcher#stitcher

    2基于SURF算法的特征点检测

    在源码中,特征点检测的默认设置第一选择是SURF,第二是ORB特征点检测。先对图一进行特征点提取和筛选匹配,再对图二进行该操作,这样可以保证更多的匹配点被选中。

    SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,SURF算法要比SIFT算法更高效。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。
    2.1特征点检测:SURF使用Hessian矩阵来检测特征点,该矩阵是x,y方向的二阶导数矩阵,可测量一个函数的局部曲率,其行列式值代表像素点周围的变化量,特征点需取行列式值的极值点。用方型滤波器取代SIFT中的高斯滤波器,利用积分图(计算位于滤波器方型的四个角落值)大幅提高运算速度。

    2.2特征点定位:通过特征点邻近信息插补来定位特征点。

    2.3方向定位:通过计算特征点周围像素点x,y方向的哈尔小波变换,并将x,y方向的变换值在xy平面某一角度区间内相加组成一个向量,在所有的向量当中最长的(即x、y分量最大的)即为此特征点的方向。

    2.4特征描述子:选定了特征点的方向后,其周围相素点需要以此方向为基准来建立描述子。此时以55个像素点为一个子区域,取特征点周围2020个像素点的范围共16个子区域,计算子区域内的x、y方向(此时以平行特征点方向为x、垂直特征点方向为y)的哈尔小波转换总和Σdx、ΣdyΣdx、Σdy与其向量长度总和Σ|dx|、Σ|dy|Σ|dx|、Σ|dy|共四个量值,共可产生一个64维的描述子。
       3.对图像特征点进行匹配,使用最近邻和次近邻方法,将两个最优的匹配的置信度保存下来。

    4.对图像进行排序以及将置信度高的图像保存到同一个集合中,删除置信度比较低的图像间的匹配,得到能正确匹配的图像序列。这样将置信度高于门限的所有匹配合并到一个集合中。

    5.对所有图像进行相机参数粗略估计,然后求出旋转矩阵

    6.使用光束平均法进一步精准的估计出旋转矩阵。

    7.波形校正,水平或者垂直

    由于拍摄照片的时候角度不一定是相同的,所以拼接起来的照片会使全景图出现“飞机曲线”,因此要对图像进行波形矫正,主要是寻找每幅图形的“上升向量”,使它矫正成.

    8.拼接

    9.融合,多频段融合,光照补偿

    由于拍照的时候角度光线等原因,会使图片的亮度不同,因此需要对图像进行光照补偿,将对应区域乘以一个值。

    代码

    import os
    import sys
    import cv2
    import cv2 as cv
    
    def imgstitcher(imgs):  # 传入图像数据 列表[] 实现图像拼接
        stitcher = cv2.Stitcher.create(cv2.Stitcher_PANORAMA)
        _result, pano = stitcher.stitch(imgs)
    
        if _result != cv2.Stitcher_OK:
            print("不能拼接图片, error code = %d" % _result)
            sys.exit(-1)
    
        output = 'result' + '.png'
        cv2.imwrite(output, pano)
        print("拼接成功. %s 已保存!" % output)
    
    if __name__ == "__main__":
        # imgPath为图片所在的文件夹相对路径
        imgPath = 'C:/Users/rao/Desktop/img'
    
        imgList = os.listdir(imgPath)
        imgs = []
        for imgName in imgList:
            pathImg = os.path.join(imgPath, imgName)
            img = cv2.imread(pathImg)
            if img is None:
                print("图片不能读取:" + imgName)
                sys.exit(-1)
            imgs.append(img)
    
        imgstitcher(imgs)  # 拼接
    
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    
    

    运行的样例图:

    在这里插入图片描述

    图像拼接结果

    在这里插入图片描述
    因为相机和光照强度的差异,会造成一幅图像内部,以及图像之间亮度的不均匀,拼接后的图像会出现明暗交替,这样给观察造成极大的不便。室外场景的拼接效果比室内的要好很多,多图拼接对图片的要求也比较高,差异性大或太小的拼接效果都很差。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,168
精华内容 2,067
关键字:

图像拼接