本文目录

  • RANSAC原理
  • RANSAC假设
  • RANSAC示例
  • RANSAC概述
  • RANSAC思路
  • APAP
  • multi-band bleing
  • RANSAC图像拼接
    • 拼接原理
    • 整体流程
    • 实现代码
    • 实验小结

RANSAC原理

在此之前的博客里面,我们学会了SIFT匹配算法

然而因为在匹配时由于图片原因,很可能会出现部分错配现象,应该采用少数服从多数,剔除掉这些少数不合适的点。

对于普通最小二乘法来说是保守派:
在现有数据下,如何实现最优。是从一个整体误差最小的角度去考虑,尽量谁也不得罪。

对于RANSAC来说是改革派:
首先假设数据具有某种特性(目的),为了达到目的,适当割舍一些现有的数据。

RANSAC是“RANdom SAmple Consensus”(随机一致性采样)的缩写,它于1981年由Fischler和Bolles最先提出。该方法是用来找到正确模型来拟合带有噪声数据的迭代方法。给定一个模型,例如点集之间 的单应性矩阵,RANSAC 基本的思想是,数据中包含正确的点和噪声点,合理的模型应该能够在描述正确数据点的同时摒弃噪声点。

RANSAC算法(随机采样一致)原本是用于数据处理的一种经典算法,其作用是在大量噪声情况下,提取物体中特定的成分。下图是对RanSaC算法效果的说明。图中有一些点显然是满足某条直线的,另外有一团点是纯噪声。目的是在大量噪声的情况下找到直线方程,此时噪声数据量是直线的3倍。

给出最小二乘拟合(红线)、RANSAC(绿线)对于一阶直线、二阶曲线的拟合对比:

可以看到RANSAC可以很好的拟合。RANSAC可以理解为一种采样的方式,所以对于多项式拟合、混合高斯模型(GMM)等理论上都是适用的。

RANSAC假设

