Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.09.2014, 13:29

Linie aus Punkten erstellen / filtern

Hi Leute,

gestern hatte ich schon einmal versucht ein Thema zu eröffnen, aber leider alles gelöscht-.- Deshalb heute ein neuer Versuch, in dem ich erstmal alle Randinfos weglasse und mich versuche auf das Wesentliche zu konzentrieren.

Ich habe ein komplett unsortierte Liste aus Punkten, die gemessene Punkte einer Art "Tunnelwand" repräsentieren. Ich möchte nun aus diesen Punkten diese Wand rekonstruieren.
(Die Wand ist überings in echt komplett glatt, Ausschläge sind meist Messfehlern und Ungenauigkeiten zu verschulden.)
Das funktioniert auch alles soweit sehr gut (Sortieralgortihmus, anschließende Glättung, usw...). Allerdings kommt es beim manchen Messungen vor, dass mein Algorithmus fehlt schlägt, da es extreme Ausschläge gibt. Ein Beispielbild habe ich mal angehängt. Die roten Punkte sind die gemessene Punkte und die Linie soll ungefähr das erwünschte Ergebnis darstellen.
Mein Sortieralgorithmus ist denkbar simpel: Ich fange mit dem ersten Punkt an (der bekannt ist!) und gehe von diesem zum nähsten unbesuchten Punkt. Von diesem wird wieder der nähste unbesuchte Punkt gesucht usw. Offensichtlich ist dies aber nicht die beste Lösung, da ich so teilweise falsche Konstrukte bekomme. Meine anschließende Glättung kann viel davon ausmerzen, aber leider nicht alles. So zum Beispiel der "Zacken" links in der Kurve. Dies sind definitiv fehlerhafte Messwerte. Wie ich diese aber entfernen kann ist mir unklar. Manuelle Entfernung zur Optimierung des Algortihmus ist für mich nur eine unbefriedigende Notlösung..

Hat jemand von euch mit einem ähnlichen Problem zu tun und hat wertvolle Tipps für mich bzgl. der Sortierung, Filterung solcher Punkte?
Vielen Dank im Voraus
»Sucker« hat folgendes Bild angehängt:
  • pfad.png

2

13.09.2014, 15:39

Woah, hört sich kniffelig an. Hört sich ganz grob nach: Machine Learning an. Was ich bisher in die Richtung gemacht habe, war halt Kurven mit Parametern reinzufitten. Eine Gerade oder ein Polynom durch eine Menge Punkte zu legen ist halt nicht so schwer, wenn es aber eine beliebige Kurve sein soll, wird es aber vermutlich echt schwierig. Man will ja vermutlich am Ende eine Art Bézier-Kurve bekomme.

Ich hätte spontan noch folgende Idee: Du erstellst aus den Punkten ein Bitmap und benutzt einen Vektorisierungsalgorithmus (Inkscape kann sowas glaube ich). Du kannst ja unterschiedlich große Kreise für jeden Punkt erstellen, evtl. auch welche die zum Rand hin weich ausblenden. Dadurch wird das Bild dort wo viele Punkte sind dunkler. Bevor du es vektorisiert kannst du dann noch den Kontrast erhöhen, so könntest du vielleicht Ausreißer entfernt bekommen.

Oder ansonsten in entsprechenden Wissenschaftscommunities nachfragen, welche Algorithmen die verwenden würde. Ich bin mir sicher, dass es ein bekanntes Problem ist, aber definitiv kein besonders einfaches.
Lieber dumm fragen, als dumm bleiben!

3

13.09.2014, 15:48

Wegen der Ausreißer: Ich bin mir nicht sicher ob es wirklich hilft, aber du könntest auch ein Mean-Shift ausprobieren. Also für jeden Punkt den Mittelpunkt der umliegenden Punkte bestimmen und ihn in diese Richtung bewegen. Bei einer gleichmäßigen Linie würden die Punkte dann in die Richtung der Linie verschoben. Das würde natürlich ausgerechnet in Kurven nicht besonders toll funktionieren, weil sie dadurch immer noch innerhalb der Kurve liegen würden. Man müsste halt die Parameter sehr vorsichtig anpassen (die Größe der Umgebungssuche der Geometrie der zu findenden Kurve anpassen - dafür muss man natürlich eine Vermutung haben, wie groß die Kurve in etwa ist). Ist natürlich fraglich, ob man das in einer vollautomatischen Pipeline benutzen kann, aber einen versuch wert wäre es vielleicht.
Lieber dumm fragen, als dumm bleiben!

4

14.09.2014, 19:55

Hey Jonathan,

danke für deine Gedanken und Tipps! :)
Mein Beispielanhang ist vielleicht etwas doof geworden, denn tatsächlich habe ich nicht EINE Kurve, sondern wirklich einen eventuell viel größeren Verlauf. Man kann sich das ganze als Kanalsystem vorstellen, in dem es gerade Rohre gibt und Bögen (90° links oder rechts) und nach Baukastenprinzip aufgebaut ist. Deshalb ist es recht schwierig eine komplette Wand durch eine Bezierkurve oder Ähnliches darzustellen...
Mean-Shift klingt tatsächlich interessant, vielleicht kann ich damit etwas anfangen. Ob es wirklich so funktioniert, wie ich es gerne hätte, kann ich aber erst nach ausreichendem Testen sagen. Danke für die Anregung!
Grüße

