我正在尝试为一个平铺图像数据集中的平铺/像素位置创建一个映射到另一个数据集中的平铺/像素位置(大致覆盖相同的图像区域)。由于成像区域的旋转,平移轴,平移和比例变化,在此映射中需要考虑许多未知数。下面说明了这种情况,其中矩形表示每个图块的成像区域,并且图块的布局由平移轴(黑线)和相机轴之间的关系控制:
问题减少到下面的线性系统,该系统考虑到在两个数据集中相对于摄像机轴旋转的扫描轴不同,加上两个数据集中的成像区域之间的旋转,缩放和平移。不幸的是,我不确定如何解决未知问题:
|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:添加插图图像,因为我现在可以!
答案 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