今天去一个公司笔试,考了一个图像缩放的算法,双线性插值,当时没搞出来呀,回来写了个程序仿真,实现了这个功能。
原理 ,参照百度百科(1)写的很详细。
对原图实现放大2*3倍,matlab代码仿真如下:
clear
img1=imread(lena.bmp');
img1=rgb2gray(img1);
img1=double(img1);
[row1,wide1]=size(img1);
row2=row1*2;
wide2=wide1*3;
img2=zeros(row2,wide2);
for y2=5:row2-5
for x2=5:wide2-5;
x=x2/3;
y=y2/2;
q11x=floor(x);
q11y=ceil(y);
q21x=ceil(x);
q21y=ceil(y);
q22x=ceil(x);
q22y=floor(y);
q12x=floor(x);
q12y=floor(y);
X2=ceil(x);% important,当出现如整数5 的时候,x2等于5,x1=4,也就是取当前的坐标和前面的一个坐标计算
X1=ceil(x-1);
Y2=ceil(y-1);%important
Y1=ceil(y);
R1=( X2-x) *img1(q11y,q11x)+(x- X1)*img1(q21y,q21x);
R2=(X2-x) *img1(q12y,q12x)+(x- X1)*img1(q22y,q22x);
fp=-( (Y2- y)*R1 + (y-Y1)*R2) ;
img2(y2,x2)=ceil(fp);
end
end
subplot(1,2,1);
imshow(uint8(img1));
subplot(1,2,2);
imshow(uint8(img2));