双线性插值法实现图片的缩放以及旋转

1.缩放

function result = myScale(f)
            R=f(:,:,1);
            G=f(:,:,2);
            B=f(:,:,3);
            [h,w]=size(R);
            kx=2.3;
            ky=1.6;
            H=ceil(ky*h);
            W=ceil(kx*w);
            for newx=1:W
                for newy=1:H
                    oldx=(newx-1)/kx;
                    oldy=(newy-1)/ky;
                    x=floor(oldx)+1;
                    y=floor(oldy)+1;
                    a=oldx-floor(oldx);
                    b=oldy-floor(oldy);
                    if x<w && y<h
                        r(newy,newx)=R(y,x)+b*(R(y+1,x)-R(y,x))+a*(R(y,x+1)-R(y,x))+a*b*(R(y+1,x+1)+R(y,x)-R(y,x+1)-R(y+1,x));
                    elseif x>=w && y<h
                        r(newy,newx)=R(y,x)+b*(R(y+1,x)-R(y,x));
                    elseif x<w && y>=h
                        r(newy,newx)=R(y,x)+a*(R(y,x+1)-R(y,x));
                    else
                        r(newy,newx)=R(y,x);
                    end
                end
            end

            for newx=1:W
                for newy=1:H
                    oldx=(newx-1)/kx;
                    oldy=(newy-1)/ky;
                    x=floor(oldx)+1;
                    y=floor(oldy)+1;
                    a=oldx-floor(oldx);
                    b=oldy-floor(oldy);
                    if x<w && y<h
                        g(newy,newx)=G(y,x)+b*(G(y+1,x)-G(y,x))+a*(G(y,x+1)-G(y,x))+a*b*(G(y+1,x+1)+G(y,x)-G(y,x+1)-G(y+1,x));
                    elseif x>=w && y<h
                        g(newy,newx)=G(y,x)+b*(G(y+1,x)-G(y,x));
                    elseif x<w && y>=h
                        g(newy,newx)=G(y,x)+a*(G(y,x+1)-G(y,x));
                    else
                        g(newy,newx)=G(y,x);
                    end
                end
            end

            for newx=1:W
                for newy=1:H
                    oldx=(newx-1)/kx;
                    oldy=(newy-1)/ky;
                    x=floor(oldx)+1;
                    y=floor(oldy)+1;
                    a=oldx-floor(oldx);
                    b=oldy-floor(oldy);
                    if x<w && y<h
                        blue(newy,newx)=B(y,x)+b*(B(y+1,x)-B(y,x))+a*(B(y,x+1)-B(y,x))+a*b*(B(y+1,x+1)+B(y,x)-B(y,x+1)-B(y+1,x));
                    elseif x>=w && y<h
                        blue(newy,newx)=B(y,x)+b*(B(y+1,x)-B(y,x));
                    elseif x<w && y>=h
                        blue(newy,newx)=B(y,x)+a*(B(y,x+1)-B(y,x));
                    else
                        blue(newy,newx)=B(y,x);
                    end
                end
            end
            result=cat(3,r,g,blue);
        end

2.旋转

