前面我们提到了图像的缩放变换和旋转变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。
那么,对于平移变换呢?平移变换表示的是位置变化的概念。如下图所示,一个图像矩形从中心点[x1,y1]平移到了中心点[x2,y2]处,整体大小和角度都没有变化。在x方向和y方向上分别平移了tx和ty大小。
显然:
x
2
=
x
1
+
t
x
y
2
=
y
1
+
t
y
x2 = x1 + tx\\ y2 = y1 + ty
x2=x1+txy2=y1+ty
这对于图像中的每一个点都是成立的。写成矩阵的形式就是:
[
x
2
y
2
]
=
[
x
1
y
1
]
+
[
t
x
t
y
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]}+{ \left[ \begin{array}{ccc} tx\\ ty\\ \end{array} \right ]} \end{aligned}
[x2y2]=[x1y1]+[txty]
我们再把前面的缩放变换和旋转变换的矩阵形式写出来:
缩放变换:
[
x
2
y
2
]
=
[
k
x
0
0
k
y
]
[
x
1
y
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} k_x & 0\\ 0 & k_y\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{aligned}
[x2y2]=[kx00ky][x1y1]
旋转变换:
[
x
2
y
2
]
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
[
x
1
y
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} cos\theta & -sin\theta\\ sin\theta & cos\theta\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{aligned}
[x2y2]=[cosθsinθ−sinθcosθ][x1y1]
我们注意到,缩放变换和旋转变换都可以表示成矩阵乘法的形式。实际上,图像的几何变换通常不是单一的,也就是说经常性的缩放、旋转、平移一起变换。例如先放大2倍,然后旋转45度,然后再缩小0.5倍。那么就可以表示成矩阵乘法串接的形式:
[
x
2
y
2
]
=
[
0.5
0
0
0.5
]
[
c
o
s
45
−
s
i
n
45
s
i
n
45
c
o
s
45
]
[
2
0
0
2
]
[
x
1
y
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} 0.5 & 0\\ 0 & 0.5\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} cos45 & -sin45\\ sin45 & cos45\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} 2 & 0\\ 0 & 2\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{aligned}
[x2y2]=[0.5000.5][cos45sin45−sin45cos45][2002][x1y1]
这样,不管有多少次变换,都可以用矩阵乘法来实现。但是平移变换呢?从前面看到,平移变换并不是矩阵乘法的形式,而是矩阵加法的形式!
那能不能把缩放变换、旋转变换、平移变换统一成矩阵乘法的形式呢,这样不管进行多少次变换,都可以表示成矩阵连乘的形式,将极大的方便计算和降低运算量。
这种方法就是“升维”,引入“齐次坐标”,将图像从平面2D坐标变成3D坐标。我们看看平移变换的矩阵形式:
[
x
2
y
2
]
=
[
x
1
y
1
]
+
[
t
x
t
y
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]}+{ \left[ \begin{array}{ccc} tx\\ ty\\ \end{array} \right ]} \end{aligned}
[x2y2]=[x1y1]+[txty]
将其升维,变成3维,上式就可以表示成:
[
x
2
y
2
1
]
=
[
1
0
t
x
0
1
t
y
0
0
1
]
[
x
1
y
1
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} 1 & 0 & tx\\ 0 & 1 & ty\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{aligned}
⎣⎡x2y21⎦⎤=⎣⎡100010txty1⎦⎤⎣⎡x1y11⎦⎤
这是个非常优美的地方,学习过矩阵乘法的同学可以算一下右边的式子,是否最终结果与前面是一样的。
这样,平移变换通过升维后的齐次坐标,也变成了矩阵乘法的形式。当然缩放变换和旋转变换的矩阵形式也得改一改,统一变成3维的形式。
缩放变换:
[
x
2
y
2
1
]
=
[
k
x
0
0
0
k
y
0
0
0
1
]
[
x
1
y
1
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} k_x & 0 & 0\\ 0 & k_y & 0\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{aligned}
⎣⎡x2y21⎦⎤=⎣⎡kx000ky0001⎦⎤⎣⎡x1y11⎦⎤
旋转变换:
[
x
2
y
2
1
]
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
[
x
1
y
1
1
]
\begin{aligned} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} cos\theta & -sin\theta & 0\\ sin\theta & cos\theta & 0\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{aligned}
⎣⎡x2y21⎦⎤=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡x1y11⎦⎤
终于统一了。以后所有的变换,不管怎样变换,变换多少次,都可以表示成一连串的矩阵相乘了,这是多么的方便。这就是引入齐次坐标的作用,把各种变换都统一了起来。
转载自:https://blog.csdn.net/saltriver/article/details/79680364