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

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

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

В первом подходе я пытался получить положения соответствующих пятен, чтобы получить относительные расстояния deltaX и deltaY. Затем эти расстояния я подгонял к расширению Тейлора до второго порядка T (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()

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

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

[Left.png]http://i.stack.imgur.com/oSTER.png [Right.png]http://i.stack.imgur.com/Njahj.png

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

ОБНОВЛЕНИЕ 1

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

$ \vec{r} + \vec{d}(\vec{r}) = \vec{r}\prime $

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

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

$ \left(\begin{array}{c}x \\ y\end{array}\right) + \left(\begin{array}{c}\Delta x(x,y) \\ \Delta y(x,y)\end{array}\right)=\left(\begin{array}{c}x\prime \\ y\prime \end{array}\right) $

Итак, я установил:

$ \Delta x(x,y) = K_0 + K_1\cdot x + K_2 \cdot y + K_3 \cdot x^2 + K_4 \cdot xy + K_5 \cdot y^2 $

а также

$ \Delta y(x,y) = K_6 + K_7\cdot x + K_8 \cdot y + K_9 \cdot x^2 + K_{10} \cdot xy + K_{11} \cdot y^2 $

Это имеет смысл для вас? Можно ли получить все дельта-х (х, у) и дельта-у (х, у) с взаимной корреляцией? Кросс-корреляция должна быть максимальной, если соответствующие пиксели связаны друг с другом через векторы смещения, верно?

ОБНОВЛЕНИЕ 2

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос