一、图像旋转变换的流程
1、确定旋转后新图像的尺寸,设原始大小为M,N
由以上公式得到:
x=[0,(M-1)*cos(Angle),(M-1)*cos(Angle)+(N-1)*sin(Angle),(N-1)*sin(Angle)]; %旋转后新坐标系横坐标
y=[0,-(M-1)*sin(Angle),-(M-1)*sin(Angle)+(N-1)*cos(Angle),(N-1)*cos(Angle)]; %旋转后新坐标系纵坐标
2、坐标变换
3、旋转逆变换
4、新图像赋值
赋值方法有最邻近差值与双线性差值,其中双线性插值法可以使的图像的边缘更加的平滑。
二、完整matlab代码
f=im2bw(imread('picture1.png'));
M=size(f,1); %行
N=size(f,2); %列
Angle=pi/6; %逆时针角度
x=[0,(M-1)*cos(Angle),(M-1)*cos(Angle)+(N-1)*sin(Angle),(N-1)*sin(Angle)]; %旋转后新坐标系横坐标
y=[0,-(M-1)*sin(Angle),-(M-1)*sin(Angle)+(N-1)*cos(Angle),(N-1)*cos(Angle)]; %旋转后新坐标系纵坐标
x1=round(max(x(:)-min(x(:))+1)); %round()函数表示四舍五入取整
y1=round(max(y(:))-min(y(:))+1); %计算新图像分辨率
g=zeros(x1,y1); %新图像的像素点矩阵
for i=0:1:(x1-1)
for j=0:1:(y1-1)
i1=i+min(x(:));
j1=j+min(y(:)); %坐标变换到原坐标系
i2=i1*cos(Angle)-j1*sin(Angle);
j2=i1*sin(Angle)+j1*cos(Angle); %旋转逆变换
i3=round(i2);
j3=round(j2);
if(i3>(M-1)||j3>(N-1)||i3<0||j3<0) %插值运算
g(i+1,j+1)=255;
else
g(i+1,j+1)=f(i3+1,j3+1);
end
end
end
subplot(121),imshow(f),title('原图像');
subplot(122),imshow(g),title('旋转后图像');
三、运行结果
参考文献:
[1] 蔡利梅 王利娟 数字图像处理[M]. 中国矿业大学出版社 2014