【计算机视觉】图片拼接

本文介绍了图像拼接技术,包括图像配准和融合的关键性,以及RANSAC和APAP算法在图像拼接中的作用。RANSAC算法用于去除异常数据,APAP算法解决拼接后的‘鬼影’问题,提高配准精度。通过实例展示了图像拼接的流程,包括特征匹配、变换矩阵估计、图像映射和融合等步骤。尽管APAP算法对特征点对数量敏感,但在适当场景下能实现较好的拼接效果。
摘要由CSDN通过智能技术生成

一、图像拼接介绍

图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。图像拼接在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。图像拼接的输出是两个输入图像的并集。
图像配准(image alignment)和图像融合是图像拼接的两个关键技术。图像配准是图像融合的基础,而且图像配准算法的计算量一般非常大,因此图像拼接技术的发展很大程度上取决于图像配准技术的创新。早期的图像配准技术主要采用点匹配法,这类方法速度慢、精度低,而且常常需要人工选取初始匹配点,无法适应大数据量图像的融合。图像拼接的方法很多,不同的算法步骤会有一定差异,但大致的过程是相同的。

二、图像的拼接几何原理

在这里插入图片描述
在这里插入图片描述

三、图像的拼接基础流程

1.针对某个场景拍摄多张/序列图像
2.计算第二张图像与第一张图像之间的变换关系
3.将第二张图像叠加到第一张图像的坐标系中
4.变换后的融合/合成
5.在多图场景中,重复上述过程

四、RANSAC算法

随机抽样一致算法(random sample consensus,RANSAC),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。
RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。

计算步骤:
1.随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;
2.计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;
3. 如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;
4.如果迭代次数大于k,则退出 ; 否则迭代次数加1,并重复上述步骤;
注:迭代次数k在不大于最大迭代次数的情况下,是在不断更新而不是固定的,见上方k的更新;其中,p为置信度,一般取0.995;w为”内点”的比例 ; m为计算模型所需要的最少样本数=4;求得单应矩阵后就好办了,把内点留下,内点就是筛选后的好用的点,外点舍弃,外点就有可能是误匹配的点。

5、APAP算法

在图像拼接融合的过程中,受客观因素的影响,拼接融合后的图像可能会存在“鬼影现象”以及图像间过度不连续等问题。下图就是图像拼接的一种“鬼影现象”。通过上面RANSAC方法可以消除异常匹配的特征点的问题,但是匹配后得到的图像会出现“鬼影”问题,所谓鬼影问题就是图像叠加后出现重影。解决办法就是局部单应性变换。解决鬼影现象可以采用APAP算法。
在这里插入图片描述

算法流程:
1.提取两张图片的sift特征点
2.对两张图片的特征点进行匹配
3.匹配后,使用RANSAC算法进行特征点对的筛选,排除错误点。筛选后的特征点基本能够一一对应
4.使用DLT算法,将剩下的特征点对进行透视变换矩阵的估计
5.由于得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块进行单应性矩阵变换,非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。

6、选择合适的算法进行图像拼接操作

图像拼接的基本流程如下:
1.根据给定图像/集,实现特征匹配
2.通过匹配特征计算图像之间的变换结构
3.利用图像变换结构,实现图像映射
4.针对叠加后的图像,采用APAP之类的算法,对齐特征点
5.通过图割方法,自动选取拼接缝
6.根据multi-band bleing策略实现融合(思想:采用的方法是直接对带拼接的两个图片进行拉普拉斯金字塔分解,后一半对前一半进行融合。)

测试代码:
注:运行代码可能会发生错误,错误详情及解决办法如下:
https://blog.csdn.net/weixin_42648848/article/details/88667243

from pylab import *
from numpy import *
from PIL import Image
# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
"""
This is the panorama example from section 3.3.
"""
# set paths to data folder
featname = [str(i + 1) + '.sift' for i in range(3)]
imname = [str(i + 1) + '.jpg' for i in range(3)]
# extract features and match
l = {}
d = {}
for i in range(3):
    sift.process_image(imname[i],featname[i])
    l[i],d[i] = sift.read_features_from_file(featname[i])
matches = {}
for i in range(2):
    matches[i] = sift.match(d[i+1],d[i])
    print(matches)
# visualize the matches (Figure 3-11 in the book)
for i in range(2):
    im1 = array(Image.open(imname[i]))
    im2 = array(Image.open(imname[i+1]))
    figure()
    sift.plot_matches(im2,im1,l[i+1],l[i],matches[i],show_below=True)
# function to convert the matches to hom. points
def convert_points(j):
    ndx = matches[j].nonzero()[0]
    fp = homography.make_homog(l[j+1][ndx,:2].T)
    ndx2 = [int(matches[j][i]) for i in ndx]
    tp = homography.make_homog(l[j][ndx2,:2].T)
    # switch x and y - TODO this should move elsewhere
    fp = vstack([fp[1],fp[0],fp[2]])
    tp = vstack([tp[1],tp[0],tp[2]])
    return fp,tp
# estimate the homographies
model = homography.RansacModel()
fp,tp = convert_points(0)
H_01 = homography.H_from_ransac(fp,tp,model)[0] #im 0 to 1
tp,fp = convert_points(1) #NB: reverse order
H_21 = homography.H_from_ransac(fp,tp,model)[0] #im 2 to 1
# warp the images
delta = 2000 # for padding and translation
im1 = array(Image.open(imname[0]), "uint8")
im2 = array(Image.open(imname[1]), "uint8")
im_01 = warp.panorama(H_01,im1,im2,delta,delta)
im1 = array(Image.open(imname[2]), "f")
im_21 = warp.panorama(H_21,im1,im_01,delta,delta)
figure()
imshow(array(im_21, "uint8"))
axis('off')
savefig("result.png",dpi=300)
show()

运行结果

1.原图(定点多角度拍摄)
在这里插入图片描述

请添加图片描述

请添加图片描述
请添加图片描述
1.原图(平移拍摄)
在这里插入图片描述
在这里插入图片描述

从运行结果来看,拼接图像基本对齐,但中间图片存在拼接缝,由于景深不同,拍摄的景物过多,图片的曝光程度不同导致的,因为曝光参数的不同,导致拼接后的全景图可以明显的看出明暗差异。也可能是因为图像景深的复杂程度导致的,使得算法在匹配时得到的特征点对不是很多,导致匹配拼接的结果差。但综合来说效果还是比较好的。
总体来说,用 Apap算法对景深落差小的图像进行拼接,能够有比较好的拼接效果;但Apap算法十分依赖特征点对,当图像高频信息较少,特征点对过少时,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好。所以特征点对的数量是决定 Apap算法效果的一个重要因素。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打代码能当饭吃?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值