3

我一直在阅读Jan Erik Solem 的Programming Computer Vision with 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 图书中找到此代码的相关部分。从第 67 页底部开始。

4

2 回答 2

1

对我来说,这看起来像是代码中的错误。T似乎只是 的转置R,对于旋转矩阵,它与逆矩阵相同。然后他在对 的调用中(再次)取反ndimage.affine_transform。我认为它应该是T或者linalg.inv(R)传递给那个函数。

于 2012-10-21T20:31:33.093 回答
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]。我认为这是原始代码中的错误。

于 2013-01-27T02:59:54.967 回答