主要内容

本页采用了机器翻译。点击此处可查看英文原文。

ransac

对噪声数据进行建模

说明

[model,inlierIdx] = ransac(data,fitFcn,distFcn,sampleSize,maxDistance) 使用 M-估计量样本共识 (MSAC) 算法(即随机样本共识 (RANSAC) 算法的一种变体)对带噪声的数据进行建模。

请指定用于拟合模型的函数 fitFcn,以及用于计算数据与模型之间距离的函数 distFcnransac 函数使用 sampleSize 从您的 data 中提取随机样本,并利用 fit 函数使 maxDistance 中的有效数据点数量最大化。

示例

[___] = ransac(___,Name,Value) 还指定了一个或多个 Name,Value 参量。

示例

全部折叠

加载并绘制一组带噪声的二维点。

load pointsForLineFitting.mat
plot(points(:,1),points(:,2),'o');
hold on

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用线性最小二乘法拟合一条直线。由于存在离群值,该直线拟合效果不佳。

modelLeastSquares = polyfit(points(:,1),points(:,2),1);
x = [min(points(:,1)) max(points(:,1))];
y = modelLeastSquares(1)*x + modelLeastSquares(2);
plot(x,y,'r-')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

使用 MSAC 算法对这些点拟合一条直线。定义样本大小、内点最大距离、拟合函数以及距离评估函数。调用 ransac 来运行 MSAC 算法。

sampleSize = 2; % number of points to sample per trial
maxDistance = 2; % max allowable distance for inliers

% Define the fit function using polyfit.
fitLineFcn = @(points)polyfit(points(:,1),points(:,2),1);

% Define the distance function to classify each point as an inlier or outlier
% based on the maxDistance threshold.
distLineFcn = @(model,points)(points(:, 2) - polyval(model, points(:,1))).^2;

[modelRANSAC,inlierIdx] = ransac(points,fitLineFcn,distLineFcn, ...
  sampleSize,maxDistance);

使用 polyfit 函数对内点重新拟合一条直线。

modelInliers = polyfit(points(inlierIdx,1),points(inlierIdx,2),1);

显示最终拟合线。该模型对 ransac 所识别并忽略的异常值具有稳健性。

inlierPts = points(inlierIdx,:);
x = [min(inlierPts(:,1)) max(inlierPts(:,1))];
y = modelInliers(1)*x + modelInliers(2);
plot(x, y, 'g-')
legend('Noisy points','Least squares fit','Robust fit');
hold off

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Noisy points, Least squares fit, Robust fit.

输入参数

全部折叠

待建模的数据,指定为一个 mn 列的矩阵。每一行对应待建模数据集中的一个数据点。例如,要对一组二维点进行建模,请将点数据指定为一个 m2 列的矩阵。

数据类型: single | double

用于拟合 data 子集的函数,以函数句柄的形式指定。该函数必须采用以下形式:

model = fitFcn(data)

如果可以对数据进行多模型拟合,那么 fitFcn 会将模型参数作为元胞数组返回。

用于计算模型与数据之间距离的函数,以函数句柄的形式指定。该函数必须采用以下形式:

distances = distFcn(model,data)

如果 model 是一个 n-元素数组,那么 distances 必须是一个 m-行 n-列的矩阵。否则,distances 必须是一个比 m 少 1 个元素的向量。

data 提供的、fitFcn 所需的最小样本量,指定为一个正标量整数。

拟合曲线到内点之间的最大距离,指定为一个正标量。任何距离超过该距离的点均被视为离群点。该距离由 distFcn 定义。RANSAC 算法基于一小部分样本点生成拟合曲线,但会尽量使内点数量最大化。缩小最大距离通过为内点设定更严格的公差,从而改善了拟合效果。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'MaxNumTrials',2000

用于验证模型的函数,指定为由 'ValidateModelFcn' 和一个函数句柄组成的以逗号分隔的元组。如果模型根据该函数中定义的标准被接受,则该函数返回 true。使用此函数可拒绝特定的拟合结果。该函数必须采用以下形式:

isValid = validateModelFcn(model,varargin)

如果未指定函数,则假定所有模型均有效。

查找可生成有效模型的样本的最大尝试次数,指定为由 'MaxSamplingAttempts' 和一个整数组成的以逗号分隔的元组。

随机试验的最大次数,指定为由 'MaxNumTrials' 和一个数值组成的以逗号分隔的元组。单次试验使用来自 data 的最少数量的随机点来拟合模型。然后,该检验会检查模型中 maxDistance 内的内点数量。在所有测试结束后,将选择内点数量最多的模型。增加试验次数可以提高输出结果的稳健性,但会增加计算量。

对“最终解”能为模型拟合找到最大内点数的信心程度,指定为由 'Confidence' 和一个介于 0 到 100 之间的标量组成的逗号分隔对。增加该值可以提高输出的稳健性,但会增加计算量。

输出参量

全部折叠

最佳拟合模型,返回值为 fitFcn 输入中定义的参数。该模型旨在从所有采样尝试中最大化内点数量。

内点,以逻辑向量的形式返回。该向量的长度与 data 相同,每个元素表示该点是否属于基于 maxDistance 进行的模型拟合的内点。

参考

[1] Torr, P. H. S., and A. Zisserman. "MLESAC: A New Robust Estimator with Application to Estimating Image Geometry." Computer Vision and Image Understanding. Vol. 18, Issue 1, April 2000, pp. 138–156.

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2017a 中推出