双线性插值算法
张俊飞
一、算法简介
假设c[a]到c[a+1]之间是线性变化的,那么对于浮点数 x( a <= x < a+1)
c(x) = c[a+1]*( x - a) + c[a]*( 1 + a - x); c(x) = c[a] + [ (c[a+1]-c[a])/(b-a)]*( x - a); b = a+1;
c(x) = c[a] + [ c[a+1] - c[a]]*( x - a);
把这种插值方式扩展到二维情况:对于一个二维数组c,
我们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数) ,
那么对于浮点数的坐标(x,y)满足(a <= x < a+1, b <= y < b+1),可以先分别求出c(x,b)和c(x,b+1):
c(x,b) = c[a+1][b]*( x - a) + c[a][b]*( 1 + a - x);
c(x,b+1) = c[a+1][b+1]*( x - a) + c[a][b+1]*( 1 + a - x);
现在已经知道c(x,b)和c(x,b+1)了,而根据假设c(x,b)到c(x,b+1)也是线性变化的,所以: c(x,y) = c(x,b+1)*( y - b) + c(x,b)*( 1 + b - y)
二、matlab实现
在command窗口输入chahzi('cameraman.tif',2),这里cameraman.tif为灰度图片,得到结果如下:
origin imageresult image
在command窗口输入chahzi('a.jpg',0.5),这里a.jpg为彩色图片,得到结果为:
origin imageresult image
由以上结果可知,该算法的鲁棒性较强,图片伸缩插值保真度高。
三、代码
function []=chahzi(str,k) % str input image
% k zoo in or out k times % clear all % clc % k=2;
I=imread(str); % if size(I,3)~=1 % I=rgb2gray(I); % end
figure,imshow(I);
title('origin image'); I=double(I);
[rows cols tongdao]=size(I); x_new=rows*k;
y_new=cols*k; %缩放至k倍。
I_new=zeros(x_new,y_new,tongdao);
for rgb=1:tongdao for i=1:x_new for j=1:y_new
x=i/k;a=floor(x);
y=j/k;b=floor(y); %% 双线性插值算法 if
a>0&&b>0&&a cxb=I(a+1,b,rgb)*(x-a)+I(a,b,rgb)*(1+a-x); cxb1=I(a+1,b+1,rgb)*(x-a)+I(a,b+1,rgb)*(1+a-x); I_new(i,j,rgb)=round(cxb1*(y-b)+cxb*(1+b-y)); end end end end % iftongdao==1%如果输入是灰度图,则 % I_new=I_new(:,:,1); % end figure,imshow(uint8(I_new)) title('result image');