双线性插值-matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
双线性插值算法
张俊飞一、算法简介
假设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 image
result image
在command窗口输入chahzi('a.jpg',0.5),这里a.jpg为彩色图片,得到结果为:
origin image
result 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,rg b)*(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');