Регистрация изображения с использованием Python и кросс-корреляция

Я получил два изображения, показывающих точно такое же содержание: пятна 2D-гауссовой формы. Я называю эти два 16-битных png-файла «left.png» и «right.png». Но поскольку они получены с помощью немного другой оптической установки, соответствующие пятна (физически одинаковые) появляются в немного разных положениях. Это означает, что правая часть слегка растянута, искажена или что-то в этом роде нелинейным образом. Поэтому я хотел бы получить преобразование слева направо.

Итак, для каждого пикселя на левой стороне с его координатами x и y мне нужна функция, дающая мне компоненты вектора смещения, который указывает на соответствующий пиксель с правой стороны.

В предыдущем подходе я пытался получить положения соответствующих пятен, чтобы получить относительные расстояния deltaX и deltaY. Эти расстояния затем я приспособил к расширению Тейлора до второго порядка T (x, y), дав мне x- и y-компоненты вектора смещения для каждого пикселя (x, y) слева, указывая на соответствующий пиксель. (x ', y') справа.

Чтобы получить более общий результат, я хотел бы использовать нормализованную взаимную корреляцию. Для этого я умножаю каждое значение пикселя слева на соответствующее значение пикселя справа и суммирую эти произведения. Преобразование, которое я ищу, должно соединять пиксели, которые увеличивают сумму.Итак, когда сумма максимизирована, я знаю, что умножил соответствующие пиксели.

Я очень много пробовал с этим, но не вышло. Мой вопрос в том, есть ли у кого-нибудь из вас идея или когда-либо делал что-то подобное.

import numpy as np
import Image

left = np.array(Image.open('left.png'))
right = np.array(Image.open('right.png'))

# for normalization (http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation)    
left = (left - left.mean()) / left.std()
right = (right - right.mean()) / right.std()

Пожалуйста, дайте мне знать, могу ли я прояснить этот вопрос. Мне все еще нужно проверить, как задавать вопросы, используя латекс.

Большое спасибо за ваш вклад.

leftright

[left.png] http://i.stack.imgur.com/oSTER.png [right.png] http://i.stack.imgur.com/Njahj.png

Боюсь, в большинстве случаев 16-битные изображения выглядят просто черными (по крайней мере, в системах, которые я использую): (но, конечно, там есть данные.

ОБНОВЛЕНИЕ 1

Я пытаюсь прояснить свой вопрос. Я ищу векторное поле с векторами смещения, которые указывают от каждого пикселя в left.png до соответствующий пиксель в right.png . Моя проблема в том, что я не уверен в имеющихся ограничениях.

enter image description here

где вектор r (компоненты x и y) указывает на пиксель в left.png и вектор r- prime (компоненты x-prime и y-prime) указывает на соответствующий пиксель в right.png. для каждого r существует вектор смещения.

То, что я сделал раньше, заключалось в том, что я вручную нашел компоненты векторного поля d и подогнал их до полинома второй степени:

enter image description here

Итак, я подобрал:

enter image description here и

enter image description here

Имеет ли это смысл для вас? Возможно ли получить все дельта-x (x, y) и дельта-y (x, y) с взаимной корреляцией? Взаимная корреляция должна быть максимальной, если соответствующие пиксели связаны друг с другом посредством векторов смещения, верно?

ОБНОВЛЕНИЕ 2

Итак, алгоритм, о котором я думал, выглядит следующим образом:

  1. Deform right.png
  2. ] Получите значение взаимной корреляции
  3. Deform right.png дальше
  4. Получите значение взаимной корреляции и сравните со значением до
  5. Если оно больше, хорошая деформация, если нет, повторите деформацию и сделайте что-нибудь еще
  6. После максимизации значения взаимной корреляции узнайте, что это за деформация :)

О деформации: можно сделать сначала сдвиг по осям x и y, чтобы максимизировать взаимную корреляцию, затем на втором этапе растяжения или сжать x- и y-зависимые и на третьем шаге деформировать квадратично x- и y-зависимые и повторить эту процедуру итеративно ?? У меня действительно проблема с целочисленными координатами. Как вы думаете, мне нужно было бы интерполировать картинку, чтобы получить непрерывное распределение ?? Я должен подумать об этом еще раз :( Спасибо всем за участие :)

10
задан user4015990 8 May 2019 в 10:03
поделиться