Gruppieren von Punkten, die Linien darstellen

Ich suche nach einem Algorithmus, der dieses Problem lösen kann.

Das Problem

Ich habe die folgenden Sollwerte:

Ich möchte die Punkte, die eine Linie (mit etwas Epsilon) darstellen, in einer Gruppe zusammenfassen. Die optimale Ausgabe lautet also etwa:

Einige Notizen

Der Punkt gehört zu einer einzigen Linie.Wenn der Punkt zu zwei Linien gehören kann, sollte er zu den stärksten gehören. Eine Linie gilt als stärker als eine andere, wenn sie mehr Zugehörigkeitspunkte hat.Der Algorithmus sollte nicht alle Punkte abdecken, da es sich möglicherweise um Ausreißer handelt.Der Bereich enthält viele Ausreißer, die möglicherweise 50% des gesamten Bereichs ausmachen.Leistung ist entscheidend, Echtzeit ist ein Muss.

Die Lösungen, die ich bis jetzt gefunden habe:

1) Behandlung als Clustering-Problem:

Der Hauptnachteil dieser Methode ist, dass esNei direkte Distanzmetrik zwischen Punkten. Die Abstandsmetrik befindet sich im Cluster selbst (wie viel ist linear). Daher kann ich keine herkömmlichen Clustering-Methoden verwenden und muss (soweit ich dachte) eine Art von genetischem Clustering-Algorithmus verwenden, bei dem die Bewertung im while-Cluster nicht zwischen zwei Punkten erfolgt. Ich möchte auch nicht so etwas wie einen genetischen Algorithmus verwenden, während ich eine Echtzeitlösung anstrebe.

2) akkumulative Paare und dann Clustering:

Während es schwierig ist, Punkte direkt zu gruppieren, habe ich darüber nachgedacht, Punktepaare zu extrahieren und sie dann mit anderen zu gruppieren. Ich habe also einen Abstand zwischen zwei Paaren, der die Linearität darstellen kann (zwei Paare sind echte 4 Punkte). Der Nachteil dieser Methode ist, wie man diese Paare auswählt. Wenn ich von der Ecledian-Distanz zwischen ihnen abhänge, kann es sein, dass sie nicht genau ist, weil zwei Punkte so nahe beieinander liegen, aber sie sind so weit davon entfernt, mit anderen eine Linie zu ziehen.

Ich schätze jede Lösung, jeden Vorschlag, jeden Hinweis oder jede Notiz. Bitte fragen Sie nach einer Klärung.

P.S. Sie können jede fertige OpenCV-Funktion verwenden, um eine Lösung zu finden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage