刘洪江,曹玉香,李佳,梅锋,方爱,季维虎
(1.杭州市勘测设计研究院,浙江 杭州 310012; 2.浙江工商大学公共管理学院,浙江 杭州 310018;3.杭州市钱投集团科技与数信部,浙江 杭州 310016)
随着无人机技术的发展,无人机遥感已在众多行业得到广泛应用。在新型测绘与智慧城市建设领域,无人机航摄正发挥越来越重要的作用,尤其在防灾减灾、应急救援、自然资源监测、三维城市重建等领域取得重要进展。目前实际应用中,航空正射影像的制作方式主要是借助摄影测量影像处理系统在数字高程模型的辅助下将航拍序列影像制作正射影像,或者利用多种软件与地形图辅助制作正射影像[1],制作周期长,自动化程度低,无法满足应急需要。
近年来,国内外对无人机影像快速拼接技术的研究很多,但多数局限在算法本身的研究和优化。业界也推出了很多优秀的无人机倾斜摄影处理软件,如Smart3D、PhotosSan、Pix4D等。这些软件在三维建模方面性能优异,能很好地实现无人机影像快速拼接。快速影像生产制作程序繁多、流程复杂,不够便捷,而且价格昂贵。针对影像快速拼接单一任务需求的轻量化的软件工具并不多见,所以在快速影像生产,尤其是应急测绘影像生产中瓶颈凸显。
单幅影像通常无法覆盖航摄测区范围,因此大范围影像生产需要对多幅影像进行镶嵌、拼接[6]。通过研究影像快速拼接技术,可以获得宽视域、高分辨率的图像[2],基于OpenCV图像处理技术及其丰富的算法,可以高效率解决无人机影像快速拼接的问题。本文在OpenCV算法库的基础上,采用Python开发语言,围绕无人机影像的特征检测与匹配、单应性矩阵计算、图像透视变换、重叠区域图像融合等问题进行研究和试验,实现了影像的快速、高效、自动化拼接。
OpenCV是基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它具备轻量且高效的特点——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法[3]。OpenCV采用C语言进行优化,而且在多核计算机上面,其运行速度会更快。近年在图像识别、图像分割、图像匹配、机器视觉等领域取得了广泛的应用。
图像拼接是将处于同一场景的多张图像之间建立对应关系[4],关键是图像匹配。目前基于无人机获取的图像,拼接主要采用2种方法:一是利用无人机POS数据对影像进行拼接,由于无人机自身因素和气流的影响,一般无法得到较为精确的飞行姿态;第二种方法是采用基于图像区域特征的匹配[5]。SIFT算法是一种典型的基于特征的图像匹配方法,应用领域很广。SIFT算法首先通过预处理对图像进行去噪以及修正,然后利用高斯差分函数构造多尺度空间,在不同尺度空间影像上检测具有方向信息的局部极值点,最后将极值点精确定位,去除不稳定的点,根据极值点临近像素,生成特征描述子,再进行归一化处理[4]。由于SIFT算法能够解决图像平移、方向及角度改变、光照改变等问题,无人机在不同时间、不同角度拍摄两幅或多幅含有重叠区域的图像,依旧可以获得较好的拼接效果[2],所以在处理无人机影像匹配中应用较多。
OpenCV计算机视觉库对SIFT算法有着很好的支持,尤其是到了3.0以后,OpenCV对SIFT特征提取进行了系统性的重构,简化了SIFT算法功能的调用,其代码背后的理论和代码实现的技术以及各种提升速度和效率的方法对图像处理的应用具有很大的帮助。opencv-python3.4.2以后的版本,SIFT算法包申请了专利保护,不能正常使用,所以安装opencv-python时要选择3.4.2以前的版本。
无人机影像拼接的第一步就是特征点提取。OpenCV视觉库有很多特征点的定义,比如sift、surf、harris角点、ORB等,它们各有优势。采用SIFT特征来实现图像拼接比较常用,尽管计算量大,但其稳定性和精确度都很好。
OpenCV Python中SIFT特征点检测,是通过建立SIFT生成器,检测SIFT特征点并描述算子来实现。
descriptor=cv2.xfeatures2d.SIFT_create()
(kps,features)=descriptor.detectAndCompute(gray,None)
获得图像的特征点向量集合以后,就需要对特征点进行匹配,即图像A中的特征点,根据其欧式距离的相似度,寻找图像B中对应的特征点。图像的特征点数目很多,因此SIFT算法中采用了kd-tree的数据结构,降低了时间复杂度,大大提高了特征点搜索的效率。
匹配完成后,还应根据一定的规则(如最近欧式距离与次近欧式距离的比值)进行筛选,以选取优秀的匹配点。
matcher=cv2.BFMatcher()
rawMatches=matcher.knnMatch(featuresA,featuresB,2)
matches=[]
for m in rawMatches:
iflen(m) == 2 and m[0].distance < m[1].distance*ratio:
matches.append((m[0].trainIdx,m[0].queryIdx))
得到了两幅待拼接图的匹配点集后,接下来就要进行图像的配准,即将两张图像转换为同一坐标系下。这时需要使用OpenCV的findHomography函数来求单应性变换矩阵。需要注意的是,findHomography函数所要用到的点集是float32类型的,所以需要对得到的点集再作一次处理,将其转换为float32类型的点集。
单应性变换矩阵的计算,需要继续筛选可靠的匹配点,使得匹配点更为精确。当有效数据比无效数据要少的时候,最小二乘法就失效。因此本文采用RANSAC算法,即Random Sample Consensus (随机一致性采样)。RANSAC算法是随机选择几个点,用一个函数去拟合这几个点,给定一个σ,统计出在σ范围之内的点的个数,也就是统计这个拟合函数的误差率,当误差率小于一定值的时候停止迭代。
ptsA=np.float32([kpsA[i] for (_,i) in matches])
ptsB=np.float32([kpsB[i] for (i,_) in matches])
(H,status)=cv2.findHomography(ptsA,ptsB,cv2.RANSAC,reprojThresh)
最后是对采用单应性变换矩阵对右图像进行透视变换,计算右图像像素点在左图像中的坐标,生成配准图像。
result=cv2.warpPerspective(imageB,H,(imageA.shape[1] + imageB.shape[1],imageA.shape[0]))
简单的图像拼接方法,是直接将左图像拷贝到配准图像。但是两幅影像的拼接会不自然,原因在于拼接图的交界处,两幅图像因为光照色泽、匹配精度的原因使得过渡很不均匀,所以需要进行特定的处理。本文采用的思路是加权融合,即在图像的重叠区域将像素值按一定的权值融合成新的图像。
result[0:imageA.shape[0],0:x]=imageA[:,:x]
rows,right_col=imageA.shape[:2]
forcol in range(x,right_col):
forrow in range(rows):
if result[row,col,0]==0 and result[row,col,0]==0 and result[row,col,0]==0:
alpha=1.0
else:
alpha=((right_col-x)-(col-x))/float(right_col-x)
result[row,col]=imageA[row,col]*alpha+result[row,col]*(1-alpha)
注:x,right_col是重叠区的左右边界。
本文以无人机航拍的照片为例进行试验分析。像幅为 5 472×3 648,焦距 8.8 cm,感应器尺寸 13.2 mm,如图1所示。
图1 无人机航拍图像
特征点提取中,创建SIFT的SIFT_create函数有一个参数nfeatures,它是确定返回特征点的个数。因为无人机航拍影像分辨率非常高,特征点数量巨大,会大大影响后续的特征点匹配效率,甚至导致系统崩溃。所以需要对返回的特征点数进行限定,经试验比较,nfeatures=2 500时,不会影响图像匹配的效果。特征点匹配情况如图2所示。
图2 特征点匹配
根据匹配点计算出两张图像重叠区域的单应性转换矩阵,并由转换矩阵对右图像进行透视变换,计算出其在左图像坐标系中的坐标,如图3所示。
图3 图像配准
最后是图像的融合。简单的融合,把左图像拷贝到配准图像即可,但在接缝处会出现明显的色差。而且因为匹配精度的原因,会出现纹理错位的情况,如图4所示。如果采用加权融合,就能很好地避免这个问题。需要指出的是,加权融合是在重叠区域内逐个像素进行比较和计算,对图像拼接处理的效率会有较大影响。采用加权融合后,航片拼接的结果如图5、图6所示。
图4 图像融合
图5 图像加权融合
图6 图像拼接结果
整体测区的图像拼接结果如图7所示。本文研究的方法基本能满足小区域图像快速拼接,并快速制作整体影像成果。其优点是便捷、轻量,能根据需求量身定制,避免购买昂贵商业软件,缺点是不能实现高效率、高精度正射影像的制作。
图7 整体测区拼接结果
本文以OpenCV计算机视觉库和SIFT算法为基础,采用Python开发语言,对无人机航拍影像的拼接技术进行了研究和试验,取得了较好的结果,在实际生产中得到了应用。但是本文没有将这一拼接技术在不同测区进行试验比较,所以在建筑物密集区域或大面积植被、水域分布的区域,拼接效果如何还需要进一步研究。另外,由于受无人机航拍时的稳定性、飞行姿态的影响,航拍图像会有较大的变形,而拼接影像没有经过地面控制和正射纠正处理,其精度怎样也有待进一步评估。