Описание нелинейного преобразования между двумя изображениями с использованием гомографии

Между синими точками на двух изображениях уже установлено соответствие один к одному. Изображение2 является искаженной версией изображения1. Модель искажения, по-видимому, представляет собой искажение объектива «рыба-глаз». Вопрос в том, есть ли способ вычислить матрицу преобразования, описывающую этот переход. На самом деле матрица, которая преобразует синие точки на первом изображении в соответствующие им синие точки на втором изображении? Проблема здесь в том, что мы не знаем фокусного расстояния (это означает, что изображения не откалиброваны), однако у нас есть идеальное совпадение примерно между 200 точками на двух изображениях. image1(original)искаженное изображение: eimage2


person C graphics    schedule 18.01.2013    source источник
comment
Можете ли вы сказать, в чем разница между этим и регистрацией изображения?   -  person mmgp    schedule 18.01.2013
comment
Честно говоря, я пытаюсь получить ответ на свой вопрос. Если вы думаете, что это регистрация изображения, дайте мне знать. Но поможет ли это мне получить ответ на этот вопрос?   -  person C graphics    schedule 18.01.2013
comment
См. (или хотя бы бегло просмотрите) статью «Коррекция искажения изображения путем совмещения изображений», написанную Тамаки, Ямамура и Охниши. Это решает вашу проблему?   -  person mmgp    schedule 18.01.2013
comment
mmgp, возможно, ваши комментарии не лучший способ помочь ему.   -  person Didac Perez Parera    schedule 19.01.2013
comment
Матричные преобразования ограничены видами искажений, которые они могут воспроизвести (по крайней мере, насколько мне известно), но если матрица 3x3 может описать то, что вы ищете, то любой алгоритм поиска гомографии может сгенерировать это для вас.   -  person Hammer    schedule 19.01.2013
comment
@DídacPérez, не могли бы вы быть немного более конкретным? Как упомянутая статья не решает его проблемы?   -  person mmgp    schedule 19.01.2013


Ответы (1)


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

Матричное преобразование является линейным, а линейные преобразования всегда отображают прямые линии в прямые (http://en.wikipedia.org/wiki/Linear_map). Из рисунка видно, что преобразование является нелинейным, поэтому его нельзя описать с помощью матричной операции.

Тем не менее, вы можете использовать модель искажения объектива, подобную той, что используется в OpenCV (http://docs.opencv.org/doc/tutorials/calib3d/camera_dication/camera_dication.html), и получение коэффициентов не должно быть очень сложным. Вот что вы можете сделать в Matlab:

Назовите (x, y) координаты исходной точки (верхнее изображение) и (xp, yp) координаты искаженной точки (нижнее изображение), обе сдвинутые к центру изображения и разделенные на коэффициент масштабирования (то же самое для x и y), поэтому они лежат более или менее в интервале [-1, 1]. Модель искажения:

x = ( xp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*xp*yp + p2*(r^2 + 2*xp^2));
y = ( yp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p2*xp*yp + p1*(r^2 + 2*yp^2));

Где

r = sqrt(x^2 + y^2);

У вас есть 5 параметров: k1, k2, k3, p1, p2 для радиального и тангенциального искажения и 200 пар точек, так что вы можете решить нелинейную систему.

Убедитесь, что массивы x, y, xp и yp существуют в рабочей области, и объявите их глобальными:

global x y xp yp

Напишите функцию для оценки среднеквадратической ошибки с заданным набором произвольных коэффициентов искажения, скажем, она называется «dist»:

function val = dist(var)

global x y xp yp

val = zeros(size(xp));

k1 = var(1);
k2 = var(2);
k3 = var(3);
p1 = var(4);
p2 = var(5);

r = sqrt(xp.*xp + yp.*yp);
temp1 = x - ( xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2));
temp2 = y - ( yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2));
val = sqrt(temp1.*temp1 + temp2.*temp2);

Решите систему с помощью «fsolve»:

[coef, fval] = fsolve(@dist, zeros(5,1));

Значения в «coef» — это коэффициенты искажения, которые вы ищете. Чтобы исправить искажение новых точек (xp, yp), отсутствующих в исходном наборе, используйте уравнения:

r = sqrt(xp.*xp + yp.*yp);
x_corr = xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2);
y_corr = yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2);

Результаты будут смещены к центру изображения и масштабированы с использованием коэффициента, который вы использовали выше.

Примечания:

  • Координаты должны быть смещены к центру изображения, так как искажение симметрично относительно него.
  • Нет необходимости нормировать до интервала [-1, 1], но обычно это делается для того, чтобы полученные коэффициенты искажения были более или менее одного порядка (работая со степенями 2, 4 и 6 пикселей). координатам потребуются очень маленькие коэффициенты).
  • Этот метод не требует, чтобы точки на изображении находились в единой сетке.
person Milo    schedule 22.01.2013