2011-01-14 2 views
4

Die parametrische Grenze eines Objekts kann in Matlab mithilfe der Funktion bwtraceboundary extrahiert werden. Sie gibt eine Q-mal-2-Matrix B zurück, wobei Q die Anzahl der Grenzpixel für das Objekt ist und die erste und die zweite Spalte die Zeilen- bzw. Spaltenkoordinaten der Grenzpixel speichern.Wie kann ich die parametrische Grenze eines Objekts mit N Punkten abtasten, was zu Teilen mit gleicher Bogenlänge führt?

Was ich tun möchte, ist, diese Grenze der Q-Elemente durch N Punkte zu probieren, die die ursprüngliche Grenze in Segmente gleicher Bogenlänge teilen.

Eine einfache Lösung, die ich dachte, besteht darin, die Länge L der Grenze zu berechnen, indem man den Abstand aller zwei aufeinanderfolgenden Grenzpixel summiert. Diese Abstände sind entweder 1 oder 2. Dann teile ich L durch N, um die gewünschte Länge der Bögen zu finden. Schließlich iteriere ich über die Grenze und summiere den Abstand aller zwei aufeinanderfolgenden Grenzpixel. Wenn die Summe größer oder gleich der gewünschten Bogenlänge ist, wird das aktuelle Grenzpixel als eines der N ausgewählt, das die abgetastete Grenze bilden wird.

Ist das eine gute Lösung? Gibt es eine effizientere/einfachere Lösung?

Antwort

5

Im Laufe der Jahre habe ich diese Frage scheinbar unendlich oft gesehen. Also habe ich ein kleines Tool geschrieben, das genau das tun wird. Probieren Sie einen stückweise linearen oder sogar einen krummlinigen (spline) Bogen in einer allgemeinen Anzahl von Dimensionen aus, so dass die aufeinanderfolgenden Punkte in einem gleichförmigen oder spezifizierten Abstand entlang diesem Bogen liegen.

Im Fall der Verwendung von nur stückweise linearen Bögen ist dies ziemlich einfach. Sie summieren die Gesamtbogenlänge der Kurve und führen dann eine Interpolation in Bogenlänge durch, aber da bekannt ist, dass sie stückweise linear ist, erfordert sie nur eine lineare Interpolation entlang dieser Länge als eine Funktion der kumulativen Bogenlänge.

Im Falle eines gekrümmten Bogens ist es am einfachsten, die Lösung eines Systems gewöhnlicher Differentialgleichungen zu finden und auf Ereignisse auf dem Weg zu achten. ODE45 macht das gut.

Sie können interparc, wie auf dem MATLAB Central File Exchange zu finden, dies für Sie tun, oder wenn Sie lernen möchten, es für den einfachen stückweise linearen Fall zu tun, lesen Sie den ersten Teil des Codes, wo ich Führen Sie die stückweise lineare Bogenlängeninterpolation durch. Eine nette Sache ist, dass der lineare Fall in einer vollständig vektorisierten Form erfolgt, so dass keine expliziten Schleifen notwendig sind.

Verwandte Themen