资源描述
一.问题的叙述
插值是一种最基本、最常用的几何运算。尤其随着多媒体技术的发展以及大屏幕的图像显示,以及生物医学领域的发展,图像放大的重要性也越来越明显。它不仅应用广泛, 而且插值的精度直接影响最终的图像处理结果,在图像处理软件中对图像进行缩放时,插值算法的好坏直接关系到图像的失真程序, 插值函数的设计是插值算法的核心问题。常采用三种插值算法: 最近邻点插值、双线性插值和双三次插值, 其中双三次插值的效果最好, 而且这一结论也得到了普遍的公认。本文对该三种算法进行了分析并通过matlab编程实现了算法。
二.二维图像插值技术
2.1 最邻近插值法
最邻近插值又称为像素重复放大法。它是一种最简单也是最原始的图像
插值放大,它的基本原理是用原始像素直接对插值点像素用原始像素填充。
最近邻点插值又称零阶插值, 它输出的像素值等于距离它映射到的位置最近的输入像素值。对于二维图像, 该法是"取待采样点周围4 个相邻像素点中距离最近的1 个邻点的灰度值作为该点的灰度值。插值公式:
(1)
其中i、j均为非负整数, u、v 为[0,1)区间的浮点数,一般可取0.5, f(i,j)表示源图像(i,j)处的的像素值。
2.2双线性插值法
二元函数的线性插值方法是一元函数线性插值方法的直接推广,将一维空间中的线段推广为二维空间中的矩形,由此产生二维线性插值。已知平面上一矩形域内四个定点P1,P2,P3,P4处的函数值为:
,
,
令 , 由此构造基函数:
,
,
所以有差值函数为
(2)
2.3 双三次差值法
对于灰度变化复杂的图像,不能简单的采用线性插值。可以采用多项式插值技术对数据点做多项式插值,不仅考虑到四个直接邻点灰度值的影响, 还考虑到各邻点间灰度值变化率的影响", 利用了待采样点周围更大邻域内像素的灰度值作三次插值。多项式插值如下:。需用n+1个数据点来建立方程组,求出系数的值。
用公式表达为:
(4)
定义
f(i+u,j+v) = [A] * [B] * [C]
三.算法实现:
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;
% xx ,yy 表示当前像素点在源图像中的坐标,x,y表示在插值图像中的坐标
xx = x * widthScale;
yy = y * heightScale;
if (xx==double(uint16(xx))) & (yy==double(uint16(yy))) %如果xx,yy为整数,则将像素点在原图中的值I(x,y)直接赋给J(x,y)
M = I(int16(xx),int16(yy));
else % 如果a,b不是整数,则进行双线性插值
a = double(uint16(xx)); % xx,yy取最邻近的整数
b = double(uint16(yy));
if a<=0 % 避免取整后超过图像大小
a=1;
end
if b<=0
b=1;
end
if a>=nrows
a=nrows-1;
end
if b>=ncols
b=ncols-1;
end
x11 = double(I(a,b)); % x11 <- I(a,b)
x12 = double(I(a,b+1)); % x12 <- I(a,b+1)
x21 = double(I(a+1,b)); % x21 <- I(a+1,b)
x22 = double(I(a+1,b+1)); % x22 <- I(a+1,b+1)
M = uint8( (b+1-yy) * ((xx-a)*x21 + (a+1-xx)*x11) + (yy-b) * ((xx-a)*x22 +(a+1-xx) * x12) ); %利用插值公式计算J(x,y)的值
End
3.3 双三次插值关键部分程序:
由于图像的边界点不能进行双三次差值,因此,需要对图像进行分步插值,当插值点对应图像边缘点时则进行双线性插值,否则进行双三次差值。关键部分程序如下:
%双三次插值
function T=s2(x,y,nrows,ncols,K,I)
% K表示放大倍数
width = K * nrows;
height = K * ncols;
widthScale = nrows/width;
heightScale = ncols/height;
% xx ,yy 表示当前像素点在源图像中的坐标,x,y表示在插值图像中的坐标
xx = x * widthScale;
yy = y * heightScale;
a = double(uint16(xx)); % 取xx,yy点的最邻近值
b = double(uint16(yy));
x11 = double(I(a-1,b-1)); % x11 <- I(a-1,b-1) % 取最近的16个点的值
x12 = double(I(a-1,b)); % x12 <- I(a-1,b)
x13 = double(I(a-1,b+1)); % x21 <- I(a-1,b+1)
x14 = double(I(a-1,b+2)); % x22 <- I(a-1,b+2)
x21 = double(I(a,b-1)); % x11 <- I(a,b-1)
x22 = double(I(a,b)); % x12 <- I(a,b)
x23 = double(I(a,b+1)); % x21 <- I(a,b+1)
x24 = double(I(a,b+2)); % x22 <- I(a,b+2)
x31 = double(I(a+1,b-1)); % x11 <- I(a+1,b-1)
x32 = double(I(a+1,b)); % x12 <- I(a+1,b)
x33 = double(I(a+1,b+1)); % x21 <- I(a+1,b+1)
x34 = double(I(a+1,b+2)); % x22 <- I(a+1,b+2)
x41 = double(I(a+2,b-1)); % x11 <- I(a+2,b-1)
x42 = double(I(a+2,b)); % x12 <- I(a+2,b)
x43 = double(I(a+2,b+1)); % x21 <- I(a+2,b+1)
x44 = double(I(a+2,b+2)); % x22 <- I(a+2,b+2)
A=[(b-1)^3,(b-1)^2,b-1,1;b^3,b^2,b,1;(b+1)^3,(b+1)^2,b+1,1;(b+2)^3,(b+2)^2,b+2,1]; %利用插值公式计算
D1=[x11;x12;x13;x14];
P=A\D1;
F1=P(1)*yy^3+P(2)*yy^2+P(3)*yy+P(4);
D2=[x21;x22;x23;x24];
P=A\D2;
F2=P(1)*yy^3+P(2)*yy^2+P(3)*yy+P(4);
D3=[x31;x32;x33;x34];
P=A\D3;
F3=P(1)*yy^3+P(2)*yy^2+P(3)*yy+P(4);
D4=[x41;x42;x43;x44];
P=A\D4;
F4=P(1)*yy^3+P(2)*yy^2+P(3)*yy+P(4);
A=[(a-1)^3,(a-1)^2,a-1,1;a^3,a^2,a,1;(a+1)^3,(a+1)^2,a+1,1;(a+2)^3,(a+2)^2,a+2,1];
D=[F1;F2;F3;F4];
P=A\D;
T = P(1)*xx^3+P(2)*xx^2+P(3)*xx+P(4); %计算出J(x,y)的值,这里用T表示。
end
四.实验结果:
本程序可以实现从0.2到5倍的放大,为了便于观察和比较不同的插值算法对图像插值的效果,本文将原图于放大三倍的图像进行对比:
图(1) 原图
图(2)最邻近插值法
图(3)双线性插值法
图(4)双三次差值
五.结论
最近邻点插值的优点是算法简单,运算速度快。但由于仅用对该采样点影响最大的(即最近的)像素的灰度值作为该点的值,而没有考虑其他相邻像素的影响(相关性), 其缺点是重新采样后的图像灰度值有明显的不连续性,插值质量差,会在图像中产生人为加工的痕迹, 图像易产生马赛克和边缘锯齿等。与最近邻点插值相比, 双线性插值由于考虑了待采样点周围四个直接邻点对待采样点的影响, 因此基本克服了前者灰度不连续的缺点, 但其代价是计算量有所增大。但进一步看, 由于此方法仅考虑四个直接邻点灰度值的影响, 而未考虑到各邻点间灰度值变化率(斜率不连续)的影响, 因此具有低通滤波器的性质, 使缩放后图像的高频分量受到损失, 图像的轮廓变得较模糊。用此方法缩放后的图像与原图像相比, 仍然存在由于计算模型考虑不周而产生的图像质量(细节)退化与精度降低的问题。双三次插值能创造出比双线性插值更平滑的图像边缘, 但计算量最大。
因此, 在进行图像处理时, 应根据不同的场合, 采用不同的算法, 才能达到一个满意的结果。
展开阅读全文