双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。例如已知的红色数据点与待插值得到的绿色点如图1所示:图1假如我们想得到未知函数在点的值,假设我们已知函数在,,,及四个点的值。首先在x方向进行线性插值,得到然后在y方向进行线性插值,得到这样就得到所要的结果,如果选择一个坐标系统使得的四个已知点坐标分别为(0,0)、(0,1)、(1,0)和(1,1),那么插值公式就可以化简为或者用矩阵运算表示为这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。双线性插值法的MATLAB源代码为:I=imread('lena.jpg');%读入原图像[nrows,ncols,z]=size(I);%读取图像矩阵大小,方便后面操作K=str2double(inputdlg('pleaseinputscalefactor(mustbetween0.2-5.0)','INPUTscalefactor',1,{'0.5'}));width=K*nrows;height=K*ncols;J=uint8(zeros(width,height,z));widthScale=nrows/width;heightScale=ncols/height;forx=5:width-5%5是为了防止矩阵超出边界溢出fory=5:height-5forz=1:3xx=x*widthScale;%xx,yy为原坐标,x,y为新坐标yy=y*heightScale;if((xx/double(uint16(xx))==1.0)&&(yy/double(uint16(yy))==1.0))J(x,y,z)=I(int16(xx),int16(yy),z);%若xx,yy为整数,直接赋值elsea=double(uint16(xx));b=double(uint16(yy));x11=double(I(a,b,z));%x11-I(a,b)x12=double(I(a,b+1,z));%x12-I(a,b+1)x21=double(I(a+1,b,z));%x21-I(a+1,b)x22=double(I(a+1,b+1,z));%x22-I(a+1,b+1)J(x,y,z)=uint8((b+1-yy)*((xx-a)*x21+(a+1-xx)*x11)+(yy-b)*((xx-a)*x22+(a+1-xx)*x12));%用双线性插值计算公式计算endendendendimshow(I);figure;imshow(J);程序运行后原图如图2所示:图2双线性插值法放大2倍后图像如图3所示:图3