function result = myRotate(f)
            R=f(:,:,1);
            G=f(:,:,2);
            B=f(:,:,3);
            [h,w]=size(R);
            ang=pi/2;
            cornerx=[0 w-1 w-1 0];
            cornery=[0 0 h-1 h-1];
            newcornerx=cornerx*cos(ang)+cornery*sin(ang);
            newcornery=-cornerx*sin(ang)+cornery*cos(ang);
            minx=min(newcornerx);
            miny=min(newcornery);
            H=ceil(max(newcornery)-miny+1);
            W=ceil(max(newcornerx)-minx+1);
            for newx=1:W
                for newy=1:H
                    oldx=(newx-1+minx)*cos(ang)-(newy-1+miny)*sin(ang);
                    oldy=(newx-1+minx)*sin(ang)-(newy-1+miny)*cos(ang);
                    if oldx<-0.5||oldy<-0.5||oldx>w-0.5||oldy>h-0.5
                        red(newy,newx)=0;
                    elseif oldx<0&&oldy<0
                        red(newy,newx)=R(1,1);
                    elseif oldx>w-1&&oldy>h-1
                        red(newy,newx)=R(h,w);
                    elseif oldx<0&&oldy>h-1
                        red(newy,newx)=R(h,1);
                    elseif oldy<0&&oldx>w-1
                        red(newy,newx)=R(1,w);
                    else
                        x=floor(oldx)+1;
                        y=floor(oldy)+1;
                        a=oldx-floor(oldx);
                        b=oldy-floor(oldy);
                        if x<=0&&y>0&&y<h
                            red(newy,newx)=R(y,1)+b*(R(y+1,1)-R(y,1));
                        end
                        if y<=0&&x<w&&x>0
                            red(newy,newx)=R(1,x)+a*(R(1,x+1)-R(1,x));
                        end
                        if x>=w&&y>0&&y<h
                            red(newy,newx)=R(y,w)+b*(R(y+1,w)-R(y,w));
                        end
                        if y>=h&&x<w&&x>0
                            red(newy,newx)=R(h,x)+a*(R(h,x+1)-R(h,x));
                        end
                        if x>0&&y>0&&y<h&&x<w
                            red(newy,newx)=R(y,x)+b*(R(y+1,x)-R(y,x))+a*(R(y,x+1)-R(y,x))+a*b*(R(y+1,x+1)+R(y,x)-R(y+1,x)-R(y,x+1));
                        end
                    end
                end
            end



            for newx=1:W
                for newy=1:H
                    oldx=(newx-1+minx)*cos(ang)-(newy-1+miny)*sin(ang);
                    oldy=(newx-1+minx)*sin(ang)-(newy-1+miny)*cos(ang);
                    if oldx<-0.5||oldy<-0.5||oldx>w-0.5||oldy>h-0.5
                        green(newy,newx)=0;
                    elseif oldx<0&&oldy<0
                        green(newy,newx)=G(1,1);
                    elseif oldx>w-1&&oldy>h-1
                        green(newy,newx)=G(h,w);
                    elseif oldx<0&&oldy>h-1
                        green(newy,newx)=G(h,1);
                    elseif oldy<0&&oldx>w-1
                        green(newy,newx)=G(1,w);
                    else
                        x=floor(oldx)+1;
                        y=floor(oldy)+1;
                        a=oldx-floor(oldx);
                        b=oldy-floor(oldy);
                        if x<=0&&y>0&&y<h
                            green(newy,newx)=G(y,1)+b*(G(y+1,1)-G(y,1));
                        end
                        if y<=0&&x<w&&x>0
                            green(newy,newx)=G(1,x)+a*(G(1,x+1)-G(1,x));
                        end
                        if x>=w&&y>0&&y<h
                            green(newy,newx)=G(y,w)+b*(G(y+1,w)-G(y,w));
                        end
                        if y>=h&&x<w&&x>0
                            green(newy,newx)=G(h,x)+a*(G(h,x+1)-G(h,x));
                        end
                        if x>0&&y>0&&y<h&&x<w
                            green(newy,newx)=G(y,x)+b*(G(y+1,x)-G(y,x))+a*(G(y,x+1)-G(y,x))+a*b*(G(y+1,x+1)+G(y,x)-G(y+1,x)-G(y,x+1));
                        end
                    end
                end
            end


            for newx=1:W
                for newy=1:H
                    oldx=(newx-1+minx)*cos(ang)-(newy-1+miny)*sin(ang);
                    oldy=(newx-1+minx)*sin(ang)-(newy-1+miny)*cos(ang);
                    if oldx<-0.5||oldy<-0.5||oldx>w-0.5||oldy>h-0.5
                        blue(newy,newx)=0;
                    elseif oldx<0&&oldy<0
                        blue(newy,newx)=B(1,1);
                    elseif oldx>w-1&&oldy>h-1
                        blue(newy,newx)=B(h,w);
                    elseif oldx<0&&oldy>h-1
                        blue(newy,newx)=B(h,1);
                    elseif oldy<0&&oldx>w-1
                        blue(newy,newx)=B(1,w);
                    else
                        x=floor(oldx)+1;
                        y=floor(oldy)+1;
                        a=oldx-floor(oldx);
                        b=oldy-floor(oldy);
                        if x<=0&&y>0&&y<h
                            blue(newy,newx)=B(y,1)+b*(B(y+1,1)-B(y,1));
                        end
                        if y<=0&&x<w&&x>0
                            blue(newy,newx)=B(1,x)+a*(B(1,x+1)-B(1,x));
                        end
                        if x>=w&&y>0&&y<h
                            blue(newy,newx)=B(y,w)+b*(B(y+1,w)-B(y,w));
                        end
                        if y>=h&&x<w&&x>0
                            blue(newy,newx)=B(h,x)+a*(B(h,x+1)-B(h,x));
                        end
                        if x>0&&y>0&&y<h&&x<w
                            blue(newy,newx)=B(y,x)+b*(B(y+1,x)-B(y,x))+a*(B(y,x+1)-B(y,x))+a*b*(B(y+1,x+1)+B(y,x)-B(y+1,x)-B(y,x+1));
                        end
                    end
                end
            end
            result=cat(3,red,green,blue);
        end

效果如下:

代码写的有点丑了,写完才意识到可以直接三通道在一个双重循环里完成的

如下:

result_image(newy, newx, 2) = G(y, x) + b*(G(y+1, x)-G(y, x)) + a*(G(y, x+1)-G(y, x)) + a*b*(G(y+1, x+1)+G(y, x)-G(y, x+1)-G(y+1, x));

Matlab用的不熟,写的时候头昏脑胀。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值