大きな点群を通る線のあてはめ


8

パーティクルトラック(カメラで撮影された時間内のxy平面での移動、つまり3d-256x256pxと私のサンプルセットでは約3kフレーム)とノイズによって形成された大きなポイントセット(10kポイントのオーダー)があります。これらの粒子は、ほぼ直線上をほぼ同じ方向に移動しますが、それらの軌道を分析するために、点を通る線をフィットさせようとしています。シーケンシャルRANSACを使用しようとしましたが、TとJリンケージと同様に、誤検出を確実に選択するための基準を見つけることができませんでした。

これは、シーケンシャルランサックで得られた適合性の良いデータセットと不良なデータセットの一部の画像です。ここでは、ここに画像の説明を入力してください 粒子ブロブの重心を使用しています。ブロブサイズは1ピクセルと約20ピクセルの間で変化します。

たとえば、10フレームごとにのみ使用するサブサンプルも非常にうまく機能するため、処理するデータサイズをこの方法で削減できることがわかりました。

ニューラルネットワークで実現できるすべてのことについてブログの投稿を読んで、これを読み始める前に、これが実現可能なアプリケーションかどうかを尋ねたいと思います(私は数学の知識がないので、かなりのことをしなければなりません少し読んでください)?

または、別の方法を提案できますか?

ありがとう!

補遺:以下は、Matlab関数が30本の平行なノイズのあるラインを含むサンプルの点群を生成するコードです。これは、まだ区別できません。

function coords = generateSampleData()
coords = [];
for i = 1:30
    randOffset = i*2;
    coords = vertcat(coords, makeLine([100+randOffset 100 100], [200+randOffset 200 200], 150, 0.2));
end

figure
scatter3(coords(:,1),coords(:,2),coords(:,3),'.')

function linepts = makeLine(startpt, endpt, numpts, noiseOffset)
    dirvec = endpt - startpt;
    linepts = bsxfun( @plus, startpt, rand(numpts,1)*dirvec); % random points on line
    linepts = linepts + noiseOffset*randn(numpts,3); % add random offsets to points
end

end

サンプルデータセット、または実際のデータセットに十分似ている偽のデータセット、または実際のデータまたは偽のデータセットの写真を提供すると、より適切な応答が得られる可能性があります。イベントが2dか3dか、4dかは
わかり

それほど具体的である必要があるとは思いませんでした。とにかくそれを更新
Lukas K.

思ったよりずっと面白かったです。多数の異なるラインに属しているポイントの雲全体と、そうでないいくつかのノイズの多いポイントがあり、右下の3や4のような小さなラインも含めて、すべてのラインを見つけることが理想的です。 ...
Spacedman 2016年

問題がおもしろくてうれしいです。今誰かが私を助けてくれることを願っています:)
Lukas K.

ああ、でも連続したx、y、Tポイント座標ではなく、バイナリ(0/1)ラスターの束?2つのトラックが交差する場合、複数のトラックに属するピクセルを取得する可能性があります...
Spacedman

回答:


3

フィードバックに基づいて、より効果的なアプローチを見つけようとして、専用の距離測定を使用して次のアルゴリズムを開発しました。

次の手順が実行されます。

1)返す距離メトリックを定義します

ゼロ -ポイントがラインに属していない場合

ポイントのユークリッド距離 -ポイントが定義されたパラメータに従って線を構成する場合、つまり

  • それらの距離がmin_line_length以上であり

  • それらの距離がmax_line_length以下であり、

  • 線は、少なくともmin_line_points個のポイントで構成され、線からの距離はline_width / 2より も小さい

2)この距離測定を使用して距離行列を計算します(大きなデータセットの場合はデータのサンプルを使用します。それに応じてラインパラメーターを調整します)

3)最大距離のポイントAとBを見つけます-ステップ5に進みます)距離がゼロの場合

距離がゼロよりも大きい場合、ポイントAとBは定義に基づいてラインを構築していることに注意してください

4)線ABに属するすべての点を取得し、それらを距離行列から削除します。手順3)を繰り返して、別の行を見つけます。

5)選択したラインでポイントのカバレッジを確認し、かなりの数のポイントがカバーされていない場合は、調整されたラインパラメータでアルゴリズム全体を繰り返します。

6)データサンプルが使用された場合-すべてのポイントをラインに再割り当てし、境界ポイントを再計算します。

以下のパラメーターが使用されます。

線幅 -line_width / 2は、理想的な線からのポイントの許容距離です= r line_width

最小ライン長 -より短い距離のポイントは同じラインに属するとは見なされません= r min_line_length

最大ライン長 -より長い距離のポイントは同じラインに属するとは見なされません= r max_line_length

ライン上の最小ポイント -ポイントの少ないラインは無視されます=r min_line_points

では、あなたのデータ(パラメータを持ついくつかのあいた後)私はすべての30行をカバーする良い結果を得ました。

ここに画像の説明を入力してください

詳細については、knitrスクリプトを参照してください


2

私は、ブルートフォースアプローチを使用して、同様の、しかしより単純なタスクを解決しました。単純化は、線が線形関数であるという仮定にありました(私の場合、係数と切片も既知の範囲にありました)。

したがって、これは、パーティクルがx軸と直交して移動する(つまり、機能をトレースできない)場合の一般的な問題を解決しませんが、考えられるインスピレーションとしてソリューションを投稿します。

1)A(x)> B(x)+定数の2つのポイントAとBのすべての組み合わせをとります(係数の計算中に対称性と高いエラーを回避するため)

2)ラインAB の係数 cと切片 iを計算します

 A(y) = i + c * A(x)
 B(y) = i + c * B(x)
 A(y) - B(y) = c * (A(x) - B(x))
 c = (A(y) - B(y)) / (A(x) - B(x))
 i = A(y) - c * A(x)

3)係数と切片を丸めます(これにより、グリッド内のポイントによって引き起こされるエラーの問題が解消/減少します)。

4)各切片と係数について、この線上の点の数を計算します

5)あるしきい値を超えるポイントを持つラインのみを考慮します。

簡単な例はこちらをご覧ください


これは、基本的に私がRANSACで行っていることです(ただし、すべての組み合わせを試すのではなく、ランダムサンプリングを使用します)。私にとっての問題は、いくつかの線に当てはまらないことです。問題は、あまりに多くの線に当てはまることです。なぜなら、非常に多くの近傍点があると、歪んだ線でも、妥当なしきい値内で十分なインライアを見つけるからです。そこで、「実際の」行に適合する行と他の行を区別するための基準を探しています。
Lukas K.16年

1
それが本当に同じアプローチかどうかはわかりません。線上の点と異常値を区別しません。2つのベクトルが同じラインに属しているかどうかを検討しています。これはもっと正確かもしれないと思う。さらに、選択を制御するために、パラメーターline widthminimum line lengthおよびminimum line pointsを使用します。
マルマイト爆撃機

なるほど、分かりました。10kポイントで(10E + 5は2を選択)= 5E + 11の可能なペアですが、ランダムサンプリングを行う必要があります。また、これは、インターセプトを変更する可能性がある直線からの偏差におそらく非常に敏感です。でもやってみます!最小の長さと最小なしのように考えています。結果を整理するために私が既に使用した線上の点の数。
Lukas K.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.