摘自知乎:https://zhuanlan.zhihu.com/p/74597564
一 图像变换与平面坐标系的关系
- 旋转:
将图形围绕原点 逆时针方向旋转一定角度,用解析式表示为:
image.png
image.png
写成矩阵乘法形式:
image.png- 平移:
但是现在遇到困难了,平移无法写成和上面旋转一样的矩阵乘法形式。所以引入齐次坐标 ,再写成矩阵形式:
image.png其中I2x2表示单位矩阵,而 T2x1表示平移向量。
那么就可以把把旋转和平移统一写在一个矩阵乘法公式中,即刚体变换:
image.png而旋转矩阵R2x2是正交矩阵。
刚体变换:旋转+平移(正方形-正方形)- 仿射变换
其中A2x2可以是任意2x2矩阵(与R一定是正交矩阵不同)。
image.png可以看到,相比刚体变换(旋转和平移),仿射变换除了改变目标位置,还改变目标的形状,但是会保持物体的“平直性(如图形中平行的两条线变换后依然平行)”。
不同A 和T 矩阵对应的各种基本仿射变换:
image.png- 投影变换(单应性变换)
简单说,投影变换彻底改变目标的形状。
总结一下:
- 刚体变换:平移+旋转,只改变物体位置,不改变物体形状
- 仿射变换:改变物体位置和形状,但是保持“平直性”(原来平行的边依然平行)
-
投影变换:彻底改变物体位置和形状
注:上图“投影变换”应该是“任意四边形”
我们来看看完整投影变换矩阵各个参数的物理含义:
image.png其中A2x2代表仿射变换参数,T2x1代表平移变换参数。
而VT 表示一种“变换后边缘交点“关系,如:
image.png至于s则是一个与VT = [v1, v2]相关的缩放因子。
image.png一般情况下都会通过归一化使得s = 1
(原因见下文)。
二 平面坐标系与齐次坐标系
问题来了,齐次坐标到底是什么?
齐次坐标是计算机图形学中非常有用的基础概念,比如将3D场景投影到2D平面上。
实际上这个就是之前在片元着色器中使用的w分量。片元着色器是中的纹理是在二维坐标系中展示画面的,而物体从三维投影到二维,如何表示远近呢?其实就是这个w分量,远的物体,也就是深度较深的物体,w值应该较小,对应的在屏幕上的投影就较小,近的物体则较大。 所以,齐次坐标系的其中一个功能是在二维坐标系上投影展示三维的数据。
利用齐次坐标系可以表示无限远处的点
例如: 笛卡尔坐标系下(1, 2) 齐次坐标可以表示为 (1, 2, 1) ,如果点 (1, 2) 移动到无限远处,在笛卡尔坐标下它变为 (∞, ∞) ,然后它的齐次坐标表示为 (1, 2, 0) ,因为(1/0, 2/0) = (∞, ∞) 。 注意这样的话,我们可以不用 ” ∞ " 来表示一个无穷远处的点了
齐次坐标系与常见的三维空间坐标系 不同,只有两个自由度:
image.png而 w (其中w>0 )对应坐标x 和y 的缩放尺度。当 w=1 时:
image.png特别的当w=0 时,对应无穷远:
image.png
从二维平面上看,(x, y, w) 随 w 的变化在从原点到 (x, y)的蓝虚线示意的射线上滑动:
image.png三 单应性变换
- 单应性是什么?
此处给出单应性不严谨的定义:用 **[无镜头畸变] **的相机从不同位置拍摄 **[同一平面物体] **的图像之间存在单应性,可以用 **[投影变换] **表示 。
注意:
单应性的严格定义与成立条件非常复杂,超出本文范围。
有需要的朋友请自行查阅《Multiple View Geometry in Computer Vision》书中相关内容。
image.png
简单说就是:
image.png其中 (xl,yl是Left view图片上的点,(xr, yr) 是Right view图片上对应的点。
-
**那么这个H3x3
单应性矩阵如何求解呢?**
从更一般的情况分析,每一组匹配点 (xi, yi)——>(xi', yi')有等式(15)成立:
image.png由平面坐标与齐次坐标对应关系(x/w, y/w) = (x, y, w) ,上式可以表示为:
image.png进一步变换为:
image.png写成矩阵AX = 0 形式:
image.png也就是说一组匹配点 (xi, yi)——>(xi', yi') 可以获得2组方程。
- 单应性矩阵8自由度
注意观察:单应性矩阵H 与 aH 其实完全一样(其中 a ≠ 0),例如:
image.png即点(xi, yi) 无论经过 H 还是 aH 映射,变化后都是 (xi', yi') 。
如果使a = 1/h33 ,那么有:
image.png所以单应性矩阵H 虽然有9个未知数,但只有8个自由度。
在求H 时一般添加约束h33 = 1,所以还有h11 ~ h32 共8个未知数。由于一组匹配点 (xi, yi)——>(xi', yi') 对应2组方程,那么只需要n=4 组不共线的匹配点即可求解H 的唯一解。
XIAOMI9拍摄,有镜头畸变OpenCV已经提供了相关API,代码和变换结果如下。
import cv2
import numpy as np
im1 = cv2.imread('left.jpg')
im2 = cv2.imread('right.jpg')
src_points = np.array([[581, 297], [1053, 173], [1041, 895], [558, 827]])
dst_points = np.array([[571, 257], [963, 333], [965, 801], [557, 827]])
H, _ = cv2.findHomography(src_points, dst_points)
h, w = im2.shape[:2]
im2_warp = cv2.warpPerspective(im2, H, (w, h))
image.png
可以看到:
- 红框所在平面上内容基本对齐,但受到镜头畸变影响无法完全对齐;
- 平面外背景物体不符合单应性原理,偏离很大,完全无法对齐。
- 传统方法估计单应性矩阵
一般传统方法估计单应性变换矩阵,需要经过以下4个步骤:
- 提取每张图SIFT/SURF/FAST/ORB等特征点
- 提取每个特征点对应的描述子
- 通过匹配特征点描述子,找到两张图中匹配的特征点对(这里可能存在错误匹配)
- 使用RANSAC算法剔除错误匹配
- 求解方程组,计算Homograph单应性变换矩阵
网友评论