%%%%%%自写Matlab中的imresize函数
%%%%%%包含最近邻插值、双线性插值和双三次插值
close all;
imgSrc=double(imread('lena.jpg'));
figure;imshow(uint8(imgSrc));title('lena');
[height,width,c]=size(imgSrc);
h=600;
w=600;
%%
%%%最近邻插值
imgNear=zeros(h,w,c);
for k=1:c
for i=1:h
for j=1:w
x=height*i/h;
y=width*j/w;
m=floor(x);
n=floor(y);
if m==0
if n==0
imgNear(i,j,k)=imgSrc(m+1,n+1,k);
else
imgNear(i,j,k)=imgSrc(m+1,round(y),k);
end
else
if n==0
imgNear(i,j,k)=imgSrc(round(x),n+1,k);
else
imgNear(i,j,k)=imgSrc(round(x),round(y),k);
end
end
end
end
end
figure;imshow(uint8(imgNear));title('最近邻插值')
%%
%%%双线性插值
imgBP=padarray(imgSrc,[1,1],'replicate');
imgBilinear=zeros(h,w,c);
for k=1:c
for i=1:h
for j=1:w
x=height*i/h;
y=width*j/w;
m=floor(x);
n=floor(y);
u=x-m;
v=y-n;
imgBilinear(i,j,k)=(1-u)*(1-v)*imgBP(m+1,n+1,k)+(1-u)*v*imgBP(m+1,n+2,k)+...
u*(1-v)*imgBP(m+2,n+1,k)+u*v*imgBP(m+2,n+2,k);
end
end
end
figure;imshow(uint8(imgBilinear));title('双线性插值')
%%
%%%双三次插值
imgCP=padarray(imgSrc,[2,2],'replicate');
imgBicubic=zeros(h,w,c);
for k=1:c
for i=1:h
for j=1:w
x=height*i/h;
y=width*j/w;
m=floor(x);
n=floor(y);
u=x-m;
v=y-n;
part=imgCP(m+1:m+4,n+1:n+4,k);
uWeight=cubeCal(u);
vWeight=cubeCal(v);
weight=uWeight'*vWeight;
imgBicubic(i,j,k)=sum(sum(weight.*part));
end
end
end
figure;imshow(uint8(imgBicubic));title('双三次插值')
评论0