Asked by Yangfan Peng
on 7 Oct 2019

Hello,

I have 10 points with x and y coordinate (cell locations imaged with microscope). I have used two different methods to image these cells, so I have two sets of coordinates that could be rotated, sheared, shifted, mirrored to each other. I would like to assign each point from one coordinate system to the matching point in the other coordinate system. How can I do that? In theory, some kind of transformation optimizing minimum distance between the points would be desirable.

In the end I would like to assign properties I obtained from the cells in one method to properties obtained with the other method.

Thank you.

Answer by Bruno Luong
on 8 Oct 2019

Look for the literature of image registration.

For simple rotation/scaling/translation you can use Matt J's submission

For more complex deformation, you need to apply spline deformation

There are a bunch of intermediate method for camera which take into account for camera cushion distortion or higher order. Pick one that is suitable for your need.

Matt J
on 8 Oct 2019

See also, fitgeotrans

Yangfan Peng
on 8 Oct 2019

Sign in to comment.

Answer by Matt J
on 8 Oct 2019

Edited by Matt J
on 8 Oct 2019

If the shear component of the deformation isn't too strong, the matchpoints function defined below might work. It will sort the rows of B to correspond with A and also return the corresponding permutation indices. It relies on absor, mentioned by Bruno, which you will have to download

function [permIndices,Bsorted]=matchpoints(A,B)

%

%IN:

%

% A: an Nx2 matrix of points

% B: an Nx2 matrix of points from A transformed and unordered

%

%OUT:

%

% permIndices: permutation indices of rows of B thought to match A

% Bsorted: the Nx2 permuted version of B

La=landmarks(A);

Lb=landmarks(B);

B3=B.'; B3(3,:)=0;

reg=absor( Lb,La,'doScale',1);

C3=(reg.s*reg.R)*B3+reg.t;

C=C3(1:2,:).';

[~,permIndices]=pdist2(C,A,'euclidean','Smallest',1);

if nargout>1

Bsorted=B(permIndices,:);

end

function L=landmarks(P)

G=pdist2(P,P); G(~G)=nan;

[i,j]=find( G==min(G(:)) ,1);

I=P(i,:);

J=P(j,:);

K=mean(P,1);

if norm(I-K)<norm(J-K)

[I,J]=deal(J,I);

end

L=[I;J;K].';

L(3,:)=0;

end

end

Applying it to your example data, I obtain,

A = [376 455;421 489;465 537;353 512;355 535;329 571;377 593;417 598;482 575;355 634];

B = [168 88;107 138;69 194;126 229;163 232;199 267;272 239;228 210;235 155;215 68];

[permIndices,Bsorted]=matchpoints(A,B)

plot(graph(1:10,1:10),'EdgeColor','none','XData',A(:,1),'YData',A(:,2));

hold on

plot(graph(1:10,1:10),'EdgeColor','none','XData',Bsorted(:,1),'YData',Bsorted(:,2));

hold off

Opportunities for recent engineering grads.

Apply Today
## 7 Comments

## darova (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753585

## Yangfan Peng (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753726

## darova (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753773

## Yangfan Peng (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753938

## Matt J (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753950

## darova (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753965

## Yangfan Peng (view profile)

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/484039-find-matching-points-from-two-coordinate-systems#comment_753970

Sign in to comment.