2010-10-29 1 views
3

Я пытаюсь создать сопоставление для позиций плитки/пикселя в одном наборе данных черепичного изображения для позиции плитки/пикселя в другом наборе данных (который примерно покрывает одну и ту же область изображения). Из-за поворотов отображаемой области, оси панорамирования, сдвигов и изменений масштаба в этом сопоставлении есть много неизвестных. Эта ситуация показана ниже, где прямоугольники представляют изображаемой области для каждой плитки, а также расположение плиток определяется соотношением между осью панорамирования (черные линии) и оси камеры:images tile registration

alt textalt text

Задача сводится к следующей линейной системе, которая учитывает, что ось сканирования вращается относительно оси камеры по-разному в двух наборах данных, плюс вращение, масштаб и переводы между отображаемыми областями в двух наборах данных. К сожалению, я не знаю, как идти о решении для неизвестных:

|tx ty|X|a b|+|px py|X|e f|+|i j|=|tx* ty*|X|k l|+|px* py*| 
     |c d|   |g h|     |m n| 

Неизвестными в этой системе (а, б, в, г, д, е, ж, з, I, J, K , l, m, n) и в основном описывают отображение из позиций плитки и пикселя в наборе данных1 (tx, ty, px, py) в позиции плитки и пикселя в наборе данных2 (tx *, ty *, px *, py *). Приходится с 14 (или более) такими соответствиями, для меня это не слишком большая сделка, так как у меня есть регистрация лог-полярного изображения, которая очень хорошо работает для аффинного сопоставления плитки из набора данных1 в плитку в наборе данных2, если они содержат достаточное изображение перекрытия. Проблема в том, что я предпочел бы получить вышеприведенное сопоставление, а не делать эту регистрацию между каждой отдельной таблицей в наборе данных1 и 2, которая будет навсегда!

Любая помощь очень ценится! -Craig

Edit:

Я просто понял, что я могу изменить эту проблему, как это (я думаю?):

|tx ty px py 1|X|a b|=|tx* ty* px* py* 1|X|k l| 
       |c d|      |m n| 
       |e f|      |1 0| 
       |g h|      |0 1| 
       |i j|      |1 1| 

Это приглядевшись к тому, что мне нужно, но мне еще нужно помогите выяснить, как преобразовать ответ, я вернусь к форме, которую я мог бы использовать (самое главное, я думаю, мне нужно было бы явно знать (k, l, m, n) преобразовать преобразованную координату обратно в плитка и положение пикселя в цели .... нет?

Редактировать2: Изменено обозначение, которое должно быть правильным для умножения матрицы. Edit3: Добавлены иллюстрационные изображения, так как теперь я могу!

ответ

1

ОК, я давно понял проблему, но размещаю здесь документацию.

|tx ty px py 1|X|a b|=|tx* ty* px* py* 1|X|k l| 
       |c d|      |m n| 
       |e f|      |1 0| 
       |g h|      |0 1| 
       |i j|      |1 1| 

можно переписать удобно как:

|tx ty px py| X A X B + T = |tx* ty* px* py*| X C 

где матрицы А и С описывают преобразование с горкой системы координат к глобальной | х у | система координат, а «B + T» - аффинное преобразование | x y | -> | x * y * |

переписан снова:

|tx ty px py 1 tx* ty*| X |A*| = |px* py*| 
          |B | 
          |T | 
          |C*| 

показывает, что

|B| == |e f| 
|T| |g h| 
     |i j| 

A* X inv(B) = |a b| 
       |c d| 

-C* = |k l| 
     |m n| 

Чтобы определить линейное решение методом наименьших квадратов к проблеме из соответствий:

точки на слайде 1 ТР1 = [[ tilex, tiley, pixelx, pixely], ...,]

в соответствующие точки на слайде 2 tp2 = аналогично выше, чем указано выше

def findABC(tp1,tp2): 
    dp1 = np.hstack([tp1,np.ones([len(tp1),1]),tp2[:,0:2]]) 
    dp2 = tp2[:,2:4] 
    E,_,rank,_ = np.linalg.lstsq(dp1,dp2) 
    if rank == 7: 
     B = E[2:5] 
     A = np.dot(E[0:2,0:2],np.linalg.inv(E[2:4,0:2])) 
     C = -E[5:7] 
     return A,B,C 

def SlideToGlobal(X,tp): 
    return np.dot(tp,X) 

def GlobalToSlide(X,p): 
    tptp = np.dot(p,n.linalg.inv(X[0:2,0:2])) 
    tpoints = np.floor(tptp) 
    ppoints = tptp-np.dot(tpoints,X[0:2,0:2]) 
    tp = np.hstack([tpoints,ppoints]) 
    return tp