数字图像插值算法分析与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一.问题的叙述

插值是一种最基本、最常用的几何运算。尤其随着多媒体技术的发展以及大屏幕的图像显示,以及生物医学领域的发展,图像放大的重要性也越来越明显。它不仅应用广泛, 而且插值的精度直接影响最终的图像处理结果,在图像处理软件中对图像进行缩放时,插值算法的好坏直接关系到图像的失真程序, 插值函数的设计是插值算法的核心问题。常采用三种插值算法: 最近邻点插值、双线性插值和双三次插值, 其中双三次插值的效果最好, 而且这一结论也得到了普遍的公认。本文对该三种算法进行了分析并通过matlab 编程实现了算法。 二.二维图像插值技术 2.1 最邻近插值法

最邻近插值又称为像素重复放大法。它是一种最简单也是最原始的图像 插值放大,它的基本原理是用原始像素直接对插值点像素用原始像素填充。

最近邻点插值又称零阶插值, 它输出的像素值等于距离它映射到的位置最近的输入像素值。对于二维图像, 该法是"取待采样点周围4 个相邻像素点中距离最近的1 个邻点的灰度值作为该点的灰度值。插值公式:

(,)(,)f i u j v f i j ++= (1)

其中i 、j 均为非负整数, u 、v 为[0,1)区间的浮点数,一般可取0.5, f(i,j)表示源图像(i,j)处的的像素值。 2.2双线性插值法

二元函数的线性插值方法是一元函数线性插值方法的直接推广,将一维空间中的线段推广为二维空间中的矩形,由此产生二维线性插值。已知平面上一矩形域内四个定点P1,P2,P3,P4处的函数值为:

111(,)Z f x y =, 221(,)Z f x y =

322(,)Z f x y =, 412(,)Z f x y =

令 121x x u x x -=

- ,1

21

y y v y y -=- 由此构造基函数: 1(,)(1)(1)l u v u v ==-- , 2(,)(1)l u v u v ==-

3(,)l u v uv ==, 3(,)(1)l u v u v ==-

所以有差值函数为

1234(,)(1)(1)(1)(1)P x y Z u v Z u v Z uv Z u v =--+-++- (2)

2.3 双三次差值法

对于灰度变化复杂的图像,不能简单的采用线性插值。可以采用多项式插值技术对数据点做多项式插值,不仅考虑到四个直接邻点灰度值的影响, 还考虑到各邻点间灰度值变化率的影响", 利用了待采样点周围更大邻域内像素的灰度值作三次插值。多项式插值如下:101....n n y c c x c x =+++。需用n+1个数据点来建立方程组,求出系数01,....n c c c 的值。 用公式表达为:

(,)[][][]f i u j v A B C ++=** (4)

定义

sin .()x S x x

π=

[]()

1()(1)(2)A S u S u S u S u =+--⎡⎤⎣⎦

(1,1)

(1,)(1,1)(1,2)(,1)

(,)(,1)(,2)[](1,1)(1,)(1,1)(1,2)(2,1)

(2,)

(2,1)

(2,2)f i j f i j f i j f i j f i j f i j f i j f i j B f i j f i j f i j f i j f i j f i j f i j f i j ----+-+⎡⎤⎢⎥-++⎢

⎥=⎢⎥

+-+++++⎢

+-+++++⎣⎦

f(i+u,j+v) = [A] * [B] * [C]

(1)()[](1)(2)S v S v C S v S v +⎡⎤⎢⎥

⎥=⎢⎥-⎢⎥-⎣⎦

2323123,01()485,120,2x x x S x x x x x x ⎧-+≤<⎪⎪

=-+-≤<⎨⎪>⎪⎩

三.算法实现:

3.1 最邻近插值法:

clc; clear;

%function y=resize(a,K)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %I:输入图像 %K:缩放倍数

%type:1表示最邻近法,2表示双极性插值法

%画出缩放后图像并返回其灰度值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% I=imread('girl.bmp');%读入图像

I=rgb2gray(I);

K=3;

[m,n]=size(I);

m1=m*K;n1=n*K;

%

for i=1:m1

for j=1:n1

tic %计算插值所用的时间

u=round(i/K); %取最邻近值

v=round(j/K); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if u<=0 %避免取近似值时超过图像的边界

u=1;

end

if v<=0

v=1;

end

if u>=m1

u=m1;

end

if v>=n1

v=n1;

end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

b(i,j)=I(u,v); %为新的图像赋值

end

end

toc

imshow(b);

title('缩放后图像');

3.2 双线性插值关键部分程序:

%双线性插值

function M=s1(x,y,nrows,ncols,K,I)

% K表示放大倍数

width = K * nrows;

height = K * ncols;

widthScale = nrows/width;

heightScale = ncols/height;

相关文档
最新文档