我一直在读Jan Erik Solem的Programming Computer Vision with Python,这是一本相当不错的书,但是我还没有能够澄清一个关于图像注册的问题。在
基本上,我们有一组需要对齐的图像(面),因此首先需要通过相似性变换执行刚性变换:
x' = | sR t | x
| 0 1 |
在这种情况下,可以把坐标变换成向量
Solem计算每个图像的刚性变换,该图像返回旋转矩阵R和平移向量tx和ty:
^{pr2}$然而,出于某种原因,他重新排列了R的元素:
T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]])
后来他做了一个affine transformation:
im2[:,:,i] = ndimage.affine_transform(im[:,:,i],linalg.inv(T),offset=[-ty,-tx])
在这个例子中,仿射变换是在每个通道上执行的,但这并不相关。im[:,:,i]
是要处理的图像,此过程返回另一个图像。在
什么是T
,为什么我们要在仿射变换中反转这个矩阵?实现图像配准的一般步骤是什么?在
Here你可以在谷歌图书中找到这段代码的相关部分。从67页的底部开始。在
在我看来这是代码中的一个错误。}传递给该函数。在
T
似乎只是R
的转置,对于旋转矩阵而言,这与逆矩阵相同。然后他在调用ndimage.affine_transform
时(再次)取逆。我认为应该将T
或{我会尽力回答你的问题并指出一个错误(?)在书中。 (1) 为什么使用T=array([[R[1][1],R[1][0]],[R[0][1],R[0][0]]])? 因为R,tx,ty=计算刚性变换(refpoints,points)计算旋转矩阵 以及翻译形式:
但是,OUT=nImage.affine_变换(IN,A,b)要求坐标的形式为(y,x),而不是(x,y)的顺序。因此,上述方程式(1)将变成
^{pr2}$那么,在功能上nImage.affine_变换()矩阵将是利纳格投资公司(T) ,不是利纳格投资公司(R) 一。在
(2)仿射变换输出=nImage.affine_变换(IN,A,b)实际上是A*OUT+b=>;IN。 根据式(2),改写为
所以函数中的偏移量nImage.affine_变换()是inv(T)[-ty,-tx],不是[-ty-tx]。 我认为这是原始代码中的一个错误。在
相关问题 更多 >
编程相关推荐