Линейный сдвиг между двумя наборами координат
Моя проблема заключается в следующем:
Для своей работы мне нужно сравнить изображения отсканированных фотопластинок с каталогом образцов известных звезд в пределах общей области неба, которую покрывают пластины (я называю это главным каталогом). Для этого я извлекаю информацию, например, яркость изображения и положение на небе, объектов на изображениях и сохраняю ее в таблицах. Затем я использую python для создания полиномиальной подгонки для калибровки величины звезд на изображении. Это работает с определенной точностью довольно хорошо, но, к сожалению, недостаточно хорошо, поскольку существует небольшой сдвиг между координатами объекта на фотопластинках и в мастер-каталоге.
Здесь зеленые кружки указывают позиции (центр круга) объектов в главном каталоге. Как вы можете видеть, настоящие звезды всегда расположены слева вверху от объектов в главном каталоге.
Я немного посмотрел при сравнении изображений (например, как определить сдвиг между изображениями), но сейчас я немного растерялся, потому что я на самом деле не сравниваю изображения, а собираю массивы с координатами объектов. Дополнительная проблема здесь заключается в том, что (как вы можете видеть на изображении) в главном каталоге есть объекты, которые не видны на пластинах, и не все пластины имеют одинаковую глубину (то есть некоторые показывают больше звезд, чем другие).
То, что я хотел бы знать, - это способ найти и исправить линейный сдвиг между двумя массивами координат разного размера в python. Не должно быть никаких поворотов, так что это просто сдвиг в направлениях x и y. Массивы - это обычные массивы.
3 ответа
Я бы немного изменил предложение @OphirYoktan. У вас есть эти круги. Я предполагаю, что вы знаете радиус, и у вас есть значение этого радиуса по причине.
Вместо случайного выбора точек отфильтруйте главный каталог по x,y в радиусе вашего образца. Затем вычислите столько векторов, сколько вам нужно вычислить для всех возможных записей главного каталога в пределах диапазона вашего образца. Сделайте то же самое несколько раз, затем соберите гистограмму векторов. Предположительно, небольшое количество будет встречаться неоднократно, это вероятные истинные переводы. (В идеале "небольшое число" == 1.)
Я предполагаю, что здесь объекты не обязательно находятся в одинаковом порядке как в фотопластинке, так и в основном каталоге.
Рассмотрим набор векторов положения A объектов на фотопластине и набор векторов положения B объектов в главном каталоге. Вы ищете вектор v, такой, что для каждого a в A, a + v является приблизительно некоторым элементом в b.
Самым очевидным алгоритмом для меня было бы сказать, что для каждого a, для каждого b пусть v = b - a. Теперь, для каждого элемента в A, проверьте, что есть соответствующий элемент в B, который достаточно близко (в пределах некоторого расстояния e, которое вы выбираете) к этому элементу + v. Как только вы найдете v, удовлетворяющее этому условию, v - это ваша смена.
Существует несколько возможных решений. Примечание. Это высокоуровневые указатели, вам потребуется некоторая работа, чтобы преобразовать их в рабочий код.
Исходное решение (взаимная корреляция) может быть адаптировано к текущей структуре данных и должно работать
Полагать, что RANSAC будет лучше в вашем случае, в основном это означает: создать модель, основанную на небольшом количестве точек данных (минимальное число, необходимое для определения соответствующей модели), и проверить ее правильность, используя полный набор данных.
в частности, если вам нужно рассмотреть только перевод (а не масштаб):
- выберите одну из ваших точек
- сопоставьте его со случайной точкой в каталоге [вы можете делать "догадки", если у вас есть предварительные сведения о том, какой перевод более вероятен]
- это соответствие дает вам перевод
- убедитесь, что этот перевод соответствует остальным вашим точкам
- повторяйте, пока не найдете хорошее совпадение