您的位置:首页 > 编程语言 > MATLAB

双线性插值(Matlab实现)

2015-06-18 10:52 537 查看
双线性插值(Matlab实现)

一、原理

最近用到插值算法,使用三次样条插值时仿真速度太慢,于是采用算法简单的线性插值。本篇主要介绍一下双线性插值的实现方法。


1. 线性插值

已知坐标 (x0, y0) 与 (x1, y1),要得到
[x0, x1] 区间内某一位置 x 在直线上的值。



由于 x 值已知,所以可以从公式得到 y 的值



已知 y 求 x 的过程与以上过程相同,只是 x 与 y 要进行交换。


2. 双线性插值(Bilinear Interpolation)

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。





图中:红色的数据点与待插值得到的绿色点

假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 =
(x1, y1)、Q12 =
(x1, y2), Q21 =
(x2, y1) 以及 Q22 =
(x2, y2) 四个点的值。

首先在 x 方向进行线性插值,得到





然后在 y 方向进行线性插值,得到



这样就得到所要的结果 f(x, y),





双线性插值在三维空间的延伸是三线性插值。


二、算法伪代码



三、实现

1. 实验平台与数据

本算法使用Matlab语言实现,实验平台为Windows 8 32位操作系统、4GB内存(可用为2.31GB)、Matlab2013b。

数据1: 大小为:256*256 的lena灰度图像,将使用实现的算法对其进行2倍放大操作,如下图1所示:






图1 灰度图像lena.png

数据2:大小为:670*502 的彩色RGB图像,将使用实现的算法对其进行2倍缩小操作,如下图1所示:





图2 彩色RGB图像he.jpeg

2. 实验程序源代码

imblizoom.m文件源码

function [ ZI ] = imblizoom( I,zmf )

%----------------------双线性插值法缩放矩阵或图像---------------------------

% Input:

% I:图像文件名或矩阵(整数值(0~255))

% zmf:缩放因子,即缩放的倍数

% Output:

% 缩放后的图像矩阵 ZI

% Usage:

% ZI = SSELMHSIC('ImageFileName',zmf)

% 对图像I进行zmf倍的缩放并显示

% Or:

% ZI = SSELMHSIC(I,zmf)

% 对矩阵I进行zmf倍的缩放并显示

% ...

%-------------------------------------------------------------------

%%%% Authors: Zhi Liu

%%%% XiDian University Student

%%%% EMAIL: zhiliu.mind@gmail.com

%%%% DATE: 16-12-2013

%% Step1 对数据进行预处理

if ~exist('I','var') || isempty(I)

error('输入图像 I未定义或为空!');

end

if ~exist('zmf','var') || isempty(zmf) || numel(zmf) ~= 1

error('位移矢量 zmf未定义或为空或 zmf中的元素超过2!');

end

if isstr(I)

[I,M] = imread(I);

end

if zmf <= 0

error('缩放倍数 zmf的值应该大于0!');

end

%% Step2 通过原始图像和缩放因子得到新图像的大小,并创建新图像。

[IH,IW,ID] = size(I);

ZIH = round(IH*zmf); % 计算缩放后的图像高度,最近取整

ZIW = round(IW*zmf); % 计算缩放后的图像宽度,最近取整

ZI = zeros(ZIH,ZIW,ID); % 创建新图像

%% Step3 扩展矩阵I边缘

IT = zeros(IH+2,IW+2,ID);

IT(2:IH+1,2:IW+1,:) = I;

IT(1,2:IW+1,:)=I(1,:,:);IT(IH+2,2:IW+1,:)=I(IH,:,:);

IT(2:IH+1,1,:)=I(:,1,:);IT(2:IH+1,IW+2,:)=I(:,IW,:);

IT(1,1,:) = I(1,1,:);IT(1,IW+2,:) = I(1,IW,:);

IT(IH+2,1,:) = I(IH,1,:);IT(IH+2,IW+2,:) = I(IH,IW,:);

%% Step4 由新图像的某个像素(zi,zj)映射到原始图像(ii,jj)处,并插值。

for zj = 1:ZIW % 对图像进行按列逐元素扫描

for zi = 1:ZIH

ii = (zi-1)/zmf; jj = (zj-1)/zmf;

i = floor(ii); j = floor(jj); % 向下取整

u = ii - i; v = jj - j;

i = i + 1; j = j + 1;

ZI(zi,zj,:) = (1-u)*(1-v)*IT(i,j,:) +(1-u)*v*IT(i,j+1,:)...

+ u*(1-v)*IT(i+1,j,:) +u*v*IT(i+1,j+1,:);

end

end

ZI = uint8(ZI);

%% 以图像的形式显示同现矩阵P

figure

imshow(I,M);

axis on

title(['原图像(大小: ',num2str(IH),'*',num2str(IW),'*',num2str(ID),')']);

figure

imshow(ZI,M);

axis on

title(['缩放后的图像(大小: ',num2str(ZIH),'*',num2str(ZIW),'*',num2str(ID)',')']);

end

3. 实验结果

1) 数据1

在命令窗口输入imblizoom('lena.png', 2);回车后结果如下图3和下图4所示:



图3 lena.png的运行结果1(原图)






图4 lena.png的运行结果2(放大2倍后的图)

2)数据2






图5 he.jpeg运行结果1(原图)






图6 he.jpeg运行结果2(缩小2倍后的图像)

由图3~图6可知,程序正确无误,放大缩小后的效果都很好。程序的用法及其它功能,请查看代码注释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: