Python中的图像注册和仿射变换

3

我一直在阅读Jan Erik Solem的使用Python进行计算机视觉编程,这是一本相当不错的书,但是我还无法澄清有关图像配准的问题。

基本上,我们有一堆需要对齐一点的图像(面孔),因此首先需要通过相似变换执行刚性变换:

x' = | sR t | x
     | 0  1 |

其中x是向量(在这种情况下是一组坐标),通过旋转R、平移t和可能的缩放s转换为x'。

Solem为每个图像计算这个刚性变换,返回旋转矩阵R和一个平移向量tx和ty:

R,tx,ty = compute_rigid_transform(refpoints, points)

然而,他出于某种原因重新排列了R的元素:

T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]])

然后他执行了一个仿射变换

im2[:,:,i] = ndimage.affine_transform(im[:,:,i],linalg.inv(T),offset=[-ty,-tx])

在这个例子中,对每个通道执行了仿射变换,但这并不重要。im[:,:,i]是要处理的图像,此过程返回另一幅图像。

T是什么,为什么我们要反转仿射变换中的矩阵?实现图像配准的常规步骤是什么?

更新

在这里你可以在Google Books中找到此代码的相关部分。从第67页底部开始。


我不确定R的重新排序发生了什么(首先,3D中的旋转矩阵应该是3x3),但通常情况下,旋转矩阵的逆将“撤消”旋转(就像平移的负数将“撤消”平移一样)。也许一个R和相应的T的例子会有所帮助。 - beaker
这正是我所想的,但我在矩阵T上犯了一个错误。它应该是:T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]]) 我不知道R的一个例子是否有帮助,因为它包含了一堆数字。如你所知,R是[[cos(t) -sin(t)] [sin(t) cos(t)]],而T应该是[[cos(t) sin(t)] [-sin(t) cos(t)]]。 - r_31415
你确定 T 数组没问题吗?基变换应该是 R 转置的逆。 (如果用 LaTeX 的话会容易得多...) - beaker
我不知道 - 同时回顾您的帖子,我猜测 T 不仅仅是 R 的转置。现在我比以往任何时候都更加困惑了。您尝试运行过这段代码吗? - aganders3
忘了提到我还没有运行这段代码,因为要完全重现这个例子,需要一个库,而我在安装它时遇到了问题。 - r_31415
显示剩余6条评论
2个回答

1

在我看来,代码中似乎存在一个错误。T 看起来只是 R 的转置,对于旋转矩阵来说这相当于逆矩阵。然后他在调用 ndimage.affine_transform 时又取了一次逆。我认为应该传递给该函数的参数要么是 T,要么是 linalg.inv(R)


0

我会尝试回答你的问题并指出书中的一个错误(?) (1) 为什么要使用 T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]])? 因为 R,tx,ty = compute_rigid_transform(refpoints, points) 计算旋转矩阵和平移形式:

|x'| = s|R[0][0] R[0][1]||x| + |tx|             Equation (1)
|y'|    |R[1][0] R[1][1]||y|   |ty|

然而,OUT = ndimage.affine_transform(IN,A,b) 需要以 (y,x) 的形式表示坐标,而不是 (x,y) 的顺序。因此,上述方程(1)将变为

|y'| = s|R[1][1] R[1][0]||y| + |ty| = T|y| + |ty|        Equation(2)
|x'|    |R[0][1] R[0][0]||x|   |tx|    |x|   |tx|

然后,在函数ndimage.affine_transform()中,矩阵将是linalg.inv(T),而不是linalg.inv(R)。

(2) 事实上,仿射变换OUT = ndimage.affine_transform(IN,A,b)是A*OUT + b => IN。 根据方程(2),将其重写为

|y| = inv(T)|y'| - inv(T)|ty|
|x|         |x'|         |tx|

因此,函数ndimage.affine_transform()中的偏移量是inv(T)[-ty, -tx],而不是[-ty -tx]。我认为这是原始代码中的一个错误。


在你的回答中不需要提及提问者。他们将会自动收到通知。 - ChiefTwoPencils
@ColorRGB 感谢您的回答。您能否改善您的回答以便于将来参考?现在它相当难以理解。 - r_31415

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接