双线性插值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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