目录
1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配
2.实现效果与说明
1.图像旋转的原理
1.1.旋转矩阵
旋转一幅图像(假设这幅图像大小是矩形的),当然应该从像素点(pixels)开始,在直角坐标系中,对点
x
0
=
[
a
0
b
0
]
x_0=\begin{bmatrix}a_0\\b_0\\ \end{bmatrix}
x0=[a0b0]逆时针旋转角度
θ
\theta
θ到
x
1
=
[
a
1
b
1
]
x_1=\begin{bmatrix}a_1\\b_1\\ \end{bmatrix}
x1=[a1b1]的变换公式为
x
1
=
[
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
]
x
0
x_1=\begin{bmatrix}cos\theta ; -sin\theta \\ sin\theta ; cos\theta\\ \end{bmatrix}x_0
x1=[cosθsinθ−sinθcosθ]x0 那么对图像上的每个点调用这个旋转公式,将旧图像像素点的RGB值搬移到新图像像素点,就可以将图像旋转到任意位置。 但是问题来了,显示屏的像素点是有限的,这意味着显示在显示屏上的像素点坐标必须是整数,旋转过后的图像的每个像素点坐标难免有非整数的情况,那么这种情况下我们怎么处理呢? 我们不妨假设逆时针旋转
θ
\theta
θ旋转后的图形上所有的像素点都是整点,对于旋转后的图形的每个像素点
x
1
x_1
x1,求旋转前图形的对应像素点的坐标
x
0
x_0
x0,取
ω
=
−
θ
\omega=-\theta
ω=−θ为逆旋转角度,则旋转后的像素点和旋转前的像素点的对应关系为:
x
0
=
[
c
o
s
ω
−
s
i
n
ω
s
i
n
ω
c
o
s
ω
]
x
1
x_0=\begin{bmatrix}cos\omega ; -sin\omega \\ sin\omega ; cos\omega\\ \end{bmatrix}x_1
x0=[cosωsinω−sinωcosω]x1 此时
x
0
x_0
x0不一定为整点,
x
0
x_0
x0的像素值需要做一定的近似。近似的方法有最近邻插值、双线性插值等等,在这里我们就介绍比较实用且不是很复杂的双线性插值,该插值方法不会产生明显失真现象。 对于像素点的旋转坐标函数编写如下: ①坐标旋转变换函数:rot.m
function y=rot(p,angle)
%p=[x,y]为角度制
angle=angle*pi/180;%角度制输入进行计算
y=[cos(angle) -sin(angle);sin(angle) cos(angle)]*p';
end
1.2.双线性插值
对于x和y坐标非整数的非整点
x
p
x_p
xp,假设它周围的四个整点坐标分别为
x
11
,
x
12
,
x
21
,
x
22
x_{11},x_{12},x_{21},x_{22}
x11,x12,x21,x22(构成一个矩形)。假设第一维度是x坐标,第二维度是y坐标。则
x
11
(
1
)
=
x
21
(
1
)
≤
x
p
(
1
)
≤
x
12
(
1
)
=
x
22
(
1
)
x_{11}(1)=x_{21}(1)≤x_p(1)≤x_{12}(1)=x_{22}(1)
x11(1)=x21(1)≤xp(1)≤x12(1)=x22(1)
x
11
(
2
)
=
x
12
(
2
)
≥
x
p
(
2
)
≥
x
21
(
2
)
=
x
22
(
2
)
x_{11}(2)=x_{12}(2)≥x_p(2)≥x_{21}(2)=x_{22}(2)
x11(2)=x12(2)≥xp(2)≥x21(2)=x22(2) 显然,即使
x
p
x_p
xp为整点,仍然存在这样的四个点
x
11
,
x
12
,
x
21
,
x
22
x_{11},x_{12},x_{21},x_{22}
x11,x12,x21,x22使得上式成立。 在下图中,P为非整点,存在4个整点
Q
12
,
Q
11
,
Q
22
,
Q
21
Q_{12},Q_{11},Q_{22},Q_{21}
Q12,Q11,Q22,Q21将P点包围在其中,设纵向比例系数
β
=
y
−
y
2
y
1
−
y
2
\color{blue}\beta=\frac{y-y_2}{y_1-y_2}
β=y1−y2y−y2,横向比例系数
α
=
x
−
x
1
x
2
−
x
1
\color{blue}\alpha=\frac{x-x_1}{x_2-x_1}
α=x2−x1x−x1颜色函数
F
(
P
)
F(P)
F(P)在四个整点处的值分比为
F
12
,
F
11
,
F
22
,
F
21
F_{12},F_{11},F_{22},F_{21}
F12,F11,F22,F21,则P点的函数值
F
P
=
β
[
(
1
−
α
)
F
11
+
α
F
21
]
+
(
1
−
β
)
[
(
1
−
α
)
F
12
+
α
F
22
]
F_P=\beta[(1-\alpha)F_{11}+\alpha F_{21}]+(1-\beta)[(1-\alpha)F_{12}+\alpha F_{22}]
FP=β[(1−α)F11+αF21]+(1−β)[(1−α)F12+αF22]写成矩阵的形式即为:
F
P
=
[
1
−
α
α
]
[
F
11
F
12
F
21
F
22
]
[
β
1
−
β
]
F_P=\begin{bmatrix}1-\alpha ; \alpha \end{bmatrix}\begin{bmatrix} F_{11} ; F_{12} \\[2ex] F_{21} ; F_{22} \end{bmatrix}\begin{bmatrix}\beta \\[2ex] 1-\beta \end{bmatrix}
FP=[1−αα][F11F21F12F22][β1−β] 对于灰度图像,
F
(
P
)
F(P)
F(P)是一维函数,对于RGB图像,
F
(
P
)
=
[
F
R
(
P
)
F
G
(
P
)
F
B
(
P
)
]
F(P)=\begin{bmatrix}F_R(P) \\F_G(P) \\ F_B(P) \end{bmatrix}
F(P)=⎣⎡FR(P)FG(P)FB(P)⎦⎤ 由于该公式较为复杂,可以单独编写双线性插值函数,输入为一个任意点坐标,和图像每个点的像素;输出为该点进行双线性插值后的颜色函数值。但需要主要的是,若给采集的4个周围整点,有其中一个超出了图像边界,考虑到图像边界一般为白色,则以白色为替代。检测点是否在画布内只需要条件判断语句就够了。 ②检测是否在画布内的判断程序:isinrect.m
function y=isinrect(plt,rect)
if plt(1)>=rect(1) && plt(1)=rect(3) && plt(2) |