2009-04-05 5 views
4

Ich habe eine Bilddatei einer Karte und einer kurvigen Straße, die mit einer fetten roten Linie markiert ist (breiter als 1 px, es gibt keine anderen roten Objekte auf dem Bild). Kann jemand bitte Schritte vorschlagen, wie man diese Straße als eine Linie erkennt und sie dann in eine Funktion y = f (x) umwandelt, so kann ich genaue Entfernungen messen. Ich habe keine Ahnung, wo ich anfangen soll ...Ich habe eine Straße auf der Karte. Wie konvertiert man es in eine Funktion?

Danke.

Antwort

2

Gehen Sie das Bild Pixel für Pixel durch und überprüfen Sie die Farbe jedes einzelnen. Wenn das Pixel rot ist, fügen Sie den Punkt (x/y-Koordinaten) zu einer Liste von Punkten hinzu, aus denen die Straße besteht.

Ich bin mir nicht sicher, was Sie mit der Funktion meinen. Soll ein Polynom oder eine Funktion bestimmen, ob ein bestimmter Punkt auf der Straße ist oder nicht? Suchen Sie im ersten Fall nach einer mathematischen Bibliothek mit einer Kurvenanpassungsfunktion, die eine Reihe von Punkten enthält und Ihnen das Polynom zurückgibt, das am besten zu diesen Punkten passt. Ich vermute jedoch, dass Sie das letztere wahrscheinlich wollen. In diesem Fall muss die Funktion die fraglichen Koordinaten nehmen und durch Ihre Punktmenge suchen, um festzustellen, ob der Punkt in der Menge ist. Dies wäre am schnellsten, wenn Sie eine Karte/einen Hash verwenden, der die Koordinaten in einen Schlüssel codiert, den Sie mit einer O (1) -Operation nachschlagen könnten.

+0

Danke. Ich muss Entfernungen messen, also brauche ich wahrscheinlich Kurvenanpassungsalgorithmus. Zum Beispiel muss ich herausfinden, wo sich 50% der Entfernung auf der Straße befinden. – serg

+0

Sie können dies tun, indem Sie die Punkte auf der Linie zwischen den zwei Punkten berechnen und prüfen, ob mehr als die Hälfte von ihnen in Ihrem Punkt festgelegt ist. Sie brauchen dafür kein Polynom. Tatsächlich ist ein Polynom bestenfalls eine Annäherung und wäre weniger genau. – tvanfosson

+0

Sorry, ich habe es nicht verstanden. Welche zwei Punkte meinst du? Die Straße ist nicht gerade, und sie hat eine (leicht) variable Breite. Wenn sie an einigen Stellen breiter ist, würde das den Abstandsmessalgorithmus beeinflussen, da es mehr rote Punkte gibt, obwohl die Straße nicht länger ist. – serg

1

Versuchen Sie nachschlagen interpolations. Ich habe etwas Ähnliches verwendet, worüber du in einem Physiksimulator sprichst. Dafür müssen Sie einige allgemeine Punkte finden, um die Straße darzustellen, die alle einen konstanten Abstand voneinander haben. Sie können dann jeden Satz von 3 Punkten einer quadratischen Gleichung zuordnen (einfach, wenn die Punkte gleichmäßig getrennt sind). Danach müssen Sie die benachbarten Gleichungen interpolieren. Ich habe einen Code, den Sie verwenden können, wenn Sie möchten.

+0

Das Problem mit der Interpolation ist, dass es durch alle Punkte gehen muss, und ich habe keine genauen Daten dafür, weil die Straße breit ist. – serg

+0

Warum finden Sie den Punkt für die Mitte der Straße nicht, je nach erforderlicher Genauigkeit, je nach Pixel? –

+0

Wie finde ich den Mittelpunkt? Um die Mitte zu finden, muss ich zuerst die Richtung finden. Wenn sich die Straße in horizontaler Richtung befindet, befindet sich die Mitte zwischen den oberen und unteren Pixeln und in der vertikalen Mitte zwischen den linken und rechten Pixeln. – serg

0

Sie könnten Gleichungen für die Kanten beider Seiten finden und die Mitte von denen finden, da Sie jetzt die Richtung kennen. Danach können Sie die Punkte in eine neue Gleichung einpassen.

EDIT: Ich denke, das ist ähnlich der Erosion Artikel von einem Kommentator hingewiesen. Here ist der Link (anscheinend wurde der angegebene Link unterbrochen).