双线性插值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。例如已知的红色数据点与待插值得到的绿色点如图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('please input scale factor (must

between 0.2 - 5.0)', 'INPUT scale factor', 1, {'0.5'}));

width = K * nrows;

height = K * ncols;

J = uint8(zeros(width,height,z));

widthScale = nrows/width;

heightScale = ncols/height;

for x = 5:width - 5 % 5是为了防止矩阵超出边界溢出

for y = 5:height - 5

for z=1:3

xx = 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为整数,直接赋值

else

a = 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)); %用双线性插值计算公式计算

end

end

end

end

imshow(I);

figure;

imshow(J);

程序运行后原图如图2所示:

图2

双线性插值法放大2倍后图像如图3所示:

图3

相关文档
最新文档