[RANSAC]使用RANSAC和SIFT算法减少图片特征的误匹配

本文介绍了如何使用RANSAC算法和SIFT算法来减少图像特征匹配中的误匹配问题。RANSAC通过迭代和随机抽样,从包含噪声的数据中估计模型参数,尤其适用于计算机视觉领域的直线拟合和图像变换矩阵计算。文章详细阐述了RANSAC的流程,并讨论了其优缺点。实验结果显示,应用RANSAC后,图片的特征点误匹配显著减少。文中提供了相关代码文件,可在作者的GitHub上查看完整项目。
摘要由CSDN通过智能技术生成

使用RANSAC和SIFT算法减少图片特征的误匹配

一、RANSAC算法简述

    随机抽样一致算法(RANdom SAmple Consensus,RANSAC),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法被广泛应用在计算机视觉领域和数学领域,例如直线拟合、平面拟合、计算图像或点云间的变换矩阵、计算基础矩阵等方面。
    RANSAC算法假设数据中包含正确数据和异常数据(或称为噪声)。正确数据记为局内点(inliers),异常数据记为外点(outliers),也是异常值。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。该算法核心思想就是随机性和假设性,随机性是根据正确数据出现概率去随机选取抽样数据,根据大数定律,随机性模拟可以近似得到正确结果。假设性是假设选取出的抽样数据都是正确数据,然后用这些正确数据通过问题满足的模型,去计算其他点,然后对这次结果进行一个评分。

二、RANSAC流程

    RANSAC算法的输入是一组观测数据(往往含有较大的噪声或无效点),一个用于解释观测数据的参数化模型以及一些可信的参数。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能找适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点,相反,RANSA能得出一个仅仅用局内点计算出模型,并且概率还足够高,但是不能保证结果一定正确。
    RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:①有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。②用上步得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。③如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。④然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。⑤最后,通过估计局内点与模型的错误率来评估模型。
上述过程被重复执行固定的迭代次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。
    RANSAC算法在消除图像误匹配中是寻找一个最佳单应性矩阵H,RANSAC算法从匹配数据集中随机抽出4个样本并保证这四个样本之间不共线。然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数)若此模型为最优模型。

三、RANSAC算法优缺点

    ①RANSAC的优点是能鲁棒的估计模型参数。例如,它能从包含大量局外点的数据集中估计出高精度的参数。
    ②RANSAC的缺点是计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。另一个缺点是它要求设置跟问题相关的阀值,而且RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

四、实验结果

    我分别使用2组图片,每组2个图片,从图片中可以直观的发现经过RANSAC处理后的图片明显减少了图片特征点的的误匹配。

图1.1 原图像示例_1
图2 RANSAC改进后_1
图3 原图像示例_2
图4 RANSAC改进后_2

五、 代码文件

共有2个代码文件,第一个是单纯使用SIFT,第二个是使用RANSAC+SIFT算法的程序。

'''代码1
先使用SIFT算法提取特征,完成图像的匹配
'''
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt
from PIL import Image

#导入两张图片
imgname_01 = './05.jpg'
imgname_02 = './06.jpg'
#利用现有的cv2模块方法,创建一个SIFT的对象
sift = cv2.xfeatures2d.SIFT_create()


# BFmatcher(Brute-Force Matching)暴力匹配   暴力方法找到点集1中每个descriptor在点集2中距离最近的descriptor;找寻到的距离最小就认为匹配

#应用BFMatch暴力方法找到点集1中每个descriptor在点集2中距离最近的descriptor;找寻到的距离最小就认为匹配er.knnMatch( )函数来进行核心的匹配,knnMatch(k-nearest neighbor classification)k近邻分类算法。
# 进行特征检测,得到2张图片的特征点和描述子

img_01 = cv2.imread(imgname_01)
img_02 = cv2.imread(imgname_02)
keypoint_01, descriptor_01 = sift.detectAndCompute(img_01, None)
keypoint_02, descriptor_02 = sift.detectAndCompute(img_02, None)


bf = cv2
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值