双线性插值-matlab实现 下载本文

双线性插值算法

张俊飞

一、算法简介

假设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');