数字图像插值算法分析与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;