python计算机视觉编程——全景拼接

本文介绍了Python中实现图像拼接的过程,包括利用APAP算法进行图像配准,使用最大流最小割寻找拼接裂缝,以及通过multi-band blending实现图像融合。详细探讨了每个步骤的关键技术和挑战,如特征匹配、RANSAC算法、拉普拉斯金字塔融合,并通过实验展示了不同数据集的拼接效果。

一、图像拼接

1.1什么是图像拼接

图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图,图像拼接技术涉及到计算机视觉、计算机图形学、数字图像处理以及一些数学工具等技术。图像拼接其基本步骤主要包括以下几个方面:摄相机的标定、传感器图像畸变校正、图像的投影变换、匹配点选取、全景图像拼接(融合),以及亮度与颜色的均衡处理等方面。这篇博文主要从后期处理,即匹配点选取和具体的全景拼接技术的实现来论述。

1.2图像拼接的用到的技术支持

在以前的博文中有有关sift特征匹配算法,这里不再过多赘述。这次将其应用到图像的全景拼接上,根据特征点匹配的方式,则利用这些匹配的点来估算单应矩阵(使用以前博文中提到的RANSAC算法(该算法用于优化sift算法减少错误的特征匹配),也就是把其中一张通过个关联性和另一张匹配的方法。通过单应矩阵H,可以将原图像中任意像素点坐标转换为新坐标点,转换后的图像即为适合拼接的结果图像。
可以简单分为以下几步:
1.根据给定图像/集,实现特征匹配。
2.通过匹配特征计算图像之间的变换结构。
3.利用图像变换结构,实现图像映射。
4.针对叠加后的图像,采用APAP之类的算法,对齐特征点。(图像配准)
5.通过图割方法,自动选取拼接缝。
6.根据multi-band blending策略实现融合。

根据以上的全景拼接用到的方法赘述,除了我以前博文中有介绍过的有关特征匹配图像变换的知识点以外,这次的重点技术介绍是有关图像配准的,即如何将两张特征匹配后相似度很高的图像对齐特征点进行叠加拼接,通过某种方法找到两张图片的拼接裂缝,使其很好的融合,再通过multi-band blending的方法对图像拍摄时产生的不同曝光度对拼接后的图像进行处理,使拼接后的图像在人眼视觉效果上更加柔和。

1.2.1 APAP算法

图像配准是对图像进行变换,使变换后的图像能够在常见的坐标系中对齐。为了能够进行图像对比和更精细的图像分析,图像配准是一步非常重要的操作。这里主要用到的算法为APAP算法。
这边引用了csdn中有关博主对于APAP算法的解读,我觉得有助于理解该算法的基本流程和实现。

https://blog.youkuaiyun.com/warrenwg/article/details/49759779

基本步骤:
1.提取两张图片的sift特征点
2.对两张图片的特征点进行匹配,匹配的过程引用了论文(Distinctive Image Features from Scale-Invariant Keypoints)
3.匹配后,仍有很多错误点,此时使用论文(Accelerated Hypothesis Generation for Multi-Structure Robust Fitting)提到的RANSAC的改进算法进行特征点对的筛选。筛选后的特征点基本能够一一对应。
4.使用DLT算法(Multiple View Geometry p92提到),将剩下的特征点对进行透视变换矩阵的估计。
5.因为得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块的变换矩阵逐一估计
Apap虽然能够较好地完成配准,但非常依赖于特征点对,存在局限性。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量

1.2.2 用最大流最小割找拼接裂缝

作为解决图论问题的经典方法,我完全没想到这个方法可以用在图像处理的拼接问题上,即图割。以下这篇博文在我看来整理的非常通俗易懂,推荐参考。
最大流最小割

1.2.3 multi-band blending实现图像融合

在图像拼接过程中,根据所采集的样本在拍照角度和曝光度上的不同,会导致拼接后的图像灰度情况层次不齐,虽然在视觉效果上拼接后的图片很好的重合,但是人眼感受到的拼接带来的光效痕迹还是过于明显,所以需要特定的处理解决这种不自然。那么这时候可以采用blending方法。multi-band blending(多波段融合又称为拉普拉斯金字塔融合)是目前图像融和方面比较好的方法,人们可以通过这种方法较好的融合样本图像,即通俗而言的毫无PS痕迹。
在这里插入图片描述
多波段融合的思想是对待融合的图像分别构建拉普拉斯金字塔,(拉普拉斯算子可以提取出图像的高频信息,在拉普拉斯金字塔中,越往上层的图像越高频)然后对同一层图像按照某种规则融合,一般是Alpha blending/Feathering;对于不同层图像(不同频率段的图像)进行不同规则的融合,高频部分blend slowly,低频部分blend quickly;
基本步骤:

1.根据图像A和B建立拉普拉斯金字塔LA和LB;

2.从选择蒙版M中建立高斯金字塔GM;

3.使用GM的节点作为权重,从LA和LB组成金字塔金字塔LS:

LS = GM * LA +(1-GM)* LB

4.折叠LS金字塔以获得最终的融合图像

这里我参考了一篇详细论述拉普拉斯金字塔融合的博文,推荐参考阅读。
https://blog.youkuaiyun.com/u014485485/article/details/89516028

下面开始测试拼接吧。

1.3用python完成简单的图像拼接

1.3.1实验代码


# -*- coding: utf-8
from pylab import *
from numpy import *
from PIL import Image
from scipy.spatial import Delaunay
# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift


featname = [ 'E:/thirddown/computervision/data/ransac/AP/1/'+ str(i + 1) + '.sift' for i in range(5)]
imname 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值