仿射变换

一个仿射变换可以通过旋转、缩放、平移等元素组合而成,其中旋转和缩放可以表示为一个变换矩阵,平移可以表示为另一个变换矩阵,因此可以通过旋转矩阵和平移矩阵得到仿射矩阵。

具体地,假设给定一个二维平面上的仿射变换,它包括一个旋转矩阵 \(R\) 和一个平移矩阵 \(T\),则可以通过以下方式得到仿射矩阵 \(A\)

\[A = \begin{pmatrix} R_{11} & R_{12} & T_x \ R_{21} & R_{22} & T_y \ 0 & 0 & 1 \end{pmatrix} \]

其中 \(R_{11}\)\(R_{12}\) 分别表示 \(R\) 矩阵第一行的前两个元素,\(R_{21}\)\(R_{22}\) 分别表示 \(R\) 矩阵第二行的前两个元素,\(T_x\) 表示 \(T\) 矩阵第一行的第三个元素,\(T_y\) 表示 \(T\) 矩阵第二行的第三个元素。

通过这样的方式,可以将旋转和平移两个变换合成为一个仿射变换,从而方便地对平面上的点进行变换操作。

两个仿射矩阵融合可以通过相乘得到一个新的仿射矩阵。具体方法如下:

假设有两个仿射矩阵\(M_1\)\(M_2\),它们的表示形式分别为:

\[M_1=\begin{bmatrix} A_1 & t_1 \ 0 & 1 \end{bmatrix} \]

\[M_2=\begin{bmatrix} A_2 & t_2 \ 0 & 1 \end{bmatrix} \]

其中\(A_1\)\(A_2\)\(2 \times 2\)的矩阵,\(t_1\)\(t_2\)\(2 \times 1\)的向量。

将它们相乘得到一个新的仿射矩阵\(M=M_1M_2\),具体计算方法如下:

\[\begin{aligned} M&=M_1M_2 \ &=\begin{bmatrix} A_1 & t_1 \ 0 & 1 \end{bmatrix} \begin{bmatrix} A_2 & t_2 \ 0 & 1 \end{bmatrix} \ &=\begin{bmatrix} A_1A_2 & A_1t_2+t_1 \ 0 & 1 \end{bmatrix} \end{aligned} \]

这里使用了矩阵相乘的分配律和结合律进行计算。

得到新的仿射矩阵\(M\)后,就可以用它来对点或向量进行仿射变换了。

@brief Inverts an affine transformation.

The function computes an inverse affine transformation represented by \f\(2 \times 3\f\) matrix M:

\f[\begin{bmatrix} a_{11} & a_{12} & b_1 \ a_{21} & a_{22} & b_2 \end{bmatrix}\f]

The result is also a \f\(2 \times 3\f\) matrix of the same type as M.

@param M Original affine transformation.
@param iM Output reverse affine transformation.

\f[patch(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)0.5)\f]

posted @ 2023-03-15 17:35  InsiApple  阅读(80)  评论(0编辑  收藏  举报