Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
folgendes Problem. Ich habe eine Punktsequenz welche eine beliebige Form widerspiegelt. Jetzt möchte ich aus dieser Punktsequenz gern alle Linien und Kurven herausfiltern.
Was ich bisher habe:
Am Anfang wird die Punktsequenz approximiert mittels Douglas-Peucker Algorithmus. Die so herausgefilterten Punkte werden nun untersucht.
Beispiel für Untersuchung:
Punkt p1 und p2 wurden durch Douglas Peucker herausgefiltert. p1 und p2 bilden eine gerade g1. Nun wird der Abstand jedes Punktes zwischen p1 und p2 zur geraden g1 berechnet. Diese werden alle aufaddiert und durch die Anzahl der Punkt zwischen p1 und p2 geteilt. Überschreitet der so ermittelte Wert eine bestimmte Grenze(die frei gewählt werden kann) nicht, handelt es sich um eine Gerade. Die Grenze ist dabei abhängig von der Länge der Geraden.
Dies ist noch ein Beispiel und ich habe noch anderen Vorgehensweisen probiert, jedoch liefert keine Variante ein zuverlässiges Ergebnis. Ab und zu wird alles richtig erkannt, jedoch wird auch oft etwas falsches erkannt.
Ich hoffe ich konnte das Problem verständlich erläutern. Kennt jemand vielleicht eine alternative Lösung die relativ zuverlässig geraden und Kurven erkennnt. Forschung in Richtung Sketched Recognition haben mich leider nicht weiter gebracht, da dort oft die Geschwindigkeit beim Zeichnen in die Berechnungen integriert werden. Ich habe jedoch nur eine simple Punktsequenz.
Sollten noch Fragen offen sein, werde ich diese natürlich gern beantworten.
du könntest die Dimension jedes Punktes mit seinem Nachbarn vergleichen. Dabei musst du die Differenz der Punkte beachten. Berechnest du nun die Differenz zwischen der Differenz so wirst du ein Muster erkennen.
4 x x x o x x x x x Dif = 1;1
3 x x o x x x x x x Dif = 1;1
2 x o x x x x x x x Dif = 1;1
1 o x x x x x x x x Dif = 0
0 1 2 3 4 5 6 7 8 9
4 x x x x x x o x x Dif 2;1
3 x x x o x x x x x Dif 2;1
2 x o x x x x x x x Dif 1;1
1 o x x x x x x x x Dif 0
0 1 2 3 4 5 6 7 8 9
ich habe selbst noch nie den Douglas-Peucker-Algo benutzt.
Was ich bisher habe:
Am Anfang wird die Punktsequenz approximiert mittels Douglas-Peucker Algorithmus. Die so herausgefilterten Punkte werden nun untersucht.
Beispiel für Untersuchung:
Punkt p1 und p2 wurden durch Douglas Peucker herausgefiltert. p1 und p2 bilden eine gerade g1. Nun wird der Abstand jedes Punktes zwischen p1 und p2 zur geraden g1 berechnet. Diese werden alle aufaddiert und durch die Anzahl der Punkt zwischen p1 und p2 geteilt. Überschreitet der so ermittelte Wert eine bestimmte Grenze(die frei gewählt werden kann) nicht, handelt es sich um eine Gerade. Die Grenze ist dabei abhängig von der Länge der Geraden.
Wenn du damit den Douglas-Peuker Algo beschreiben möchtest, dann hast du etwas falsch verstanden (sofern ich bei Wikipedia richtig nachgelesen habe):
Um herauszufinden, ob die Gerade eine adäquate Näherung für deine Punktewolke ist, wird bei Wikipedia der größte Abstand eines Punktes aller Punkte zur Geraden als Kriterium verwendet. Du verwendest den Mittelwert der Abstände als Kriterium.
Ich weiß ja nicht, wie deine Punktwolken erzeugt werden, doch wenn es keine Ausreißer gibt, dann wäre in meinen Augen der größte Abstand als Kriterium besser als der Mittelwert der Abstände.