![精通Matlab数字图像处理与识别](https://wfqqreader-1252317822.image.myqcloud.com/cover/584/730584/b_730584.jpg)
4.6 图像旋转
旋转一般是指将图像围绕某一指定点旋转一定的角度。旋转通常也会改变图像的大小,和4.2节中图像平移的处理一样,可以把转出显示区域的图像截去,也可以改变输出图像的大小以扩展显示范围。
4.6.1 以原点为中心的图像旋转
如图4.10所示,点P(x0, y0)绕原点逆时针旋转角度θ到点P1(x1, y1)。
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0118.jpg?sign=1739295452-4TbdTs3tEvkp9d3DoG2g9QBPpcVHsAQr-0-70d07539a887d80fcb5239bb237697e5)
▲图4.10 旋转变换坐标图
令 ,则有
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0120.jpg?sign=1739295452-BIlvo3v6mx3DjwE58rkOYntEfYco9znN-0-bb372a329c7e0dbe71d9f74aedaa7823)
到达P1点后,有
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0121.jpg?sign=1739295452-rILb3pIc5BOZ19lHO0Utuiw0JCf5zKST-0-03405b2cf974925298b6609a6153c6f8)
于是有
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0122.jpg?sign=1739295452-FeRqKgXEWRsHAcLus5rB6WJCH0xCjsom-0-56c9306cc1aa7a9b70f73e599f372259)
从而得出旋转变换公式为
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0123.jpg?sign=1739295452-cNgC9EgrqWknbQMAWBKQpVXbNi64M2pF-0-f71034fbde8112f8bdc0393ae2b71422)
相应的,其逆运算为
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0085_0124.jpg?sign=1739295452-wA4m7Br5MVeMt9n0vpXH8obDe5xJIZUc-0-d714f3ea11841c7034f9c6507254530b)
4.6.2 以任意点为中心的图像旋转
在4.6.1中给出的旋转是以坐标原点为中心进行的,那么如何围绕任意的指定点来旋转呢?将平移和旋转操作相结合即可,即先进行坐标系平移,再以新的坐标原点为中心旋转,之后将新原点平移回原坐标系的原点。这一过程可归纳为以下3个步骤。
(1)将坐标系Ⅰ变成Ⅱ。
(2)将该点顺时针旋转θ角。
(3)将坐标系Ⅱ变回Ⅰ。
下面我们就以围绕图像中心的旋转为例,具体说明上述的变换过程。如图4.11所示,坐标系I以图像左上角点为原点,向右为x轴正方向,向下为y轴正方向;而坐标系II是以图像的中心为原点,向右为x轴正方向,向上为y轴正方向。那么坐标系I与坐标系II之间的转换关系如何呢?
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0086_0125.jpg?sign=1739295452-xeHI9E4TY0cwpB9GExBpfTVpACZLk0tc-0-b0f3d27bfdb0a27d0d7963f51730ee76)
▲图4.11 两种坐标系间的转换关系
设图像的宽为w,高为h,则容易得到
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0086_0126.jpg?sign=1739295452-UYAUhUoZa0mo5r6xKmdU5aCBWBJUtCaC-0-6e41ebaaf5a067058c19f4da9cd4fe74)
相应的逆变换为
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0086_0127.jpg?sign=1739295452-6kX4glv1hgVfOSCZfoGCo32LVoMjRChi-0-0cf5086e35973f90972d6c62c657634e)
至此,我们已经实现了上述3个步骤中的第1步和第3步,再加上第2步的旋转变换就得到了围绕图像中心点旋转的最终变换矩阵,该矩阵实际上是3个变换步骤中分别用到的3个变换矩阵的级联。
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0086_0128.jpg?sign=1739295452-2sEHazIk80Upe7EHtbs4kChIX8NaW8i6-0-6fdb2ec935a24d23d6ad3ddde709260b)
式中:Wold、Hold、Wnew、Hnew分别表示原图像和新图像的宽和高。
上式的逆变换为
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0086_0129.jpg?sign=1739295452-EcUjPgsnKTyY6EcC1kz2X9HHq8pphSgJ-0-dabc72c9f9569ffe7a16a1873b8359ce)
这样,我们就可以根据上面的逆变换公式,按照算法4.1中的描述来实现围绕图像中心的旋转变换。类似地,可以进一步得出以任意点为中心的旋转变换。
4.6.3 图像旋转的Matlab实现
图像旋转变换的效果受具体插值方法的影响较为明显,本节给出的实现均采用最近邻插值,在4.7节中将给出采用不同的插值算法时图像旋转变换的效果比较。
可通过4.6.2中学习的方法设置适当的变换结构TFORM,从而调用imtransform 来实现以任意点为中心的图像旋转。此外,Matlab还专门提供了围绕图像中心的旋转变换函数imrotate,其调用方式如下。
B=imrotate(A,angle,method, 'crop');
● A是要旋转的图像。
● angle 为旋转角度,单位为度,如为其指定一个正值,则 imrotate 函数按逆时针方向旋转图像。
● 可选参数method为 imrotate函数指定插值方法。
● 'crop'选项会裁剪旋转后增大的图像,使得到的图像和原图大小一致。
下面的例4.5给出了图像旋转的Matlab实现。
[例4.5]图像旋转
% 围绕中心点的图像旋转
A=imread('pout.tif');
%最近邻插值法逆旋转30°,并剪切图像
B=imrotate(A,30,'nearest','crop');
subplot(1,2,1),imshow(A);
title('原图像');
subplot(1,2,2),imshow(B);
title('逆时针旋转30°');
程序运行结果如图4.12所示。
![](https://epubservercos.yuewen.com/28355A/3728991904099001/epubprivate/OEBPS/Images/figure_0087_0130.jpg?sign=1739295452-TCDFyUAMOgcBVUEMTuw7gm9CufwMm5c8-0-73c31b31423906d9bdbbc55fbf78cf2a)
▲图4.12 旋转变换效果图