(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

RANSAC示例

一个简单的例子是从一组观测数据中找出合适的2维直线。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反,RANSAC能得出一个仅仅用局内点计算出模型,并且概率还足够高。但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的参数。

RANSAC概述

RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。
RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
5.最后,通过估计局内点与模型的错误率来评估模型。
这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

RANSAC思路

随机选择四对匹配特征
根据DLT计算单应矩阵 H (唯一解)
对所有匹配点,计算映射误差ε= ||pi’, H pi||
根据误差阈值,确定inliers(例如3-5像素)
针对最大inliers集合,重新计算单应矩阵 H

1.在给定若干二维空间中的点,求直线 y=ax+b ,使得该直线对空间点的拟合误差最小。

2.随机选择两个点,根据这两个点构造直线,再计算剩余点到该直线的距离
给定阈值(距离小于设置的阈值的点为inliers),计算inliers数量

3.再随机选取两个点,同样计算inliers数量

4.循环迭代,其中inliers最大的点集即为最大一致集,最后将该最大一致集里面的点利用最小二乘拟合出一条直线。

APAP

在图像拼接融合的过程中,受客观因素的影响,拼接融合后的图像可能会存在“鬼影现象”以及图像间过度不连续等问题。下图就是图像拼接的一种“鬼影现象”。解决鬼影现象可以采用APAP算法。

算法流程:
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虽然能够较好地完成配准,但非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。

multi-band bleing

在找完拼接缝后,由于图像噪声、光照、曝光度、模型匹配误差等因素,直接进行图像合成会在图像重叠区域的拼接处出现比较明显的边痕迹。

这些边痕迹需要使用图像融合算法来消除。这里介绍一种方法—multi-band bleing
思想:采用的方法是直接对带拼接的两个图片进行拉普拉斯金字塔分解,后一半对前一半进行融合。
步骤:
首先计算当前待拼接图像和已合成图像的重叠部分。并对图像A、B 重叠部分进行高斯金字塔和拉普拉斯金字塔分解

G0为原始图像,G1表示对G0做reduce操作。Reduce操作定义如下:

对G1进行扩展后与G0相减,可以得到拉普拉斯金字塔的第一层L0。同理,拉普拉斯金字塔的L2、L3等层也可以按照这种方法来计算。
两幅图像的融合过程:分别构建图像A、B的高斯金字塔和拉普拉斯金字塔,然后进行加权融合。
对加权后的拉普拉斯金字塔进行重构

RANSAC图像拼接

在同一位置(即图像的照相机位置相同)拍摄的两幅或者多幅图像是单应性(即从一个平面到另一个平面的投影映射)相关的。使用该约束将图片缝补起来,拼成一个大图像来创建全景图像,本次试验基于sift算子的特征点匹配和ransac算法估计单应性矩阵。

拼接原理

图像的全景拼接包括:特征点提取与匹配、图像配准、图像融合。

1、基于SIFT的特征点的提取与匹配
利用Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。
2、图像配准
图像配准是一种确定待拼接图像间的重叠区域以及重叠位置的技术,它是整个图像拼接的核心。本节采用的是基于特征点的图像配准方法,即通过匹配点对构建图像序列之间的变换矩阵,从而完成全景图像的拼接。
3、图像融合
因为相机和光照强度的差异,会造成一幅图像内部,以及图像之间亮度的不均匀,拼接后的图像会出现明暗交替,这样给观察造成极大的不便。 亮度与颜色均衡处理,通常的处理方式是通过相机的光照模型,校正一幅图像内部的光照不均匀性,然后通过相邻两幅图像重叠区域之间的关系,建立相邻两幅图像之间直方图映射表,通过映射表对两幅图像做整体的映射变换,最终达到整体的亮度和颜色的一致性

整体流程

1、根据给定图像/集,实现特征匹配
2、通过匹配特征计算图像之间的变换结构
3、利用图像变换结构,实现图像映射
4、针对叠加后的图像,采用APAP之类的算法,
5、对齐特征点
6、通过图割方法,自动选取拼接缝
7、根据multi-band bleing策略实现融合

为了提高图像配准的精度,本节采用RANSAC算法对图像变换矩阵进行求解与精炼,达到了较好的图像拼接效果。
首先随机地选择两个点,这两个点确定了一条直线,并且称在这条直线的一定范围内的点为这条直线的支撑。这样的随机选择重复数次,然后,具有最大支撑集的直线被确认为是样本点集的拟合。在拟合的误差距离范围内的点被认为是内点,它们构成一致集,反之则为外点。
可以很快判断,如果只有少量外点,那么随机选取的包含外点的初始点集确定的直线不会获得很大的支撑,值得注意的是,过大比例的外点将导致RANSAC算法失败。在直线拟合的例子中,由点集确定直线至少需要两个点;而对于透视变换,这样的最小集合需要有4个点。

实现代码

在这里给出python主程序代码,我使用的版本为python2.7,若是python3的版本还需要调整一些相关的包的导入和代码形式。

# -*- coding: utf-8 -*-
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 = ['image3/c'+str(i+1)+'.sift' for i in range(5)] #图片路径记得修改
imname = ['image3/c'+str(i+1)+'.jpg' for i in range(5)]# extract features and match
l = {}
d = {}
for i in range(5): sift.process_image(imname[i],featname[i])l[i],d[i] = sift.read_features_from_file(featname[i])matches = {}
for i in range(4):matches[i] = sift.match(d[i+1],d[i])# visualize the matches (Figure 3-11 in the book)
for i in range(4):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 elsewherefp = 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(1)
H_12 = homography.H_from_ransac(fp,tp,model)[0] #im 1 to 2 fp,tp = convert_points(0)
H_01 = homography.H_from_ransac(fp,tp,model)[0] #im 0 to 1 tp,fp = convert_points(2) #NB: reverse order
H_32 = homography.H_from_ransac(fp,tp,model)[0] #im 3 to 2 tp,fp = convert_points(3) #NB: reverse order
H_43 = homography.H_from_ransac(fp,tp,model)[0] #im 4 to 3    # warp the images
delta = 2000 # for padding and translationim1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12,im1,im2,delta,delta)im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12,H_01),im1,im_12,delta,delta)im1 = array(Image.open(imname[3]), "f")
im_32 = warp.panorama(H_32,im1,im_02,delta,delta)im1 = array(Image.open(imname[4]), "f")
im_42 = warp.panorama(dot(H_32,H_43),im1,im_32,delta,2*delta)figure()
imshow(array(im_42, "uint8"))
axis('off')
savefig("example1.png",dpi=300)
show()

室外场景(集美大学):


拼接后:

室内场景(嘉庚图书馆内部):


拼接后:

室内场景:书桌(失败案例)
拼接前

拼接后

上面这两张是在书桌拍摄的,可以发现完全匹配方向错误,可能是由于图片质量导致匹配不精确,也可能是图片没有按照顺序摆放,导致读入出现错误。

对于这组图片测试过程中,会出现以下报错

RuntimeWarning: invalid value encountered in less

估计是由于图片本身格式大小的原因。而下面的这个错误提示我们遇到了无效值

divide by zero encountered in true_divide

这个方法可以用通过导入numpy库里的方法来解决

import numpy as npnp.seterr(divide='ignore', invalid='ignore')

实验小结

室内外情况对比

1、通过室内外的对比我们可以看到,在室外,受到光线影响,景像拼接容易出现重影,而在景象光滑区域,比如在室内拼接的图片,书本和桌面背景光滑区,sift特征匹配无法对边缘光滑的目标准确提取特征点,图像拼接出现裂痕。

2、本文分别针对室内和室外两种情况对两张图像做全景拼接,发现室内情况下拼接的效果较为好。
基于RANSAC算法的图像拼接存在的问题可以从上面的拼接结果看出来,不同图像之间的连接部分出现不连贯以及由于图像曝光不同而出现的边缘效应的情况。
而且还可以看出RANSAC算法只是将图像进行简单的扭曲(从矩形变成四边形),导致图像拼接得非常生硬。

RANSAC及图像拼接上的应用相关推荐

  1. RANSAC算法在图像拼接上的应用的实现

        关于算法原理请参考<基于SURF特征的图像与视频拼接技术的研究>. 一.问题提出         RANSAC的算法原理并不复杂,比较复杂的地方在于"建立模型" ...

  2. 全景图像拼接【计算机视觉】

    文章目录 一.全景图像拼接 1.1基本介绍 1.2原理解析 1.3 RANSAC算法(RANdom SAmple Consensus,RANSAC) 1.3 图像配准 1.4 APAP算法 1.5 图 ...

  3. 利用python语言实现多张图像拼接

    目录 图像映射与全景拼接 图像拼接基本流程 1.基础流程 2.计算图像间的变换结构 图像拼接相关原理 1.2D图像变换原理 2.特征点错误匹配干扰 3.APAP算法 4.RANSAC方法图像拼接 算法 ...

  4. 计算机视觉-全景图像拼接

    目录 1.全景拼接 2.RANSAC算法 3.图像配准 4.图割方法 5.图像融合 6.APAP算法 7.代码实现 1.全景拼接 将SIFT应用到图像拼接上,根据特征点匹配的方式,则利用这些匹配的点来 ...

  5. 长篇自动驾驶技术综述论文(上)

    长篇自动驾驶技术综述论文(上) A Survey of Autonomous Driving: Common Practices and Emerging Technologies Ekim Yurt ...

  6. 计算机视觉--图像的拼接融合

    计算机视觉--图像的拼接融合 一.全景图像拼接原理介绍 1.1 背景介绍 1.2 基本原理 1.3 图像拼接整体流程 二.全景图像拼接实验 2.1 代码实现 2.2 不同场景的实验结果与分析 2.2. ...

  7. python全景拼接

    一.原理 (一) RANSAC算法 在之前的博客中有介绍过,SIFT算法的描述子稳健性很强,比Harris角点要来得精确,但是它的匹配正确率也并不是百分百的,会受到一些噪声点的干扰,有时就会因为不同地 ...

  8. 全景图拼接【计算机视觉第三章】

    目录 全景图像拼接基本介绍 全景图拼接步骤 全景图拼接原理 RANSAC算法 图像配准 图割方法 图像融合 APAP算法 multi-band bleing算法​​​​​​​ 全景图拼接代码实现 代码 ...

  9. 智能手机拍照进化论:从传感器到算法摄影

    在智能手机时代,摄影已经发生了变化.不仅人们的拍照姿势变了,手机摄像机捕获的光线的整个过程也发生了翻天覆地的变化. 相机不再只是一个镜头和一个传感器,还是一系列算法的体现,它们可以以最快的速度处理图像 ...

最新文章

  1. python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
  2. Linux之特殊权限(SUID/SGID/SBIT)
  3. log4j2 配置文件
  4. Discuz!NT 和网站整合
  5. face++算法工程实习生面试
  6. 5分钟,带你了解不同类型的云计算!
  7. 微信公众平台服务框架
  8. 通过HP Loadrunner VuGen来录制安卓的应用
  9. Linux后台运行python程序并输出到日志文件
  10. linux端口被墙了 开通端口
  11. 常见的9种大数据分析方法
  12. 函数式编程 freecodecamp
  13. 软文标题怎么写吸引人?记住这几个套路
  14. 1.3 PyCharm下载
  15. 学习Vue3 第二十七章(自定义指令directive)
  16. linux 读取内存颗粒,Linux中的内存管理模型浅析
  17. nyoj 239 月老的难题 【二分匹配之匈牙利】
  18. echarts 饼图 labelLine
  19. 实习纪实——1.31记
  20. 周鸿祎:无线互联网的垄断形势将更严峻

热门文章

  1. Debezium系列之:Debezium2.X之PostgreSQL数据库的Debezium连接器
  2. Echarts:10-7-4:混合图(降水量蒸发量平均温度)
  3. 【抗干扰代码】AVR单片机自动复位由于电压不足导致ENC28J60网卡出现的故障
  4. paddle基于bert的情绪识别
  5. 异常——Navicat提示access violation at address in module ‘navicat’
  6. java获取和风天气_SpringMVC结合天气api实现天气查询
  7. 深度 | 张正友:计算机视觉的三生三世 | CCF-GAIR 2019
  8. A“一个部族,一个民族,一个弗雷尔卓德。”(素数筛,逆序对,树状数组)
  9. 计算机网络知识全面讲解:使用Telnet命令发送电子邮件
  10. 2017-11-06 日语编程语言抚子 - 第三版特色初探 1