几何变换
简介
图像常用一些变换如平移、旋转、翻转等。在传统CV领域,由于拍摄角度问题,我们可能需要对图像作矫正处理;在深度学习领域,我们可能会利用旋转,仿射,镜像等操作进行数据增广。因此对图像做几何变换也是非常常用的手段。
常用的几何变换
仿射变换的一般形式如下:
上式中的
T
T
T 为变换矩阵,其中
(
v
,
w
)
(v,w)
(v,w)为原坐标,
(
x
,
y
)
(x,y)
(x,y) 为变换后的坐标,要做不同的变换使用不同的变换矩阵
以下是几个常用的变换矩阵
坐标系变换
在缩放、平移操作中一般以图像坐标原点(图像左上角为原点)为中心变换,这里不用做坐标系变换,直接计算即可。而对于旋转和偏移,一般是以图像中心为原点,那么这就涉及坐标系转换。
图像坐标定义的原点在图像左上角,水平向右为 X 轴,垂直向下为 Y 轴。数学中的坐标系是以图像中心为原点,水平向右为 X 轴,垂直向上为 Y 轴,称为笛卡尔坐标系。
因此,对图像做旋转和偏移,需要以下三步变换:
- 将输入原图图像坐标转换为笛卡尔坐标系;
- 进行旋转计算。旋转矩阵前面已经给出了;
- 将旋转后的图像的笛卡尔坐标转回图像坐标。
我们以下图来展示坐标转换的方法
- 计算机中图像的坐标系通常是AB和AC方向的,原点为A
- 数学中笛卡尔直角坐标系是DE和DF方向的,原点为D
令图像表示为
M
×
N
M×N
M×N 的矩阵,对于点
A
A
A 而言,两坐标系中的坐标分别是
(
0
,
0
)
(0,0)
(0,0) 和
(
−
N
/
2
,
M
/
2
)
(-N/2,M/2)
(−N/2,M/2),则图像某像素点
(
x
′
,
y
′
)
(x',y')
(x′,y′)转换为笛卡尔坐标
(
x
,
y
)
(x,y)
(x,y)转换关系为,
x
x
x为列,
y
y
y为行,因此我们有:
x
=
x
′
−
N
/
2
y
=
−
y
′
+
M
/
2
x=x'-N/2 \\ y=-y'+M/2
x=x′−N/2y=−y′+M/2
逆变换后:
x
′
=
x
+
N
/
2
y
′
=
−
y
+
M
/
2
x'=x+N/2 \\ y'=-y+M/2
x′=x+N/2y′=−y+M/2
按前面说的3次变换,旋转(顺时针旋转)的变换形式就为:
(
x
,
y
,
1
)
=
(
x
′
,
y
′
,
1
)
T
=
(
x
′
,
y
′
,
1
)
[
1
0
0
0
−
1
0
−
0.5
∗
N
0.5
∗
M
1
]
[
cos
θ
−
sin
θ
0
sin
θ
cos
θ
0
0
0
1
]
[
1
0
0
0
−
1
0
0.5
∗
N
0.5
∗
M
1
]
(x,y,1)=(x',y',1)T\\=(x',y',1) \begin{bmatrix} 1&0&0\\ 0&-1&0\\ -0.5*N&0.5*M&1\\ \end{bmatrix} \begin{bmatrix} \cos\theta&-\sin\theta&0\\ \sin\theta&\cos\theta&0\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} 1&0&0\\ 0&-1&0\\ 0.5*N&0.5*M&1\\ \end{bmatrix}
(x,y,1)=(x′,y′,1)T=(x′,y′,1)⎣⎡10−0.5∗N0−10.5∗M001⎦⎤⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡100.5∗N0−10.5∗M001⎦⎤
反向映射
上面用到的是前向映射,是根据原图用变换公式直接算出输出图像相应像素的空间位置,那么这会出现一个问题:可能会有多个像素坐标映射到输出图像的同一位置,也可能输出图像的某些位置完全没有相应的输入图像像素与它匹配,也就是没有被映射到,造成有规律的空洞(黑色的蜂窝状)。我们可以采用更好的一种方式是采反向映射(Inverse Mapping):
扫描输出图像的位置(x,y),通过
[
v
,
w
,
1
]
=
[
x
,
y
,
1
]
∗
T
−
1
[v,w,1]=[x,y,1]* T^{-1}
[v,w,1]=[x,y,1]∗T−1
计算输入图像对应的位置
(
v
,
w
)
(v,w)
(v,w),通过插值方法决定输出图像该位置的灰度值。
采用反向映射后,需通过插值方法决定输出图像该位置的值,因此需要选择插值算法。(最近邻插值、双线性插值,双三次插值)