%双线性内插法做图像旋转
clear,home
format compact
a=imread('Gone_with_the_wind_8bits.bmp');%读入图像
[m,n]=size(a);
alpha_=input('请输入旋转角(角度制):');alpha_=mod(alpha_,360);alpha=alpha_*pi/180;
%则旋转后的图形的大框的高度和宽度为
gd=round(abs(m*cos(alpha))+abs(n*sin(alpha)));kd=round(abs(m*sin(alpha))+abs(n*cos(alpha)));
b=zeros(gd,kd);%旋转后的图像
for i_=1:gd
for j_=1:kd
if alpha_>=0 && alpha_<=90%四种情况的旋转角度下的平移坐标变换
i=i_;j=round(j_-m*sin(alpha));
elseif alpha_>90 && alpha_<=180
i=round(i_-m*sin(alpha-pi/2));j=j_-kd;
elseif alpha_>180 && alpha_<=270
i=i_-gd;j=round(j_-n*cos(alpha-pi));
else
i=round(i_-n*cos(alpha-pi*3/2));j=j_;
end
y_=j*cos(alpha)+i*sin(alpha);x_=-j*sin(alpha)+i*cos(alpha);%旋转坐标变换(注意:这里是逆向旋转变换)
x=fix(x_);y=fix(y_);%这里用fix是为了向下取整,上面用round是为了四舍五入减小误差
u=x_-x;v=y_-y;
if x>0&&y>0&&y<n&&x<m
b(i_,j_)=(1-u)*(1-v)*double(a(x,y))+(1-u)*v*double(a(x,y+1))...
+(1-v)*u*double(a(x+1,y))+u*v*double(a(x+1,y+1));%双线性内插法
end
end
end
imshow(uint8(b));
转载于:https://www.cnblogs.com/yunwux/p/3461098.html