数字图像处理9-图像的平移与旋转

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这次作业的内容是要完成让图片绕任意一点旋转的效果,同时要了解图像旋转的原理。为了达到这一目的,我在老师的示例代码上进行了改进,并自己计算出新的变换矩阵,达到了作业中要求的效果。这里我们先来看一下旋转的效果。

旋转中心(0,0),旋转60°旋转中心(0,0),旋转120°

旋转中心(100,0),旋转120°旋转中心(0,600),旋转120°

图像的大小是690*728,旋转的角度为顺时针,因此可以看到四副图中的结果都是符合预期的。之后我们来通过代码,详细的分析这一变化实现的过程。代码如下:

close all;

f = imread('try.jpg');

theta = 2* pi / 3;

x0=0;

y0=600;

T = [cos(theta) sin(theta) 0

-sin(theta) cos(theta) 0

0 0 1];

t1=[ 1 0 0

0 1 0

-x0 -y0 1];

t2=[1 0 0

0 1 0

x0 y0 1];

T=t1*T*t2;

tform = maketform('affine',T);

[g, xdata, ydata] = imtransform(f,tform, 'FillValue',255);

imshow(g,'XData',xdata,'YData',ydata);

hold on;

imshow(f);

axis auto;

axis on;

读入图像后,先设定了三个参数,x0y0就是旋转中心的坐标,而theta就是旋转角(顺时针)。这里要详细说明一下这几个矩阵的作用,并且推导出其生成的过程。首先最主要的矩阵T,是负责旋转的矩阵。以下这个图片摘自网络,可以说较为完整的解释了这个矩阵的来历。

如图,利用勾股定理,旋转后与原点距离不变,和差化积公式可以较为简单的得到二维的旋转变换矩阵。又由于矩阵需要齐次化,最终的旋转矩阵就是:

T = [cos(theta) sin(theta) 0

-sin(theta) cos(theta) 0

0 0 1];

改变旋转中心的操作就比较简单了,由于单独用T做变换是绕原点旋转,那么先把图像平移,让旋转中心与原点重合,随后再做绕原点的旋转,最后再平移回来,就可以达到绕某一点旋转的目的。完成平移操作的变换矩阵是t1和t2,当(x,y,1)与t1相乘后会变为(x-x0,

y-y0,1),所以原先在(x0,y0)的点就来到了原点,此时绕这一点旋转就产生了绕(x0,y0)点旋转的形状,随后再用t2将图像平移会原先的位置,就完成了这次变换。

所以综上所述,最终参与变换的矩阵就是t1*T*t2,也就是:

T=[cos(theta) sin(theta) 0

-sin(theta) cos(theta) 0

X0-x0*cos(theta)+y0*sin(theta) y0-x0*sin(theta)-y0*cos(theta) 1]

随后程序中定义了一个变换对象tform,定义为变换矩阵为T的仿射变换。随后imtransform 函数就是实现这一变换的函数,“fillvalue”,255指用白色填充空的区域,而返回值中多出的xdata和ydata,分别记录了转换后图像的起始、终止点的横纵坐标。后续的imshow函数中利用这个坐标重新定义了起始与终止点,保证图像的起始点与原点重合,这样就可以确保旋转变的结果输出在正确的位置。后面的axis函数则是控制轴的打开与自动缩放,来让显示界面中的图像出现在合适的位置。

此外,这个程序相比于老师给的示例程序做了一点小的优化。之前的绘制顺序是先画原图,后画旋转后的图像。这样如果旋转角度小于90°,或旋转中心在x轴正方向上时,新图像的白色填充会遮住原图的一部分。而改变了顺序后,由于原图没有填充区域,因此不会产生白色的空隙,但是重叠的区域仍然只能显示一层。

相关文档
最新文档