常见的插值方法及其原理_第1页
常见的插值方法及其原理_第2页
常见的插值方法及其原理_第3页
常见的插值方法及其原理_第4页
常见的插值方法及其原理_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常见的插值方法及其原理这一节无可避免要接触一些数学知识,为了让本文通俗易懂,我们尽量绕开讨厌的公式等。为了进一步的简化难度,我们把讨论从二维图像降到一维上。首先来看看最简单的最临近像素插值。A,B是原图上已经有的点,现在我们要知道其中间X位置处的像素值。我们找出X位置和A,B位置之间的距离dl,d2,如图,d2要小于d1,所以我们就认为X处像素值的大小就等于B处像素值的大小。显然,这种方法是非常苯的,同时会带来明显的失真。在A,B中点处的像素值会突然出现一个跳跃,这就是为什么会出现马赛克和锯齿等明显走样的原因。最临近插值法唯一的优点就是速度快。图l0,最临近法插值原理d11ThenDRt=(N

2、xtR-CurR)*NegNDGt=(NxtG-CurG)*NegNDBt=(NxtB-CurB)*NegNDR=0DG=0DB=0ForL=Yb+1ToYe-1DR=DR+DRtDG=DG+DGtDB=DB+DBtColTmp(0,X,L)=CurR+DRColTmp(1,X,L)=CurG+DGColTmp(2,X,L)=CurB+DBNextEndIfCurStep=NxtStepCurR=NxtRCurG=NxtGCurB=NxtBNextColTmp(0,X,OutPutHei)=NxtRColTmp(l,X,OutPutHei)=NxtGColTmp(2,X,OutPutHei)=

3、NxtBNextNegN=1/Int(Xratio+1)ForY=0ToOutPutHeiCurR=ColTmp(0,0,Y)CurG=ColTmp(1,0,Y)CurB=ColTmp(2,0,Y)CurStep=0NxtStep=0ForX=0ToInPutWid-1NxtStep=CurStep+XratioXb=CurStepXe=NxtStepN=Xe-XbColOut(0,Xb,Y)=CurRColOut(1,Xb,Y)=CurGColOut(2,Xb,Y)=CurBM=X+1NxtR=ColTmp(0,M,Y)NxtG=ColTmp(1,M,Y)NxtB=ColTmp(2,M,Y)

4、IfN1ThenDRt=(NxtR-CurR)*NegNDGt=(NxtG-CurG)*NegNDBt=(NxtB-CurB)*NegNDR=0DG=0DB=0ForL=Xb+1ToXe-1DR=DR+DRtDG=DG+DGtDB=DB+DBtColOut(0,L,Y)=CurR+DRColOut(1,L,Y)=CurG+DGColOut(2,L,Y)=CurB+DBNextEndIfCurStep=NxtStepCurR=NxtRCurG=NxtGCurB=NxtBNextColOut(0,OutPutWid,Y)=NxtRColOut(l,OutPutWid,Y)=NxtGColOut(2

5、,OutPutWid,Y)=NxtBNextDone=TrueTimeZoom=timeGetTime-TimeZoomCanPut=TrueExitSubErrLine:MsgBoxErr.DescriptionEndSub全局变量定义:DimColTmp()AsByte用于保存插值中间变量DimOutPutHeiAsLong要插值的目标高度DimOutPutWidAsLong要插值的目标宽度PublicTimeZoomAsLong插值运算使用的时间简单解释一下关于二次线性插值算法。(为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)假设我们有一个很简单的

6、图片,图片只有4个像素(2*2)现在我们要把这个图片插值到9个像素:3*3其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。想必看到这个图,大家心里已经有了这个算法了。推导:很简单,对吧,先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向。而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。有可能为有朋友已经想到把原来的图像插值到4*4或5*5的方法了。推导:以A和B为例,先求出原始像素的差(A-B)再算出每一步的递增量(A-B)/3;然后每一个新的点就是在前面那个点的值加上这个递增量就是了。这里我们

7、假设A=100,B=255放大倍率为3,水平方向插值;先计算出原始像素的差:(B-A)=255-100=155再计算出水平方向每一步的递增量:(A-B)/3=155/3=51.7这里我们用一个变量DRt来记录这个递增量(这里只用红色来做例子)好了,其实二次线性算法就是这么一个东西,并不复杂。或许有写朋友会对于我给出的代码产生疑问。很简单的一个算法为什么要写这么多代码。其实答案很简单:为了提高速度。在VB中“+”和“-”永远是最快的,“*”要比“/”和“”快。不论是什么类型的变量都是这样的。下面再来分析一下我的程序。在我的程序中把两个方向的插值分解成了两个单独的部分。先把变成:再变成:这两个方向的插值算法完全相同而Xratio和Yratio这两个变量则用来记录水平方向和垂直方向的放大倍率。所以这个过程也能够让图像缩放不按照原始的纵横比进行。好了,将这个模块和全局变量添加到上次建立的工程模块中。把按钮中的代码改成:DibGet.hdc,0,0,.scalewidth,.scaleheightZoomimage,.scalewidth*2,.scaleheight*2EndWithpicture2.AutoRedraw=TrueDibPutpicture2.hdcpicture2.ref

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论