skimage 学习第四天:ski官网示例程序总结(3)——使用ransac的几何转换和registration
在示例程序中看到几个基于RANSAC的评估。准备单独写一个。后面还有一篇基于RAG的。
RANSAC算法
来源【百度百科】
RANSAC为Random Sample Consensus的缩写,它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。它于1981年由Fischler和Bolles最先提出 [1] 。
RANSAC算法经常用于计算机视觉中。例如,在立体视觉领域中同时解决一对相机的匹配点问题及基本矩阵的计算。
算法简介
RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
基本思想描述
RANSAC基本思想描述如下:
①考虑一个最小抽样集的势为n的模型(n为初始化模型参数所需的最小样本数)和一个样本集P,集合P的样本数#(P)>n,从P中随机抽取包含n个样本的P的子集S初始化模型M;
②余集SC=P\S中与模型M的误差小于某一设定阈值t的样本集以及S构成S*。S*认为是内点集,它们构成S的一致集(Consensus Set);
③若#(S*)≥N,认为得到正确的模型参数,并利用集S*(内点inliers)采用最小二乘等方法重新计算新的模型M*;重新随机抽取新的S,重复以上过程。
④在完成一定的抽样次数后,若未找到一致集则算法失败,否则选取抽样后得到的最大一致集判断内外点,算法结束。
算法优化策略
①如果在选取子集S时可以根据某些已知的样本特性等采用特定的选取方案或有约束的随机选取来代替原来的完全随机选取;
②当通过一致集S*计算出模型M*后,可以将P中所有与模型M*的误差小于t的样本加入S*,然后重新计算M*。
好了。下面是skimage示例程序:
Robust matching using RANSAC
在这个简化的例子中,我们首先生成两个合成图像,就好像它们是从不同的视图点获取的一样。在接下来的步骤中,我们会在两个图像中找到兴趣点,并根据周围一个小社区的平方误差的加权和来找到对应关系。注意,这个测量方法只适用于线性辐射测量,而不是几何畸变,因此只能在轻微的视图点变化中使用。在找到相应的关联之后,我们最终得到了一组源和目标坐标,可以用来估计两个图像之间的几何变换。然而,许多通信都是错误的,仅仅用所有的坐标来估计参数集是不够的。因此,在常规模型的基础上,利用RANSAC算法对异常值进行了可靠的估计。# estimate affine transform model using all coordinates model = AffineTransform() model.estimate(src, dst) # robustly estimate affine transform model with RANSAC model_robust, inliers = ransac((src, dst), AffineTransform, min_samples=3, residual_threshold=2, max_trials=100) outliers = inliers == False
Fundamental matrix estimation
这个例子演示了如何使用稀疏的ORB特性来可靠地估计两个视图之间的超极几何。基本矩阵关系到一对未校准的图像之间的对应点。这个矩阵将一个图像中的同质图像点转换成另一个图像中的超极线。未校准的意思是两个相机的固有校准(焦距、像素偏度、主点)尚不清楚。因此,基本矩阵可以实现捕获场景的投影3D重建。如果已知校准,估计基本矩阵可以实现捕获场景的三维重建。matches = match_descriptors(descriptors_left, descriptors_right, cross_check=True) # Estimate the epipolar geometry between the left and right image. model, inliers = ransac((keypoints_left[matches[:, 0]], keypoints_right[matches[:, 1]]), FundamentalMatrixTransform, min_samples=8, residual_threshold=1, max_trials=5000)
Robust line model estimation using RANSAC
# fit line using all data model = LineModelND() model.estimate(data) # robustly fit line only using inlier data with RANSAC algorithm model_robust, inliers = ransac(data, LineModelND, min_samples=2, residual_threshold=1, max_trials=1000) outliers = inliers == False # generate coordinates of estimated models line_x = np.arange(-250, 250) line_y = model.predict_y(line_x) line_y_robust = model_robust.predict_y(line_x
Robust 3D line model estimation using RANSAC
# robustly fit line only using inlier data with RANSAC algorithm model_robust, inliers = ransac(xyz, LineModelND, min_samples=2, residual_threshold=1, max_trials=1000) outliers = inliers == False