坐标值为矩阵形式输入时,图像几何变换的矩阵方程推导
一、问题描述
图像几何变换过程中,我们可以通过像素点操作的方式,对像素值对应像素点的横、纵坐标轴进行平移,旋转和放缩等几何操作。
二、以像素点为运算单位的图像几何变换矩阵方程
我们都知道,当我们对图像进行几何变换时,若对每一个像素点进行循环操作求解,此时关于每一个像素点的横纵坐标值所构成的向量,我们有如下的矩阵表达式
1.几何平移 T m o v e T_{move} Tmove
[ x a f t e r y a f t e r 1 ] = [ 1 0 d x 0 1 d y 0 0 1 ] ⋅ [ x b e f o r e y b e f o r e 1 ] \begin{bmatrix}x_{after}\\y_{after}\\1\end{bmatrix} = \begin{bmatrix}1&0&dx\\ 0&1&dy\\ 0&0&1\end{bmatrix} · \begin{bmatrix}x_{before}\\y_{before}\\1\end{bmatrix} ⎣⎡xafteryafter1⎦⎤=⎣⎡100010dxdy1⎦⎤⋅⎣⎡xbeforeybefore1⎦⎤
2.几何旋转 T r o t a t i o n T_{rotation} Trotation
[ x a f t e r y a f t e r 1 ] = [ c o s α − s i n α 0 s i n α c o s α 0 0 0 1 ] ⋅ [ x b e f o r e y b e f o r e 1 ] \begin{bmatrix}x_{after}\\y_{after}\\1\end{bmatrix} = \begin{bmatrix}cos\alpha&-sin\alpha&0\\ sin\alpha& cos\alpha&0\\ 0&0&1\end{bmatrix} · \begin{bmatrix}x_{before}\\y_{before}\\1\end{bmatrix} ⎣⎡xafteryafter1⎦⎤=⎣⎡cosαsinα0−sinαcosα0001⎦⎤⋅⎣⎡xbeforeybefore1⎦⎤
3.几何缩放 T s i z e T_{size} Tsize
[ x a f t e r y a f t e r 1 ] = [ S i z e x 0 0 0 S i z e y 0 0 0 1 ] ⋅ [ x b e f o r e y b e f o r e 1 ] \begin{bmatrix}x_{after}\\y_{after}\\1\end{bmatrix} = \begin{bmatrix}Size_x&0&0\\ 0&Size_y&0\\ 0&0&1\end{bmatrix} · \begin{bmatrix}x_{before}\\y_{before}\\1\end{bmatrix} ⎣⎡xafteryafter1⎦⎤=⎣⎡Sizex000Sizey0001⎦⎤⋅⎣⎡xbeforeybefore1⎦⎤
4.合变换矩阵 T T T
T = T m o v e ⋅ T r o t a t i o n ⋅ T s i z e = [ c o s α − s i n α d x s i n α c o s α d y 0 0 1 ] ⋅ [ S i z e x 0 0 0 S i z e y 0 0 0 1 ] T = T_{move}·T_{rotation}·T_{size} = \begin{bmatrix}cos\alpha&-sin\alpha&dx\\ sin\alpha& cos\alpha&dy\\ 0&0&1\end{bmatrix}· \begin{bmatrix}Size_x&0&0\\ 0&Size_y&0\\ 0&0&1\end{bmatrix} T=Tmove⋅Trotation⋅Tsize=⎣⎡cosαsinα0−sinαcosα0dxdy1⎦⎤⋅⎣⎡Sizex000Sizey0001⎦⎤
三、以坐标矩阵为运算单元构建图像几何变换矩阵方程
在通过 Matlab 进行编程的时候,我们都希望有更多的循环能够被表示成矩阵相乘的形式,这样做可以大大减少计算时间,特别是在图像处理的过程当中。Matlab 是一款牺牲速度体现精度的编程软件,减少嵌套循环的使用是必须具备的习惯。
1.以矩阵分割为理论基础构建矩阵方程
矩阵分割,实际上是一种整体思维,如
[
C
O
S
A
−
S
I
N
A
D
X
S
I
N
A
C
O
S
A
D
Y
O
O
E
]
⋅
[
X
m
×
n
Y
m
×
n
E
m
×
n
]
\begin{bmatrix}COSA&-SINA&DX\\ SINA&COSA&DY\\ O&O&E\end{bmatrix} · \begin{bmatrix}X^{m\times n}\\Y^{m\times n}\\E^{m\times n} \end{bmatrix}
⎣⎡COSASINAO−SINACOSAODXDYE⎦⎤⋅⎣⎡Xm×nYm×nEm×n⎦⎤我们希望通过上面的矩阵相乘公式,达到对矩阵内每一个像素点坐标值的几何变换的目的。那么,
C
O
S
A
=
[
c
o
s
α
⋯
c
o
s
α
⋮
⋱
⋮
c
o
s
α
⋯
c
o
s
α
]
o
r
[
c
o
s
α
O
⋱
O
c
o
s
α
]
?
?
?
COSA = \begin{bmatrix}cos\alpha&\cdots&cos\alpha\\ \vdots&\ddots&\vdots\\ cos\alpha&\cdots&cos\alpha\end{bmatrix} or \begin{bmatrix}cos\alpha&&O\\&\ddots&\\ O&&cos\alpha\end{bmatrix} ???
COSA=⎣⎢⎡cosα⋮cosα⋯⋱⋯cosα⋮cosα⎦⎥⎤or⎣⎡cosαO⋱Ocosα⎦⎤???这个问题我会在第3小节进行推导。
2.矩阵乘法的维度规则
X
a
f
t
e
r
=
C
O
S
A
∗
X
b
e
f
o
r
e
−
S
I
N
A
∗
Y
b
e
f
o
r
e
+
D
X
∗
E
X_{after} = COSA*X_{before} - SINA*Y_{before}+DX*E
Xafter=COSA∗Xbefore−SINA∗Ybefore+DX∗E
其中
d
i
m
[
X
a
f
t
e
r
]
=
d
i
m
[
X
b
e
f
o
r
e
]
=
m
×
n
dim[X_{after}]=dim[X_{before}]= m\times n
dim[Xafter]=dim[Xbefore]=m×n,那么,由矩阵乘法的维度规则我们可以知道
d
i
m
[
X
a
f
t
e
r
]
=
d
i
m
[
C
O
S
A
]
∗
d
i
m
[
X
b
e
f
o
r
e
]
dim[X_{after}]=dim[COSA]*dim[X_{before}]
dim[Xafter]=dim[COSA]∗dim[Xbefore]
R
m
×
n
=
R
p
×
q
∗
R
m
×
n
R^{m\times n}=R^{p\times q}*R^{m\times n}
Rm×n=Rp×q∗Rm×n则
p
=
m
,
q
=
m
p = m,q=m
p=m,q=m,则有
d
i
m
[
C
O
S
A
]
=
m
×
m
dim[COSA] = m\times m
dim[COSA]=m×m同理
S
I
N
A
,
D
X
,
D
Y
,
E
,
O
SINA,DX,DY,E,O
SINA,DX,DY,E,O 的维度。
3. C O S A COSA COSA 应当时对角线上有值,还是每个位置都有值?
可以知道,
X
a
f
t
e
r
X_{after}
Xafter 第 i 行第 j 列的元素为
[
X
a
f
t
e
r
]
i
j
=
∑
k
=
1
m
(
[
C
O
S
A
]
i
k
⋅
[
X
]
k
j
−
[
S
I
N
A
]
i
k
⋅
[
Y
]
k
j
+
[
D
X
]
i
k
⋅
[
E
]
k
j
)
[X_{after}]_{ij}=\sum_{k=1}^m ([COSA]_{ik}·[X]_{kj}-[SINA]_{ik}·[Y]_{kj}+[DX]_{ik}·[E]_{kj})
[Xafter]ij=k=1∑m([COSA]ik⋅[X]kj−[SINA]ik⋅[Y]kj+[DX]ik⋅[E]kj)我们单单以
∑
k
=
1
m
[
C
O
S
A
]
i
k
⋅
[
X
]
k
j
\sum_{k=1}^m [COSA]_{ik}·[X]_{kj}
k=1∑m[COSA]ik⋅[X]kj来探究。若我们最终希望
[
X
a
f
t
e
r
]
11
=
c
o
s
α
∗
[
X
b
e
f
o
r
e
]
11
[X_{after}]_{11} = cos\alpha *[X_{before}]_{11}
[Xafter]11=cosα∗[Xbefore]11 ,也即
[
X
a
f
t
e
r
]
11
[X_{after}]_{11}
[Xafter]11 仅仅用到了
X
b
e
f
o
r
e
X_{before}
Xbefore 中的第1行第1列,那么在刚刚的表达式中,则不应该出现有使用到 X 的其他位置数据的情况。于是,则有如下的推导
∑
k
=
1
m
[
C
O
S
A
]
i
k
⋅
[
X
]
k
j
=
[
C
O
S
A
]
i
?
∗
[
X
]
i
j
\sum_{k=1}^m [COSA]_{ik}·[X]_{kj} = [COSA]_{i?}*[X]_{ij}
k=1∑m[COSA]ik⋅[X]kj=[COSA]i?∗[X]ij
显然,
?
=
i
?= i
?=i ——也就时说,
C
O
S
A
COSA
COSA 仅在对角线上有值,即
C
O
S
A
=
[
c
o
s
α
O
⋱
O
c
o
s
α
]
COSA = \begin{bmatrix}cos\alpha&&O\\&\ddots&\\ O&&cos\alpha\end{bmatrix}
COSA=⎣⎡cosαO⋱Ocosα⎦⎤结论:
C
O
S
A
COSA
COSA 应当是在对角线上有值。
四、结论
关于图像几何变换的矩阵方程如
[
X
m
×
n
Y
m
×
n
E
m
×
n
]
=
[
C
O
S
A
−
S
I
N
A
D
X
S
I
N
A
C
O
S
A
D
Y
O
O
E
]
⋅
[
X
m
×
n
Y
m
×
n
E
m
×
n
]
\begin{bmatrix}X^{m\times n}\\Y^{m\times n}\\E^{m\times n} \end{bmatrix} = \begin{bmatrix}COSA&-SINA&DX\\ SINA&COSA&DY\\ O&O&E\end{bmatrix} · \begin{bmatrix}X^{m\times n}\\Y^{m\times n}\\E^{m\times n} \end{bmatrix}
⎣⎡Xm×nYm×nEm×n⎦⎤=⎣⎡COSASINAO−SINACOSAODXDYE⎦⎤⋅⎣⎡Xm×nYm×nEm×n⎦⎤可以简化成
[
X
m
×
n
Y
m
×
n
E
m
×
n
]
=
[
c
o
s
α
∗
E
−
s
i
n
α
∗
E
d
x
∗
E
s
i
n
α
∗
E
c
o
s
α
∗
E
d
y
∗
E
O
O
1
∗
E
]
⋅
[
X
m
×
n
Y
m
×
n
E
m
×
n
]
\begin{bmatrix}X^{m\times n}\\Y^{m\times n}\\E^{m\times n}\end{bmatrix} = \begin{bmatrix}cos\alpha*E&-sin\alpha*E&dx*E\\ sin\alpha*E&cos\alpha*E&dy*E\\ O&O&1*E\end{bmatrix} · \begin{bmatrix}X^{m\times n}\\Y^{m\times n}\\E^{m\times n} \end{bmatrix}
⎣⎡Xm×nYm×nEm×n⎦⎤=⎣⎡cosα∗Esinα∗EO−sinα∗Ecosα∗EOdx∗Edy∗E1∗E⎦⎤⋅⎣⎡Xm×nYm×nEm×n⎦⎤其中,
E
E
E 为m阶单位方阵
E
=
[
1
O
⋱
O
1
]
(
E
=
R
m
×
m
,
∣
E
∣
=
1
)
E = \begin{bmatrix}1&&O\\&\ddots&\\ O&&1\end{bmatrix} ( E = R^{ m\times m} ,|E| = 1 )
E=⎣⎡1O⋱O1⎦⎤(E=Rm×m,∣E∣=1)