图像旋转的原理与实现
一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点逆时针旋转角后的对应点为。那么,旋转前后点、的坐标分别是:
写成矩阵表达式为
其逆运算为
利用上述方法进行图像旋转时需要注意如下两点:
(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。
(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。
以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转度,首先将原点平移到(a,b),即
然后旋转
然后再平移回来
附录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
B=
imread
(
'image1.bmp'
);
%读取原图像
[m,n]=
size
(B);
%获取原图尺寸w
%参数设置
theta =
pi
/4;
%旋转角度
a =
sin
(theta);
b =
cos
(theta);
T = [
cos
(theta),
sin
(theta),;
%旋转矩阵
-
sin
(theta),
cos
(theta)];
%建立存储空间
row=m+
round
((m)/2);
col=n+
round
((n)/2);
rotateima =
zeros
(row, col);
%存储旋转后图像的矩阵
%图像旋转
for
i
=1:m
for
j
=1:n
x=
ceil
(
abs
((
i
-
round
(m/2))*b-(
j
-
round
(n/2))*a+
round
(row/2)));
%坐标平移至中心
y=
ceil
(
abs
((
i
-
round
(m/2))*a+(
j
-
round
(n/2))*b+
round
(col/2)));
%坐标平移至中心
rotateima(x,y)=B(
i
,
j
);
%未插值的图像
end
end
nrotateima =
uint8
(rotateima);
imshow(nrotateima);
title
(
'未插值的图像'
)
%图像插值(近邻插值法)
for
i
=1:row
for
j
=2:col-1
if
(rotateima(
i
,
j
) == 0 && rotateima(
i
,
j
-1) ~= 0 && rotateima(
i
,
j
+1) ~= 0 )
rotateima(
i
,
j
) =rotateima(
i
,
j
-1) ;
end
end
end
%图像显示
figure
(1);
imshow(B)
title
(
'原始图像'
);
% figure(2);
% imshow(nrotateima);
% title('未插值的图像');
figure
(3);
imshow(rotateima/256);
imwrite
(rotateima/256,
'旋转后图像.jpg'
,
'jpg'
);
title
(
'旋转图'
);
|
图像旋转的原理与实现
一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点逆时针旋转角后的对应点为。那么,旋转前后点、的坐标分别是:
写成矩阵表达式为
其逆运算为
利用上述方法进行图像旋转时需要注意如下两点:
(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。
(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。
以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转度,首先将原点平移到(a,b),即
然后旋转
然后再平移回来
附录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
B=
imread
(
'image1.bmp'
);
%读取原图像
[m,n]=
size
(B);
%获取原图尺寸w
%参数设置
theta =
pi
/4;
%旋转角度
a =
sin
(theta);
b =
cos
(theta);
T = [
cos
(theta),
sin
(theta),;
%旋转矩阵
-
sin
(theta),
cos
(theta)];
%建立存储空间
row=m+
round
((m)/2);
col=n+
round
((n)/2);
rotateima =
zeros
(row, col);
%存储旋转后图像的矩阵
%图像旋转
for
i
=1:m
for
j
=1:n
x=
ceil
(
abs
((
i
-
round
(m/2))*b-(
j
-
round
(n/2))*a+
round
(row/2)));
%坐标平移至中心
y=
ceil
(
abs
((
i
-
round
(m/2))*a+(
j
-
round
(n/2))*b+
round
(col/2)));
%坐标平移至中心
rotateima(x,y)=B(
i
,
j
);
%未插值的图像
end
end
nrotateima =
uint8
(rotateima);
imshow(nrotateima);
title
(
'未插值的图像'
)
%图像插值(近邻插值法)
for
i
=1:row
for
j
=2:col-1
if
(rotateima(
i
,
j
) == 0 && rotateima(
i
,
j
-1) ~= 0 && rotateima(
i
,
j
+1) ~= 0 )
rotateima(
i
,
j
) =rotateima(
i
,
j
-1) ;
end
end
end
%图像显示
figure
(1);
imshow(B)
title
(
'原始图像'
);
% figure(2);
% imshow(nrotateima);
% title('未插值的图像');
figure
(3);
imshow(rotateima/256);
imwrite
(rotateima/256,
'旋转后图像.jpg'
,
'jpg'
);
title
(
'旋转图'
);
|