5

19.09.2014, 22:22

Vielleicht ist das ja was für dich:
http://de.wikipedia.org/wiki/Maximum-Likelihood-Methode
Hat bei mir Höhenprofile an AFM- bzw Profilometerdaten gefittet.

Hast du andererseits Informationen über charakteristische Längenskalen der "Wand" oder über die Art der Fehler (statistisch, systematisch, wie verteilt, ...)?
Du kannst dir in den Numerical Recipes auch mal das Kapitel über robust estimation durchlesen. Falls deine Fehler nicht normalverteilt sind, dürfte das wohl das Mittel der Wahl sein.

Ansonsten: Hast du schon einen Median mit einer sinnvollen Anzahl Punkten (~Längenskala deines Systems) versucht? Der ist Stabil gegenüber ausreissern aber Kantenerhaltend.

Falls deine Messpunkte ähnlich gleiches spacing haben: schau dir für jeden Punkt den mittleren Abstand zu den nächsten N Nachbarn an. Je größer der ist, desto wahrschenlicher ist der Punkt ein Ausreisser.

Sobald du ein "Fehlermaß" für deine Punkte gefunden hast: Gewichtete Splines dürfte das Mittel der Wahl als Funktion sein, sofern du keinen sinnvollen analytischen Ausdruck finden kannst. Als Wichtungsfaktoren setzt du das inverse des Fehlers und bekommst so einen sinnvollen Graphen.


So Far...
Laguna
Portfolio runvs.io | Gamejolt | itch.io | PEWN | Twitter

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Laguna« (19.09.2014, 22:49)


Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

6

20.09.2014, 10:43

Also was man in der Regel macht beim Fitten von Linien, Kreisen, oder sonstigen Körpern/Modellen macht ist RANSAC. Einfach mal googlen und ausprobieren. Ich hatte mit RANSAC schon sehr gute Ergebnisse beim Fitten von 3D Linien durch Punktewolken oder bei der Schätzung von Kameraposen aufgrund von Punktkorrespondenzen

7

20.09.2014, 11:42

Danke euch allen für euren tollen Vorschläge!

Ich habe jetzt einiges ausprobiert und verwende folgendes, was bisher echt ganz gut und zuverlässig funktioniert:
RANSAC war echt ein guter Tipp (wobei die Idee dahinter ja denkbar logisch ist). Durch mein sehr hohe Punktezahl und aufwändigen Algorithmus zur Erstellung des Modells, ist mir dieses Verfahren im Ganzen zu speicher- und vor allem zeitintensiv. Dahinter verwende ich gerade nur das (etwas abgeänderte) Grundprinzip mit den Grenzwerten bzgl. des Abstandes zur Kurve.
Auf der anderen Seite muss ich aufpassen, dass ich nicht zu viele Ausreisser "wegschmeisse", denn dadurch das die Messung generell nicht 100% genau ist, ist so gut wie jeder Punkt wertvoll für das Modell. Nachdem ich die Punkte gefiltert habe und die Linie ziehe, mache ich jetzt also folgendes:
Mein Algorithmus dazu (siehe 1. Post) nimmt nur den nächsten Punkt, wenn dessen Winkel maximal x Grad Abstand zum Durchschnittswinkel der letzten n Punkte hat. (x ist am besten immer <= 90°, d.h. nächster Punkt muss immer mindestens auf gleicher Höhe liegen, nie aber hinter dem lertzten Punkt). Dadurch stelle ich sicher, dass auch Messreihen erfolgreich durchlaufen, die grobe Ausreisser haben un einfach durch die "Naivität" des Algorithmus falsche Verläufen nahmen. Jetzt ist das Problem allerdings, das mit der Methode viele Punkte (die keine Ausreisser sind) durch das Raster fallen, obwohl sie eventuell die Genauigkeit des Modells noch verbessern könnten. Dies hat mir ganz gut geholfen: Ich nehme alle diese Punkte, die noch nicht einer Wand zugeordnet wurden und suche ihnen den nächsten Punkt im Modell. Ist dieser Abstand <= x cm, dann sehe ich den Punkt als "einbringungswert" und füge ihn in die Liste neben dem nächsten Punkt ein. Dadurch wird eine vorher schon recht gerade Linie zwar etwas "krieselig", liefert aber im Endeffekt das realitätsnahere Ergebnis, da ich eh noch auf verschiedenste Arten die fertige Linie/Modell glätte und postprocesse.
Ich habe mal ein Bild angehängt, wo ich zeige, wie das Ganze jetzt an einem Beispiel aussieht.
Oben aus Vogelperspektive und unten in 3D.

Liebe Grüße
»Sucker« hat folgendes Bild angehängt:
  • examples.png

Werbeanzeige