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用的不熟,写的时候头昏脑胀。