《时域插值的几种图像放大方法.doc》由会员分享,可在线阅读,更多相关《时域插值的几种图像放大方法.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.*基于时域插值的几种图像放大方法摘要:图像插值是图像比例缩放的常用方法。针对时域图像的放大问题,介绍了最邻近、双线性和双立方三种插值方法,并使用matlab对其进行实现、分析。结果表明双立方插值得到的图像质量最高,最邻近和双线性速度较快。1 引言在数字图像处理中,图像的几何变换作为图像处理的基础操作之一,为图像分析提供了灵活多变的预处理模式,简化了后级处理过程,图像的几何变换还为生成特殊样式的图形提供了可能。在图像的几何变换中,图像的比例缩放是最常用的模式。图像的比例缩放是指对数字图像大小按某确定比例进行调整的过程。对于数字图像则其缩放倍的图像 若,则I为x轴方向和y轴方向等比例缩放的图像;
2、否则,图像内的像素位置会发生相对变化,产生图像几何畸变。在本文中,讨论等比例放大图像时的情况,即由图像变换的思想,图像几何变换应当是源图像到目的图像矩阵的映射(前向映射)。前向映射时,由于系数k为有理数,矩阵坐标为自然数的情况,此目的矩阵映射为空;同时目的矩阵存在无灰度值相对应的情况。因此,可引入逆映射法,首先生成一个对应大小的空目的矩阵,分别计算目的矩阵每个像素点对应于原矩阵的位置,对于落在源图像两像素之间的点,可用插值法为其映射一个灰度值,这个过程称为重采样。重采样得出的灰度值由周围像素点的灰度和其权值特性决定,在此讨论三种常见的插值算法:最邻近(Nearest Neighbor)、双线性
3、(Bilinear)和双立方(Bicubic)。2 最邻近插值最邻近插值是最简单的插值方式,它是将目的矩阵映射到源矩阵上,将其距离最近的像素点的值作为插值的值。将目的矩阵的点映射到源矩阵上,定义函数图1则目的矩阵的元素灰度值在程序设计只需将转换到源矩阵的坐标四舍五入至整数以4*4的像素矩阵RGB色域为例将其放大30倍,并与Matlab库函数imresize()放大结果比较(a) 源图像(示意)图2(b)放大50倍(c)放大50倍(imresize函数)最邻近插值方法简单,运算速度快,但其图像灰度变化处会出现明显的阶梯变化,出现“马赛克”的失真现象,整体还原情况不佳。3 双线性插值双线性插值算法
4、中,新插入的像素值由其距离最近的2*2个像素及与它们的距离决定。距离和权值大小成线性关系,在x轴和y轴方向同时存在现象关系,因此称为双线性插值。定义函数为线性插值的权值函数图3在此,为加快计算速度,采用x和y轴方向长度的乘积作为衡量两像素点之间距离的参数。因此,令d为原像素点间距则目的矩阵的灰度值为同样以上述4*4颜色矩阵为例(b)放大50倍(imresize函数)(a)放大50倍图4双线性插值本质上是对周围像素点求加权平均的过程,在频域上可看作低通滤波器,对图像有模糊的作用。在图像颜色梯度较大或图像边缘可观察到模糊的现象。4 双立方插值法双立方插值改进了双线性中图像模糊的问题,它参考了目的像
5、素点映射到源图像矩阵周围4*4共16个像素的灰度值,运用的权值函数h(t)逼近来最佳插值函数。定义函数图5对插值的对应源矩阵像素点p(x,y),取其附近的4x4邻域点p(xi,yj), i,j = 1,2,3,4。按如下公式进行插值计算:以上述4*4颜色矩阵为例(a)放大50倍 (b)放大50倍(imresize函数)图6双立方插值算法不仅考虑到插值临近像素的取值,还引入了周围的灰度值来锐化图像。得到的放大图像失真较小,而且还原了图像本身的细节。5 实验结果为了比较以上三种插值方法对于图像的处理性能,分别对同一灰度图放大相同的倍数(3倍):(a)原图(b)最邻近插值放大(c)双线性插值放大(d
6、)双立方插值放大图7直观比较得到,最近邻放大的图像(b)具有很明显的“马赛克”锯齿现象,图像细节几乎无法体现,物体边缘明显存在畸变和失真。图(c)由双线性插值放大而来,整体还原较好,但细节高频部分被滤波器衰减,出现了模糊的现象。双立方插值得到的图像失真少,局部有较好的体现,效果较好。统计三者相同放大倍率时的处理时间图8最邻近和双线性插值具有较小的时间复杂度,从而运行时间较短,而双立方由于需要计算更多的像素点以及更多浮点运算,消耗最多的时间,但可以得到最好的图像质量。6 结论 最邻近插值本质上只用了一个最接近像素点的灰度信息,运算方法简单,速度快,但其图像灰度变化处会出现明显的阶梯变化,出现“马
7、赛克”的失真现象,整体还原情况不佳;双线性插值上是对周围4个像素点求加权平均,整体失真较小,在频域上可看作低通滤波器,在图像颜色梯度较大或图像边缘可观察到模糊的现象;双立方插值算法不仅考虑到插值临近像素的取值,还引入了周围的16个像素灰度值来锐化图像。得到的放大图像失真较小,而且还原了图像本身的细节,但其运算复杂,时间成本高。在实际应用中,应根据系统的资源、运行的环境和要求灵活运用,以达到最佳的尺度变换效果。本文只讨论了三种在时域范围内变换的插值方法,其处理手段还有相当的局限性。若引入FFT(快速傅里叶变换),将图像变换为频域进行更灵活的处理,还可以进一步提高图像尺度变换的效率和质量,为后续图
8、像处理提供更好的原始样本。参考文献1 何东健.数字图像处理(第二版).西安电子科技大学出版社.20082 王森,杨克俭.基于双线性插值的图像缩放算法的研究与实现.自动化技术与应用.20083 王林,杨克俭.基于双线性插值的图像缩放算法.电脑编程技巧与维护.20084 李秀英,袁红.几种图像缩放算法的研究.现代电子技术.20125 邓林华,柳光乾等.基于插值算法的图像缩放的应用研究.微计算机信息.20106 Rafael C. Gonzalez,Richard E. Woods.Digital Image Processing.电子工业出版社.20137 卢君,张起贵.插值算法在图像缩放中的评估
9、研究.同煤科技.20138 李红梅.基于插值算法的图像缩放技术.新乡学院学报.2017附录1Matlab主要源程序1 最邻近插值function i=NN(p,k)%p the origianl graph%k the magnification row,col,rgb=size(p);%get the size of graph i=zeros(k*row,k*col,3);for x=1:row*k for y=1:col*k; a=round(x/k); b=round(y/k);%Nearst Neibor Interpolation %deal with if a,b=0 if a=
10、0 a=1;end; if b=0 b=1;end; i(x,y,:)=p(a,b,:); endend2 双线性插值function i=bilinear(p,k)%p the origianl graph%k the magnificationrow,col,rgb=size(p);%get the size of graphnrow=row*k;ncol=col*k;i=zeros(nrow,ncol,3);for z=1:3 for x=1:nrow for y=1:ncol a=floor(x/k); b=a+1; c=floor(y/k); d=c+1; %fix the edge
11、 if a=0 a=1;end; if c=0 c=1;end; if brow b=row;a=a-1;end; if dcol d=col;c=c-1;end; i(x,y,z)=(p(b,d,z)*(x/k-a)+p(a,d,z)*(b-x/k)*(y/k-c)+(p(b,c,z)*(x/k-a)+p(a,c,z)*(b-x/k)*(d-y/k); end end end3 双立方插值function i=bicubic(p,k)%p the origianl graph%k the magnificationrow,col,rgb=size(p);%get the size of gr
12、aphnrow=row*k;ncol=col*k;m=row;n=col;p1=zeros(m+4,n+4,3);for z=1:3 %expand 2 head and 2 teila=p(1,:,z);%get row 1 c=p(m,:,z);%get row m b=a;a;p(:,:,z);c;c;a=b(:,1);%col 1c=b(:,n);%col nd=a,a,b(:,:),c,c; p1(:,:,z)=double(d); endi=zeros(nrow,ncol,3);for z=1:3 for x=1:nrow u=rem(x,k)/k; i1=floor(x/k)+2
13、; A=h(1+u) h(u) h(1-u) h(2-u); for y=1:ncol v=rem(y,k)/k;j1=floor(y/k)+2; C=h(1+v);h(v);h(1-v);h(2-v); B=p1(i1-1,j1-1,z) p1(i1-1,j1,z) p1(i1-1,j1+1,z) p1(i1-1,j1+2,z); p1(i1,j1-1,z) p1(i1,j1,z) p1(i1,j1+1,z) p1(i1,j1+2,z); p1(i1+1,j1-1,z) p1(i1+1,j1,z) p1(i1+1,j1+1,z) p1(i1+1,j1+2,z); p1(i1+2,j1-1,z
14、) p1(i1+2,j1,z) p1(i1+2,j1+1,z) p1(i1+2,j1+2,z); i(x,y,z)=(A*B*C); end end end function A=h(t) t=abs(t); if t=0 A=1-2*t2+t3; elseif t=1&t2 A=4-8*t+5*t2-t3; else A=0; end 附录2Matlab运行三种算法时间原数据时间/s倍率NNbilinearbicubic10.0227350.0336440.15043120.0740910.1373370.64909430.1690490.1693961.39507940.1976070.2882682.47970150.3089030.4366824.16728660.4508440.639195.96885770.6107860.8525648.07429280.8022311.14112910.6302791.0557791.455413.605293101.277571.71445117.008054