Tìm góc quay giữa tập hợp các điểm


8

Tôi có hai bộ ( sourctarget) các điểm (x,y)mà tôi muốn căn chỉnh. Những gì tôi đã làm cho đến nay là:

  • tìm trọng tâm của từng bộ điểm
  • sử dụng sự khác biệt giữa các bản dịch trung tâm điểm trong xy

Những gì tôi muốn là tìm vòng quay tốt nhất (tính theo độ) để căn chỉnh các điểm .

Bất kỳ ý tưởng?

Mã M ở bên dưới (với các sơ đồ để trực quan hóa các thay đổi):

# 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)

5
Tôi không thể đọc mã của bạn, nhưng thao tác bạn cần được gọi là xoay vòng Procrustes. Bạn đã nghe nói về nó? Nó hoạt động khi các điểm đã được ghép nối ( ). Các thao tác tùy chọn trước khi quay bao gồm dịch và chia tỷ lệ, và cân bằng sau quay tùy chọn. xi,yi
ttnphns

3
Một hồi quy phức tạp sẽ làm công việc.
whuber

Tôi đã thấy rằng, xoay hệ thống khoảng 180 độ, sau đó các cặp trở thành hàng xóm - và điều này thậm chí còn phù hợp hơn so với sự phù hợp nhất của bản gốc (trong đó các chữ cái nhỏ tượng trưng cho vectơ và chữ in hoa cho vectơ ) Tôi chưa thấy điều này khả năng được đề cập và cho phép rõ ràng hoặc không được phép. Bạn có chắc chắn rằng bạn không muốn điều đó tốt hơn? (a,C),(b,D),(c,A),(d,B)(a,A),(b,B),(c,C),(d,D) sourcetarget
Gottfried Helms

Câu trả lời:


4

Điều này có thể được thực hiện bằng cách sử dụng Thuật toán Kabsch . Thuật toán tìm ước lượng bình phương nhỏ nhất cho phép quay của trong đó là ma trận xoay, và là ma trận đích và ma trận nguồn của bạn với 2 hàng và n cột.RXYRXY

Trong [ 1 ] cho thấy vấn đề này có thể được giải quyết bằng cách sử dụng phân tách giá trị số ít. Thuật toán như sau:

  1. Trung tâm các bộ dữ liệu để trọng tâm của chúng là nguồn gốc.
  2. Tính toán "hiệp phương sai" ma trận = .CXYT
  3. Lấy Số ít giá trị gia tăng phân hủy của .C=UDVT
  4. Điều chỉnh hướng .d=sign(det(C))
  5. Sau đó, vòng quay tối ưuR=V(100d)UT

Tôi không biết về bất kỳ triển khai nào trong R nên đã viết một hàm nhỏ bên dưới.

Điểm ban đầu của bạn:

src <- matrix(c(712,960,968,1200,360,644,84,360), nrow=2, byrow=TRUE)
trg <- matrix(c(744,996,980,1220,364,644,68,336), nrow=2, byrow=TRUE)

Thuật toán Kabsch trong một chức năng R:

kabsch2d <- function(Y, X) {
  X   <- X-rowMeans(X)
  Y   <- Y-rowMeans(Y)
  C   <- X %*% t(Y)
  SVD <- svd(C)
  D   <- diag(c(1, sign(det(C))))
  t(SVD$v) %*% D %*% t(SVD$u)
}

Trung tâm các điểm:

src <- src-rowMeans(src)
trg <- trg-rowMeans(trg)

Có được vòng quay:

rot <- kabsch2d(src, trg)

Kết quả (đen - nguồn gốc, đỏ - đích ban đầu, xanh lục - mục tiêu xoay)

plot(t(src), col="black", pch=19)
points(t(trg), col="red", pch=19)
points(t(rot %*% trg), col="green", pch=19)

nhập mô tả hình ảnh ở đây

[1] http://www.math.pku.edu.cn/teachers/yaoy/Fall2011/arun.pdf


1
+1. Tuy nhiên, câu trả lời có thể tốt hơn nhiều nếu bạn đưa vào diễn ngôn về cách thức thuật toán liên quan đến vấn đề xoay Procrustes nổi tiếng.
ttnphns 19/03/2016

1

Tôi đã thực hiện điều này với một tìm kiếm tối ưu lặp lại và đã thử nghiệm 2 phiên bản.
Tôi đã lấy các mảng ban đầu và tập trung chúng gọi các mảng này cSRCcTAR. Sau đó, tôi đã thực hiện một vòng lặp với các góc trong khoảng từ đến và với mỗi góc tôi đã tính toán tiêu chí lỗi bằng cách sử dụng sự khác biệt giữa xoay .φ02πD=rot(cSRC,φ)cTAR

  1. Trong phiên bản 1) Tôi lấy tiêu chí là tổng bình phương của tất cả các mục trong là và góc mà tại đó xảy ra lỗi tối thiểu tương đương với -procedure trong câu trả lời của @Karolis. D

    err1=k=14((Dk,1)2+(Dk,2)2)
    φkabsch2d
  2. Trong phiên bản 2) Tôi lấy tiêu chí là tổng khoảng cách tuyệt đối, điều đó có nghĩa là tổng và có góc xoay hơi khác cho lỗi nhỏ nhất.

    err2=k=14(Dk,1)2+(Dk,2)2
    φ

Tôi không biết, tiêu chí nào phù hợp với nhu cầu của bạn hơn.

Dưới đây là một số kết quả từ giao thức.

version 1version 2φ0.048953040.05093647rotation[0.998802040.048933490.048933490.99880204][0.998703020.050914440.050914440.99870302]distances[6.800772660.862097392.799245519.337825000.613095226.941565204.614622373.25835719][6.780177510.370624043.357873079.365748741.164591156.953245274.586895592.78312752]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.