一、引言
图像的空间变换是将输入图像的像素位置映射到输出图像新的位置处
图像的空间变换一般可以分为两类,一类是可以使用数学函数表达式描述的简单变换,例如仿射变换和透视变换,另一类则是依赖于实际图像而不易于用函数形式描述的复杂变换,例如对存在几何畸变的摄像机所拍摄的图像进行校正,就需要实际拍摄的栅格图像,根据栅格的实际扭曲数据建立空间变换关系。
而上述中的仿射变换和透视变换又统称为投影变换,仿射变换为平行投影变换,透视变换为中心投影变换,仿射变换为线性变换,透视变换为非线性变换。
而所谓的线性变换(如平移、缩放、旋转和剪切变换),就是保持直线的平行性和平直性的变换,即原先图像中的直线与平行线映射到另一幅图像中后还是直线和平行线,一个矩形映射为一个平行四边形是仿射变换,而一个矩形映射为一个梯形则属于透视变换。具体可参考下图:
二、图像的仿射变换
(1)首先讨论最一般的 3D 空间变换
一个点 $ X(x_1,x_2,x_3) $ 的仿射变换 $ Y(y_1,y_2,y_3) $ 可以定义为: \[ \begin{align*} y_1 = m_{11}x_1 + m_{12}x_2 + m_{13}x_3 + m_{14}\\ \\ y_2 = m_{21}x_1 + m_{22}x_2 + m_{23}x_3 + m_{24}\\ \\ y_3 = m_{31}x_1 + m_{32}x_2 + m_{33}x_3 + m_{34}\\ \label{eq:(2-1)} \end{align*} \] 仿射变换写成矩阵形式为 $ Y = MX $ : \[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} m_{11} & m_{12} & m_{13} & m_{14}\\ m_{21} & m_{22} & m_{23} & m_{24}\\ m_{31} & m_{32} & m_{33} & m_{34}\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \]
(2)分解为子变换——平移变换 $ Y = QX $
\[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & q_{1}\\ 0 & 1 & 0 & q_{2}\\ 0 & 0 & 1 & q_{3}\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \]
此变换只贡献平移量 $ q_{1},q_{2},q_{3} $ ,注意,矩阵写成 $ 4 $ 的形式是为了将平移变换统一纳入矩阵运算之中。
(3)分解为子变换——旋转变换 $ Y = RX $
在 3D 空间中,三个正交平面中的旋转通常表示为沿着相应坐标轴 $ x,y,z $ 的旋转,分别表示为:
绕着 $ x $ 轴逆时针旋转: \[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0\\ 0 & cos(\alpha) & -sin(\alpha) & 0\\ 0 & sin(\alpha) & cos(\alpha) & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \] 绕着 $ y $ 轴逆时针旋转: \[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} cos(\beta) & 0 & sin(\beta) & 0\\ 0 & 1 & 0 & 0\\ -sin(\beta) & 0 & cos(\beta) & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \] 绕着 $ z $ 轴逆时针旋转: \[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} cos(\gamma) & -sin(\gamma) & 0 & 0\\ sin(\gamma) & cos(\gamma) & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \]
(4)分解为子变换——缩放变换 $ Y = S_{1}X $
\[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} m_{x} & 0 & 0 & 0\\ 0 & m_{y} & 0 & 0\\ 0 & 0 & m_{z} & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \]
(5)分解为子变换——剪切变换 $ Y = S_{2}X $
\[ \begin{pmatrix} y_1\\ y_2\\ y_3\\ 1 \end{pmatrix} = \begin{pmatrix} 1 & s_{1} & s_{2} & 0\\ 0 & 1 & s_{3} & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ x_3\\ 1 \end{pmatrix} \]
(6)组合变换 $ Y = MX = QRS_{1}S_{2}X $
(7)本次研究对象是 2D 图像的刚体变换
刚体变换主要用于同一研究对象的配准,是一种最简单的空间变换。所谓刚体,是指物体变换前后内部任意两点间的距离保持不变,也就是说,刚体变换仅仅是仿射变换中平移变换和旋转变换的组合
从这里我们可以得到一个启示:对于刚体变换,不要一开始就无脑上什么 SIFT 和 SURF 啊什么的,因为它不涉及尺度特性(缩放特性),而是需要仔细分析手上的问题,想清楚后再做决断
一个二维点 $ X(x_1,x_2) $ 映射为另一个二维点 $ Y(y_{1},y_{2}) $ 的旋转矩阵为:(逆时针旋转) \[ \begin{pmatrix} y_1\\ y_2\\ 1 \end{pmatrix} = \begin{pmatrix} cos(\theta) & -sin(\theta) & 0\\ sin(\theta) & cos(\theta) & 0\\ 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ 1 \end{pmatrix} \] 平移矩阵为: \[ \begin{pmatrix} y_1\\ y_2\\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & q_{1}\\ 0 & 1 & q_{2}\\ 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ 1 \end{pmatrix} \] 组合矩阵(组合变换)为: \[ \begin{pmatrix} y_1\\ y_2\\ 1 \end{pmatrix} = \begin{pmatrix} cos(\theta) & -sin(\theta) & q_{1}\\ sin(\theta) & cos(\theta) & q_{2}\\ 0 & 0 & 1\\ \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ 1 \end{pmatrix} \] 可以看出, 2D 图像的空间变换矩阵只依赖于三个参数 \[ (\;q_{1},\;q_{2},\;\theta\;) \] 解这三个参数,就必须要有三个线性无关的方程,因此,就必须知道两个点对的坐标 $ (x_{1},x_{2}) $ 和 $ (y_{1},y_{2}) $ 和 $ (x_{3},x_{4}) $ 和 $ (y_{3},y_{4}) $ 。(这里允许多一个方程!!!变换矩阵为我们最终所求!!!)
要记住啊,是两个点对,是两个点对,是两个点对!!!
并且,另说一句,平移变换 + 旋转变换 + 缩放变换也只需要两个点对,因为一共只需要求解四个未知数
可以参看 Matlab 文档给出的变换类型和点对数需求的说明:
三、图像的透视变换
透视变换常用于图像的几何校正,是一种分式线性变换(非线性变换),该过程可以简单地描述为:将一个二维坐标系转换为一个三维坐标系,然后将该三维坐标系投影到新的二维坐标系,体现的是视角的变化。
现阶段学习还用不着,因此此部分以后再写
虽然但是,透视变换真的很有用!先上效果图,有一个直观上的感受:(一张普通公路图变为鸟瞰图)
四、图像变换后的插值
图像在经过变换后,由于像素点的坐标取整会出现归并现象,即有可能有多个原图像的像素点同时变换到新图像中同一个像素点的位置上。这样就出现了在变换后的新图像上有若干原图像像素点叠加,或者排列位置破坏了原有的相邻关系。另外,有些点无对应的原像素点来填充,由此会在变换后的图像中出现“空穴”,这些“空穴”的像素值需要进一步确定,以保持图像外观上的“连续性”。此时便需要用到图像插值的方法。
现阶段学习还用不着,因此此部分以后再写
五、参考文章
推荐这两篇博文:
(2)周旋的博客
还有一本小书:
上官晋太:《图像配准中的若干问题研究》