图像平铺注册

时间:2010-10-29 22:26:34

标签: computer-vision registration linear-algebra

我正在尝试为一个平铺图像数据集中的平铺/像素位置创建一个映射到另一个数据集中的平铺/像素位置(大致覆盖相同的图像区域)。由于成像区域的旋转,平移轴,平移和比例变化,在此映射中需要考虑许多未知数。下面说明了这种情况,其中矩形表示每个图块的成像区域,并且图块的布局由平移轴(黑线)和相机轴之间的关系控制:

alt text alt 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,l,m,n),并且基本上描述了数据集1中的平铺和像素位置的映射(tx,ty,px,py)到dataset2中的tile和pixel位置(tx *,ty *,px *,py *)。提出14个(或更多)这样的对应对我来说并不是什么大不了的事,因为我有一个对数极坐标图像注册,如果它们包含足够的图像,就可以很好地将一个tile从dataset1映射到dataset2中的tile。交叠。问题是我宁愿确定上面的映射,而不是在dataset1中的每个单独的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)将映射的坐标转换回目标中的tile和pixel位置....没有?

Edit2:将符号更改为矩阵乘法正确 编辑3:添加插图图像,因为我现在可以!

1 个答案:

答案 0 :(得分: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