2010-10-29 427 views
3

我試圖創建一個平鋪圖像數據集中的平鋪/像素位置到不同數據集(大致覆蓋相同圖像區域)的平鋪/像素位置的映射。由於成像區域的旋轉,平移軸,平移和縮放變化,在該映射中有很多未知因素需要考慮。這種情況如下所示,其中該矩形表示用於每個圖塊的成像區域,和瓦片的佈局由平移軸線(黑線)和相機軸之間的關係決定:圖像平鋪註冊

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| 

的未知數是(A,B,C,d,E,F,G,H,I,J,K (tx,ty,px,py)中的瓦片和像素位置到數據集2中的瓦片和像素位置(tx *,ty *,px *,py *)的映射。對於我來說,創建14個(或更多)這種對應關係對我來說並不算什麼大問題,因爲我有一個對數極座標圖像配準,如果它們包含足夠的圖像,它就可以很好地將數據集1中的圖塊映射到數據集2中的圖塊交疊。問題是我寧願讓上面的映射確定,而不是在數據集1中的每個單獨的tile之間進行這種註冊,而2將永遠使用!!

任何幫助非常感謝! -Craig

編輯:

我想通了,我可以重新排列問題,像這樣(我認爲):

|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 

其中矩陣A和C描述從滑動變換座標系統到全球| X Y |座標系,'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 TP1 = [[ 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