python - Python 中的图像配准和仿射变换

标签 python numpy computer-vision scipy affinetransform

我一直在读Programming Computer Vision with Python由 Jan Erik Solem 撰写,这是一本非常好的书,但是我无法澄清有关图像配准的问题。

基本上,我们有一堆图像(人脸)需要对齐一点,所以首先需要做的是通过相似变换执行刚性变换:

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]]])

然后他执行了一个 affine transformation :

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

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

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

更新

Here您可以在 Google 图书中找到此代码的相关部分。从第 67 页底部开始。

最佳答案

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

关于python - Python 中的图像配准和仿射变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12943024/

相关文章:

python - 如何在 python 中使用多个索引同时填充 numpy 数组

opencv - 立体投影应该内部一致吗?

c++ - Opencv 对象跟踪和计数在视频帧中通过 ROI 的对象

python - 如何从 Python 中的父子关系创建 json

python - numpy 2d 区域的快速随机到唯一重新标记(无循环)

python - 我需要简化当前输出并获得干净的输出结果

Python,导入错误 : cannot import name AbstractLazySequence

python - 重复numpy数组而不复制数据

python - 用于动态时间规整的矢量化循环

c++ - OpenCV Projectpoints 使 Z 轴错误(用棋盘校准)