clear;
clc;
imagDat=imread('t3','bmp');
imagGray=rgb2gray(imagDat);%注意这里需要转换成灰度图像
[row column]=size(imagGray);
angle=25;
Angle=25;%用于matlab中自带图像旋转函数的角度参数
angle=pi*angle/180;%用于可代码的角度参数 注意这里代入的是以弧度为单位的角度值
cosa=cos(angle);
sina=sin(angle);
%计算源图像旋转后要显示的区域
Wold=row;Hold=column;
SrcX1=(-0.5*Wold);
SrcY1=(0.5*Hold);
SrcX2=(0.5*Wold);
SrcY2=(0.5*Hold);
SrcX3=(-0.5*Wold);
SrcY3=(-0.5*Hold);
SrcX4=(0.5*Wold);
SrcY4=(-0.5*Hold);
%新图像对应数值
DstX1=cosa*SrcX1+sina*SrcY1;
DstY1=-sina*SrcX1+cosa*SrcY1;
DstX2=cosa*SrcX2+sina*SrcY2;
DstY2=-sina*SrcX2+cosa*SrcY2;
DstX3=cosa*SrcX3+sina*SrcY3;
DstY3=-sina*SrcX3+cosa*SrcY3;
DstX4=cosa*SrcX4+sina*SrcY4;
DstY4=-sina*SrcX4+cosa*SrcY4;
%新图像的宽高
Wnew = fix(max(abs(DstX4-DstX1),abs(DstX3-DstX2)));
Hnew = fix(max(abs(DstY4-DstY1),abs(DstY3-DstY2)));
num1 = -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold;
num2 = 0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold;
%旋转操作
for y1=1:Hnew
for x1=1:Wnew
%得到横坐标和纵坐标在原图中的位置 注意这里是用已旋转的图像坐标(x1,y1)来计算其在原来图像中的坐标(x0,y0)
%一开始写这个代码时 下面这个公式被一篇研究生毕业论文误导(现在研究生的水平真的是不行呀)
x0= fix(x1*cosa+y1*sina+num1);
y0= fix(-x1*sina+y1*cosa+num2);
if x0>0 && x0<Wold && y0>0 && y0<Hold
newImag(x1,y1)=imagGray(x0,y0);
end
end
end
figure
imshow(imagGray);
title('old');
figure
imshow(newImag);
title('newImag');
newImagB = imrotate(imagGray,Angle);%用matlab自带的旋转函数对比
figure
imshow(newImagB);
title('newImagB');