Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ransac

ノイズを含むデータへのモデルの当てはめ

説明

[model,inlierIdx] = ransac(data,fitFcn,distFcn,sampleSize,maxDistance) は、Random Sample Consensus (RANSAC) アルゴリズムの 1 バージョンである M-estimator Sample Consensus (MSAC) アルゴリズムを使用して、モデルをノイズを含むデータに当てはめます。

モデルの当てはめを行う関数 fitFcn と、モデルからデータまでの距離を計算する関数 distFcn を指定します。関数 ransacsampleSize を使用して data からランダムなサンプルを取得し、近似関数を使用して maxDistance 内のインライアの数を最大化します。

[___] = ransac(___,Name,Value) はさらに、1 つ以上の Name,Value 引数ペアを指定します。

すべて折りたたむ

一連のノイズを含む 2 次元点を読み込み、プロットします。

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

Figure contains an axes. The axes contains an object of type line.

線形最小二乗法を使用して線を当てはめます。外れ値があるため、線はよく近似していません。

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. The axes contains 2 objects of type line.

MSAC アルゴリズムを使用して、点に線を当てはめます。標本サイズ、インライアの最大距離、近似関数、距離評価関数を定義します。ransac を呼び出し、MSAC アルゴリズムを実行します。

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

fitLineFcn = @(points) polyfit(points(:,1),points(:,2),1); % fit function using polyfit
evalLineFcn = ...   % distance evaluation function
  @(model, points) sum((points(:, 2) - polyval(model, points(:,1))).^2,2);

[modelRANSAC, inlierIdx] = ransac(points,fitLineFcn,evalLineFcn, ...
  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. The axes contains 3 objects of type line. These objects represent Noisy points, Least squares fit, Robust fit.

入力引数

すべて折りたたむ

モデル化するデータ。m 行 n 列の行列として指定します。各行は、モデル化するセット内の 1 つのデータ点に対応します。たとえば、一連の 2 次元の点をモデル化するには、m 行 2 列の行列として点データを指定します。

データ型: single | double

data のサブセットを当てはめる関数。関数ハンドルとして指定します。関数は次の形式でなければなりません。

model = fitFcn(data)

データを複数のモデルに当てはめることができる場合、fitFcn はモデル パラメーターを cell 配列として返します。

モデルからデータへの距離を計算する関数。関数ハンドルとして指定します。関数は次の形式でなければなりません。

distances = distFcn(model,data)

model が n 要素配列の場合、距離は m 行 n 列の行列でなければなりません。それ以外の場合、distances は m 行 1 列のベクトルでなければなりません。

整数 fitFcn によって要求される data からの最小標本サイズ。正のスカラー整数として指定します。

近似曲線からインライア点までの最大距離。正のスカラーとして指定します。この距離より離れたところにある点はすべて外れ値と見なされます。RANSAC アルゴリズムは、少ない標本点から当てはめを作成しますが、インライア点の数を最大化しようとします。最大距離を短くすると、インライア点の許容誤差が厳しくなり近似が改善されます。

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'MaxNumTrials',2000

モデルを検証する関数。'ValidateModelFcn' と関数ハンドルで構成されるコンマ区切りのペアとして指定します。関数で定義された条件に基づいてモデルが許容される場合、関数は true を返します。この関数を使用して、特定の当てはめを棄却します。関数は次の形式でなければなりません。

isValid = validateModelFcn(model,varargin)

関数を指定しない場合、すべてのモデルが有効と見なされます。

有効なモデルが得られる標本を探す試行の最大数。'MaxSamplingAttempts' と整数で構成されるコンマ区切りのペアとして指定します。

ランダム試行の最大回数。'MaxNumTrials' と整数で構成されるコンマ区切りのペアとして指定します。1 回の試行で、data から最小の数のランダム点を使用してモデルを当てはめます。その試行で、モデルから maxDistance の内側にあるインライアの数がチェックされます。すべての試行が完了した後、インライアが最も多いモデルが選択されます。試行回数を多くすると出力のロバスト性は向上しますが、計算量が増加します。

モデル近似において最終的な解が最も多いインライアを見つける信頼度。'Confidence' と 0 ~ 100 のスカラーで構成されるコンマ区切りのペアとして指定します。この値を大きくすると出力のロバスト性は向上しますが、計算量が増加します。

出力引数

すべて折りたたむ

最も当てはまるモデル。fitFcn 入力で定義されたパラメーターとして返されます。このモデルは、すべてのサンプル試行からのインライアの数を最大化します。

インライア点。logical ベクトルとして返されます。ベクトルは 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++ コードを生成します。

R2017a で導入