How can I calculate in MatLab similarity transformation between 4 points in 3D? I can calculate transform matrix from
T*X = Xp
,
but it will give me affine matrix due to small errors in points coordinates. How can I fit that matrix to similarity one? I need something like fitgeotrans
, but in 3D
Thanks
If I am interpreting your question correctly, you seek to find all coefficients in a 3D transformation matrix that will best warp one point to another. All you really have to do is put this problem into a linear system and solve. Recall that warping one point to another in 3D is simply:
s = (x,y,z)
is the source point,t = (x',y',z')
is the target point andA
would be the 3 x 3 transformation matrix that is formatted such that:Writing out the actual system of equations of
A*s = t
, we get:The coefficients in
A
are what we need to solve for. Re-writing this in matrix form, we get:Given that you have four points, you would simply concatenate rows of the matrix on the left side and the vector on the right
S
would now be a matrix that contains your four source points in the format shown above,a
is now a vector of the transformation coefficients in the matrix you want to solve (ordered in row-major format), andT
would be a vector of target points in the format shown above.To solve for the parameters, you simply have to use the
mldivide
operator or\
in MATLAB, which will compute the least squares estimate for you. Therefore:As such, simply build your matrix like above, then use the
\
operator to solve for your transformation parameters in your matrix. When you're done, reshapeT
into a 3 x 3 matrix. Therefore:With regards to your error in small perturbations of each of the co-ordinates, the more points you have the better. Using 4 will certainly give you a solution, but it isn't enough to mitigate any errors in my opinion.
Minor Note: This (more or less) is what
fitgeotrans
does under the hood. It computes the best homography given a bunch of source and target points, and determines this using least squares.Hope this answered your question!
The answer by @rayryeng is correct, given that you have a set of up to
3
points in a3-dimensional
space. If you need to transformm
points inn-dimensional
space (m>n
), then you first need to addm-n
coordinates to thesem
points such that they exist inm-dimensional
space (i.e. thea
matrix in @rayryeng becomes a square matrix)... Then the procedure described by @rayryeng will give you the exact transformation of points, you then just need to select only the coordinates of the transformed points in the originaln-dimensional
space.As an example, say you want to transform the points:
Notice that you have
m=5
points which aren=3
-dimensional. So you need to add coordinates to these points such that they aren=m=5
-dimensional, and then apply the procedure described by @rayryeng.I have implemented a function that does that (find it below). You just need to organize the points such that each of the source-points is a column in a matrix
u
, and each of the target points is a column in a matrixv
. The matricesu
andv
are going to be, thus,3
by5
each.WARNING:
the matrix A in the function may require A LOT of memory for moderately many points
nP
, because it hasnP^4
elements.To overcome this, for square matrices
u
andv
, you can simply useT=v*inv(u)
orT=v/u
in MATLAB notation.The code may run very slowly...
In MATLAB:
You can verify that
T
is correct by:The function that calculates the transformation matrix: