Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linear shift between 2 sets of coordinates

My Problem is the following:

For my work I need to compare images of scanned photographic plates with a catalogue of a sample of known stars within the general area of the sky the plates cover (I call it the master catalogue). To that end I extract information, like the brightness on the image and the position in the sky, of the objects in the images and save it in tables. I then use python to create a polynomial fit for the calibration of the magnitude of the stars in the image. That works up to a certain accuracy pretty well, but unfortunately not well enough, since there is a small shift between the coordinates the object has in the photographic plates and in the master catalogue.

Here the green circles indicate the positions (center of the circle) of objects in the master catalogue. As you can see the actual stars are always situated to the upper left of the objects in the master catalogue.

I have looked a little bit in the comparison of images (i.e. How to detect a shift between images) but I'm a little at a loss now, because I'm not actually comparing images but arrays with the coordinates of the objects. An additional problem here is that (as you can see in the image) there are objects in the master catalogue that are not visible on the plates and not all plates have the same depth (meaning some show more stars than others do).

What I would like to know is a way to find and correct the linear shift between the 2 arrays of different size of coordinates in python. There shouldn't be any rotations, so it is just a shift in x and y directions. The arrays are normal numpy recarrays.

like image 379
Christoph Pohl Avatar asked Mar 12 '16 21:03

Christoph Pohl


3 Answers

I would change @OphirYoktan's suggestion slightly. You have these circles. I assume you know the radius, and you have that radius value for a reason.

Instead of randomly choosing points, filter the master catalog for x,y within radius of your sample. Then compute however many vectors you need to compute for all possible master catalog entries within range of your sample. Do the same thing repeatedly, then collect a histogram of the vectors. Presumably a small number will occur repeatedly, those are the likely true translations. (Ideally, "small number" == 1.)

like image 103
aghast Avatar answered Nov 14 '22 03:11

aghast


There are several possible solutions Note - these are high level pointers, you'll need some work to convert it to working code

The original solution (cross correlation) can be adapted to the current data structure, and should work

A believe that RANSAC will be better in your case basically it means: create a model based on a small number of data points (the minimal number that are required to define a relevant model), and verify it's correctness using the full data set.

specifically, if you have only translation to consider (and not scale):

  1. select one of your points
  2. match it to a random point in the catalog [you may do "educated guesses", if you have some prior about what translation is more likely]
  3. this matching gives you the translation
  4. verify this translation matches the rest of your points
  5. repeat until you find a good match
like image 23
Ophir Yoktan Avatar answered Nov 14 '22 05:11

Ophir Yoktan


I'm assuming here the objects aren't necessarily in the same order in both the photo plate and master catalogue.

Consider the set of position vectors, A, of the objects in the photo plate, and the set of position vectors, B, of the objects in the master catalogue. You're looking for a vector, v, such that for each a in A, a + v is approximately some element in b.

The most obvious algorithm to me would be to say for each a, for each b, let v = b - a. Now, for each element in A, check that there is a corresponding element in B that is sufficiently close (within some distance e that you choose) to that element + v. Once you find the v that meets this condition, v is your shift.

like image 24
Jacob Weightman Avatar answered Nov 14 '22 04:11

Jacob Weightman