Я получил два изображения, показывающие абсолютно одинаковый контент: пятна в 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()
Пожалуйста, дайте мне знать, если я смогу прояснить этот вопрос. Я все еще должен проверить, как отправлять вопросы, используя латекс.
Большое спасибо за вклад.
[left.png] http://i.stack.imgur.com/oSTER.png [right.png] http://i.stack.imgur.com/Njahj.png
Боюсь, в большинстве случаев 16-битные изображения выглядят просто черными (по крайней мере, в системах, которые я использую) :( но, конечно, там есть данные.
ОБНОВЛЕНИЕ 1
Я пытаюсь прояснить свой вопрос. Я ищу векторное поле с векторами смещения, которые указывают от каждого пикселя в left.png к соответствующему пикселю в right.png. Моя проблема в том, что я не уверен насчет ограничений, которые у меня есть.
где вектор r (компоненты x и y) указывает на пиксель в left.png, а вектор r-prime (компоненты x- prime и y-prime) указывает на соответствующий пиксель в right.png. для каждого r существует вектор смещения.
Ранее я обнаружил, что вручную нашел компоненты векторного поля d и подогнал их до полинома второй степени:
Итак, я установил:
Это имеет смысл для вас? Можно ли получить все дельта-х (х, у) и дельта-у (х, у) с взаимной корреляцией? Кросс-корреляция должна быть максимальной, если соответствующие пиксели связаны друг с другом через векторы смещения, верно?
ОБНОВЛЕНИЕ 2
Итак, алгоритм, о котором я думал, заключается в следующем:
- Deform right.png
- Получить значение кросс-корреляции
- Деформировать right.png дальше
- Получить значение кросс-корреляции и сравнить со значением до
- Если оно больше, хорошая деформация, если нет, переделайте деформацию и сделайте что-нибудь еще
- После максимизации значения взаимной корреляции узнайте, какая там деформация :)
О деформации: можно ли сначала сделать сдвиг вдоль x- и в направлении y, чтобы максимизировать взаимную корреляцию, затем на втором шаге растянуть или сжать x- и y-зависимый и на третьем шаге деформировать квадратичный x- и y и повторять эту процедуру итеративно У меня действительно есть проблема сделать это с целочисленными координатами. Как вы думаете, мне пришлось бы интерполировать картину, чтобы получить непрерывное распределение?? Я должен снова подумать об этом :( Спасибо всем за участие :)