Ich habe zwei Sätze ( sourc
und target
) von Punkten (x,y)
, die ich ausrichten möchte. Was ich bisher gemacht habe ist:
- Finden Sie den Schwerpunkt jedes Punktesatzes
- Verwenden Sie den Unterschied zwischen den Zentroiden-Übersetzungen, den Punkt in
x
undy
Ich möchte die beste Drehung (in Grad) finden, um die Punkte auszurichten .
Irgendeine Idee?
Der M-Code befindet sich unten (mit Darstellungen zur Visualisierung der Änderungen):
# Raw data
## Source data
sourc = matrix(
c(712,960,968,1200,360,644,84,360), # the data elements
nrow=2, byrow = TRUE)
## Target data
target = matrix(
c(744,996,980,1220,364,644,68,336), # the data elements
nrow=2, byrow = TRUE)
# Get the centroids
sCentroid <- c(mean(sourc[1,]), mean(sourc[2,])) # Source centroid
tCentroid <- c(mean(target[1,]), mean(target[2,])) # Target centroid
# Visualize the points
par(mfrow=c(2,2))
plot(sourc[1,], sourc[2,], col="green", pch=20, main="Raw Data",
lwd=5, xlim=range(sourceX, targetX),
ylim=range(sourceY, targetY))
points(target[1,], target[2,], col="red", pch=20, lwd=5)
points(sCentroid[1], sCentroid[2], col="green", pch=4, lwd=2)
points(tCentroid[1], tCentroid[2], col="red", pch=4, lwd=2)
# Find the translation
translation <- tCentroid - sCentroid
target[1,] <- target[1,] - translation[1]
target[2,] <- target[2,] - translation[2]
# Get the translated centroids
tCentroid <- c(mean(target[1,]), mean(target[2,])) # Target centroid
# Visualize the translation
plot(sourc[1,], sourc[2,], col="green", pch=20, main="After Translation",
lwd=5, xlim=range(sourceX, targetX),
ylim=range(sourceY, targetY))
points(target[1,], target[2,], col="red", pch=20, lwd=5)
points(sCentroid[1], sCentroid[2], col="green", pch=4, lwd=2)
points(tCentroid[1], tCentroid[2], col="red", pch=4, lwd=2)
source
und Großbuchstaben für Vektor stehentarget
) Ich habe diese Möglichkeit nicht erwähnt und ausdrücklich erlaubt oder nicht erlaubt gesehen. Bist du sicher, dass du das nicht besser passen willst?Antworten:
Dies kann mit dem Kabsch-Algorithmus erfolgen . Der Algorithmus findet die beste Schätzung der kleinsten Quadrate für die Rotation vonRX−Y wo R ist Rotationsmatrix, X und Y sind Ihre Ziel- und Quellmatrizen mit 2 Zeilen und n Spalten.
In [ 1 ] wird gezeigt, dass dieses Problem durch Singularwertzerlegung gelöst werden kann. Der Algorithmus ist wie folgt:
Ich kenne keine Implementierung in R, deshalb habe ich unten eine kleine Funktion geschrieben.
Ihre ersten Punkte:
Kabsch-Algorithmus in einer R-Funktion:
Zentrieren Sie die Punkte:
Rotation erhalten:
Ergebnis (schwarz - Originalquelle, rot - ursprüngliches Ziel, grün - gedrehtes Ziel)
[1] http://www.math.pku.edu.cn/teachers/yaoy/Fall2011/arun.pdf
quelle
Ich habe dies mit einer iterativen Optimalsuche gemacht und 2 Versionen getestet.φ zwischen 0 und 2π und für jeden Winkel berechnete ich das Fehlerkriterium unter Verwendung der Differenz zwischen den gedrehten D=rot(cSRC,φ)−cTAR .
Ich habe die ursprünglichen Arrays genommen und sie zentriert, indem ich diese Arrays
cSRC
und nanntecTAR
. Dann habe ich eine Schleife mit Winkeln gemachtIn Version 1) habe ich als Kriterium die Quadratsumme aller Einträge in genommenD wie
kabsch2d
Prozedur in der Antwort von @Karolis.In Version 2) habe ich als Kriterium die Summe der absoluten Entfernungen genommen, dh die Summe
Ich weiß nicht, welches Kriterium besser zu Ihren Bedürfnissen passt.
Hier sind einige Ergebnisse aus dem Protokoll.
quelle