%双线性内插法做图像旋转
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));

posted on 2013-12-06 11:39  向云武  阅读(224)  评论(0编辑  收藏  举报