ransac算法–基于几何关系的图像特征匹配点对提纯 ransac算法–基于几何关系的图像特征匹配点对提纯

本文介绍了一种用于去除噪声点的RANSAC算法,并详细解释了其实现过程及应用场景。通过随机抽样一致性算法,可以有效地从一组含有异常值的数据中估算出数学模型的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ransac的原理,有一些不错的资料已经详细的叙述,刚开始学习的时候我看的是Marco Zuliani的<<Ransac for Dummies>>,这份资料讲得不错,想要详细了解其原理的同学不妨看看这份资料。本着实用为主的原则,此处,主要描绘具体怎么实现ransac算法。

ransac算法的输入为:需要处理的点集;以及可能符合的函数模型, 选择的模型决定了需要计算模型参数的点的个数。

ransac算法的输出为:满足某种关系的过滤点集 ;函数模型的参数。

ransac算法的实现步骤:

  1. 根据你设定的函数模型,选定足够的点
  2. 使用选定的点,计算得到函数模型参数
  3. 判定其他点是否符合该函数,并统计满足的点的个数
  4. 反复1-3步,最后,具有最多点满足的函数为求取的函数,满足该函数的点为inlier,反之,不满足该函数的点为outlier。

以特征点对的几何去噪这一应用为例,具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//输入:
//    需要去噪的特征点对:vector<pair<CvPoint CvPoint>  > matcher_ori
//    点对估计应该满足的特征点对几何模型:xform_fn = 投影、仿射、RST或者其他
//    对应的计算模型参数需要特征点对个数:sample_n
//    误差求取函数: err_fn
//    误差阈值: err_w
//    另外还有几个特别重要的参数:infrac, p_badxform, RANSAC_PROB_BAD_SUPP
//输出:
//    去噪后的特征点对 vector<pair<CvPoint CvPoint>  > matcher_dst
//    应满足的实际几何模型参数: Ptr<CvMat> H_matrix
 
int k = 0;
doublep = pow(1.0 -pow(in_frac, MSS_n), k);
int mather_n = (int)mather_ori.size();
int done_n = 0;
while(p > p_badxform && (((matcher_n - done_n) - sample_n) >= 0) )
{
    matcher_sample.clear();
//  随机选择足够的点对
    choice_ransac_sample(matcher_ori, matcher_sample, sample_n);
    done_n += sample_n;
//  使用选择的点对计算模型的参数
    H_matrix = xform_fn(matcher_sample);
    if(NULL == H_matrix)
    {
        p =pow(1.0 - pow(in_frac, sample_n, ++k);
        continue;
    }
    matcher_inliners.clear();
//  检测有哪些点对满足当前的几何模型
    find_consensus( matcher_ori, H_matrix, err_fn, err_w, matcher_inliners);
//     选择最多点对符合的几何模型
    if(matcher_dst.size() < matcher_inliners.size())
    {
                    matcher_dst.clear();
                    matcher_dst = matcher_inliners;
                    in_frac =double(matcher_dst.size())/double(matcher_ori.size());
    }
     p =pow(1.0 - pow(in_frac, sample_n), ++k);
}

结果示例图:

ransac之前的匹配点 : 共有20个匹配点

ransac之后的匹配点:共有17个匹配点



http://www.imagerabit.com/?p=141

### 使用RANSAC算法提纯特征对 #### RANSAC算法概述 RANSAC(Random Sample Consensus,随机抽样一致)是一种用于估计数学模型参数的迭代方法,特别适用于存在大量异常值的数据集。该算法通过反复选取最小数量的样本构建假设模型,并验证其他数据对该模型的一致性来找出最佳拟合模型。 对于图像中的特征匹配而言,即使采用了诸如SIFT或ORB这样的鲁棒特征描述符,仍然可能存在一定比例的错误匹配——即所谓的外(outliers)[^1]。为了提高后续处理步骤如几何变换估计、三维重建等过程的质量,有必要采用有效的策略去除这些不准确的对应关系[RANSAC 特征匹配算法解析]。 #### 提纯流程详解 ##### 数据准备阶段 给定两幅图像`img1`和`img2`及其对应的特征集合`(loc1, des1)`与`(loc2, des2)`,其中`loc`表示位置坐标而`des`代表局部外观描述向量。通常情况下,我们会先执行初步的兴趣检测及描述子提取工作,这一步骤可以借助多种成熟的计算机视觉库完成,比如OpenCV提供了方便易用的功能接口: ```matlab % 基于MATLAB环境下的伪代码示意 [des1, loc1] = detectSURFFeatures(img1); [des2, loc2] = detectSURFFeatures(img2); % 或者使用Python/OpenCV组合 import cv2 sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) ``` 上述操作之后便获得了待处理的特征信息,接下来进入核心环节—运用RANSAC机制过滤掉不可靠的关联项。 ##### 构建初始猜测模型 从所有可能的匹配候选中无放回地抽取一对或多对作为基础样本,依据选定的数量k建立临时映射函数f(x),例如当涉及到平面单应矩阵(Homography Matrix)时,则至少需要四个非共线才能唯一确定解的形式[Hartley & Zisserman (2004)][未提供具体编号但属于领域常识]。 ##### 测试并更新共识集 针对剩余尚未参与建模的所有潜在连接,逐一检验其是否满足当前假说所定义的关系准则;如果确实如此则将其纳入支持群体之中,反之标记为离群。重复这一过程直至遍历完毕整个输入空间为止。 ##### 迭代优化直到收敛 设定最大循环次数Nmax或者指定阈值Tolerance控制终止条件,在每次迭代过程中记录下规模最大的一次内(Inlier Set)分布情况连同相应的转换方程式一起保存下来供最终评估选用。一旦达到预设界限就停止探索活动转而输出最有可能反映真实世界物理规律的那个版本的结果。 ```python # Python示例:基于OpenCV实现基本形式的RANSAC滤波器应用于单应性测试场景 import numpy as np import cv2 def ransac_homography(kp_pairs, threshold=3.0): best_inliers = [] max_inliers_count = 0 for _ in range(100): # 设置适当轮次保障概率覆盖度 sample_idx = np.random.choice(len(kp_pairs), size=(4,), replace=False) src_pts = np.float32([kp_pairs[i][:2] for i in sample_idx]) dst_pts = np.float32([kp_pairs[i][2:] for i in sample_idx]) H, mask = cv2.findHomography(src_pts, dst_pts, method=cv2.RANSAC) if H is not None: projected_points = cv2.perspectiveTransform( np.array([[pair[:2]] for pair in kp_pairs]), H).reshape(-1, 2) distances = np.linalg.norm(projected_points - [pair[2:] for pair in kp_pairs], axis=-1) current_inliers = [(idx, d) for idx, d in enumerate(distances) if d < threshold] if len(current_inliers) > max_inliers_count: best_inliers = current_inliers max_inliers_count = len(best_inliers) refined_H, final_mask = cv2.findHomography( *[np.float32([kp_pairs[idx][:2] for idx, _ in best_inliers]), np.float32([kp_pairs[idx][2:] for idx, _ in best_inliers])], method=cv2.RANSAC) return refined_H, final_mask matches = ... # 获取匹配后的索引列表 good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append((m.trainIdx,m.queryIdx)) kp_pairs = [[kp1[m.queryIdx].pt[0], kp1[m.queryIdx].pt[1], kp2[m.trainIdx].pt[0], kp2[m.trainIdx].pt[1]] for m,_ in good_matches] H_matrix, mask = ransac_homography(kp_pairs) print("Final homography matrix:\n", H_matrix) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值