常见插值方法及其基础原理Word格式文档下载.docx
- 文档编号:22420705
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:17
- 大小:20.49KB
常见插值方法及其基础原理Word格式文档下载.docx
《常见插值方法及其基础原理Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《常见插值方法及其基础原理Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
所谓两次线性和两次立方实质上就是把方才的剖析拓展到二维空间上,在宽和高方向上作两次插值的意思。
在以上的基础上,有
的软件还发展了更复杂的改进的插值方式譬如S-SPline,TurboPhoto等。
他们的目的是使边沿的表现更完满。
插值(Interpolation),有时也称为“重置样本”,是在不生成像素的情况下增添图像像素大小的一种方法,在四周像素色彩的基础上用数学公式计算丢掉像素的色彩。
简单地说,插值是依据中心像素点的颜色参数模拟出周边像素值的方法,是数码相机独有的放大数码照片的软件手段。
一、认识插值的算法
“插值”最先是电脑术语,以后引用到数码图像上来。
图像放大时,像素也相应地增添,但这些增添的像素从何而来?
这时插值就派上用处了。
插值就是在不生成像素的状况下增添图像像素大小的一种方法,在四周像素色彩的基础上用数学公式计算丢掉像素的色彩(也有些相机使用插值,人为地增添图像的分辨
率)。
所以在放大图像时,图像看上去会比较光滑、洁净。
但一定注意的是插值其实不可以增添图像信息。
以图1为原图(见图1),以下是经过不一样插值算法办理的图片。
1.近来像素插值算法
最近像素插值算法(NearestNeighbourInterpolation)是最简单的一种插
值算法,当图片放大时,缺乏的像素经过直接使用与之最靠近的原有像素的颜色生成,也就是说照搬旁边的像素,这样做的结果是产生了明显可见的锯齿(见图
2)。
2.双线性插值算法
双线性插值算法(BilinearInterpolation)输出的图像的每个像素都是原
图中四个像素(2×
2)运算的结果,这类算法极大程度上除去了锯齿现象(见图3)。
3.双三次插值算法
双三次插值算法(BicubicInterpolation)是上一种算法的改进算法,它输
出图像的每个像素都是原图16个像素(4×
4)运算的结果(见图4)。
这类算法是一种很常有的算法,广泛用在图像编写软件、打印机驱动和数码相机上。
4.分形算法
分形算法(FractalInterpolation)是AltamiraGroup
这类算法获得的图像跟其余算法对比更清楚、更锋利(见图5)
提出的一种算法,
。
此刻有很多半码相机厂商将插值算法用在了数码相机上,并将经过算法获得的分辨率值大举宣传,诚然他们的算法比双三次插值算法等算法先进好多,可是事实是图像的细节不是凭空造出来的。
因为插值分辨率是数码相机经过自己的内置软件来增添图像的像素,进而达到增大分辨率的成效。
二、插值的影响
使用数码变焦拍出来的照片不清楚,这是数码变焦最遭人垢病的地方,事实上,这不过一种片面的说法。
数码变焦比较片清楚度的影响有多大,取决于数码相机在变焦时,CCD能否进行了插值运算。
在使用高像素的状况下,假如采纳数码变焦进行拍摄,则此时CCD其实不会有任何插值运算,数码变焦对最后获得的数码照片的清楚度的影响将会所以而变得极其有限。
举个例子,一台CCD像素为520万、最大分辨率为2560×
1920的数码相机,假如采纳2×
的数码变焦来进行拍摄的话,那么成像过程中只会有一半CCD在工作。
换句话说,数码相机其实不会使用近似“在一个像素点四周增添八个像素点”的插值算法进行成像,而是经过降低分辨率的方法,即1280×
960这个分辨率指标来进行成像。
对于一般的数码照片来说,1280×
960这个分辨率指标已经足够优异了,它与2560×
1920分辨率的差异将会因为没有插值运算的参加而变得能够接受。
可是这类现象只限于某些比较高级的数码相机,对于那些千元以下的定焦数码相机来说,使用数码变焦就意味着必定的插值运算,牺牲分辨率的结果使得照片拍摄者只好有两个选择:
要么获得一张模糊不清的“全尺寸”照片、要么获得一张质量能够保证但分辨率只有近似320×
240这样的“迷你”照片。
图像插值放大的方法有好多,最主要的有二次线性插值和三次线性插值这两种。
此次我把自己的程序中所用的二次线性插值的算法宣布给大家,希望对各位要使用VB写近似程序的朋友有所帮助。
程序顶用到的API、数据种类、全局变量的定义请参照上一篇:
《VB实现图
像在数据库的储存与显示》
PublicSubZoomImage(ByValOutPutWidthAsLong,ByValOutputHeightAsLong)
DimIAsLong
DimLAsLong
DimXAsLong
DimYAsLong
DimXbAsLong
DimYbAsLong
DimXeAsLong
DimYeAsLong
DimMAsInteger
DimNAsInteger
DimCurRAsLong
DimCurGAsLong
DimCurBAsLong
DimNxtRAsInteger
DimNxtGAsInteger
DimNxtBAsInteger
DimDRAsSingle
DimDGAsSingle
DimDBAsSingle
DimDRtAsSingle
DimDGtAsSingle
DimDBtAsSingle
DimXratioAsSingle
DimYratioAsSingle
DimCurStepAsSingle
DimNxtStepAsSingle
DimNegNAsSingle
OnErrorGoToErrLine
IfNotCanZoomThenExitSub
Done=False
OutPutWid=OutPutWidth-1
OutPutHei=OutputHeight-1
I=(Bits\8)-1
ReDimColTmp(I,InPutWid,OutPutHei)'
先从Y方向进行缩放办理,结果保留在其中间数组内
ReDimColOut(I,OutPutWid,OutPutHei)
Xratio=OutPutWid/InPutWid
Yratio=OutPutHei/InPutHei
TimeZoom=timeGetTime
NegN=1/Int(Yratio+1)
ForX=0ToInPutWid
CurR=ColVal(0,X,0)
CurG=ColVal(1,X,0)
CurB=ColVal(2,X,0)
CurStep=0
NxtStep=0
ForY=0ToInPutHei-1
NxtStep=CurStep+Yratio
Yb=CurStep
Ye=NxtStep
N=Ye-Yb
ColTmp(0,X,Yb)=CurR
ColTmp(1,X,Yb)=CurG
ColTmp(2,X,Yb)=CurB
M=Y+1
NxtR=ColVal(0,X,M)
NxtG=ColVal(1,X,M)
NxtB=ColVal(2,X,M)
IfN>
1Then
DRt=(NxtR-CurR)*NegN
DGt=(NxtG-CurG)*NegN
DBt=(NxtB-CurB)*NegN
DR=0
DG=0
DB=0
ForL=Yb+1ToYe-1
DR=DR+DRt
DG=DG+DGt
DB=DB+DBt
ColTmp(0,X,L)=CurR+DR
ColTmp(1,X,L)=CurG+DG
ColTmp(2,X,L)=CurB+DB
Next
EndIf
CurStep=NxtStep
CurR=NxtR
CurG=NxtG
CurB=NxtB
ColTmp(0,X,OutPutHei)=NxtR
ColTmp(1,X,OutPutHei)=NxtG
ColTmp(2,X,OutPutHei)=NxtB
NegN=1/Int(Xratio+1)
ForY=0ToOutPutHei
CurR=ColTmp(0,0,Y)
CurG=ColTmp(1,0,Y)
CurB=ColTmp(2,0,Y)
ForX=0ToInPutWid-1
NxtStep=CurStep+Xratio
Xb=CurStep
Xe=NxtStep
N=Xe-Xb
ColOut(0,Xb,Y)=CurR
ColOut(1,Xb,Y)=CurG
ColOut(2,Xb,Y)=CurB
M=X+1
NxtR=ColTmp(0,M,Y)
NxtG=ColTmp(1,M,Y)
NxtB=ColTmp(2,M,Y)
ForL=Xb+1ToXe-1
ColOut(0,L,Y)=CurR+DR
ColOut(1,L,Y)=CurG+DG
ColOut(2,L,Y)=CurB+DB
ColOut(0,OutPutWid,Y)=NxtR
ColOut(1,OutPutWid,Y)=NxtG
ColOut(2,OutPutWid,Y)=NxtB
Done=True
TimeZoom=timeGetTime-TimeZoom
CanPut=True
ExitSub
ErrLine:
MsgBoxErr.Description
EndSub
全局变量定义:
DimColTmp()AsByte'
用于保留插值中间变量
DimOutPutHeiAsLong'
要插值的目标高度
DimOutPutWidAsLong'
要插值的目标宽度
PublicTimeZoomAsLong'
插值运算使用的时间
简单解说一下对于二次线性插值算法。
(为了说明算法自己,我们只计算这个图片的红色重量,因为红绿蓝三种颜色的计算方法完整同样)
假定我们有一个很简单的图片,图片只有4个像素(2*2)
ABCD
此刻我们要把这个图片插值到9个像素:
3*3
AabB
acabcdbd
CcdD
其中大写的字母代表本来的像素,小写字母代表插值获得的新像素。
想必看到这个图,大家内心已经有了这个算法了。
ab=(A+B)/2
cd=(C+D)/2
ac=(A+C)/2
bd=(B+D)/2
abcd=(ab+cd)/2=(A+B+C+D)/4
推导:
ab=A+(B-A)/2
cd=C+(D-C)/2
...
很简单,对吧,先从一个方向把只波及两个原始像素的新像素算出来。
我们这里假定先
计算水平方向。
而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd
的计算也和计算ac和bd没有任何差异了。
有可能为有朋友已经想到把本来的图像插值到
4*4
或5*5
的方法了。
Aab1ab2B
ac1ab1cd11ab2cd21bd1
ac2ab1cd12ab2cd22bd2
Ccd1cd2D
ab1=A+(B-A)*1/3
ab2=A+(B-A)*2/3=ab1+(B-A)/3
cd1=C+(D-C)*1/3
cd1=C+(D-C)*2/3=cd1+(D-C)/3
以A和B为例,先求出原始像素的差(A-B)再算出每一步的递加量(A-B)/3;
而后每一个新的点就是在前面那个点的值加上这个递加量就是了。
这里我们假定A=100,B=255放大倍率为3,水平方向插值;
先计算出原始像素的差:
(B-A)=255-100=155
再计算出水平方向每一步的递加量:
(A-B)/3=155/3=51.7
这里我们用一个变量DRt来记录这个递加量(这里只用红色来做例子)
ab1=A+DRt=100+51.7=151
ab2=ab1+DRt=151+51.7=202
好了,其实二次线性算法就是这么一个东西,其实不复杂。
也许有写朋友会对于我给出的代码产生疑问。
很简单的一个算法为何要写这么多代码。
其实答案很简单:
为了提升速度。
在VB中“+”和“-”永久是最快的,“*”要比“/”和“”快。
无论是什么种类的变量都是这样的。
下边再来剖析一下我的程序。
在我的程序中把两个方向的插值分解成了两个独自的部分。
先把
变为:
Aab1...abNB
Ccd1...cdND
再变为:
ac1.............db1
..................
acN..............bdN
这两个方向的插值算法完整同样
而Xratio和Yratio这两个变量则用来记录水平方向和垂直方向的放大倍率。
过程也能够让图像缩放不依据原始的纵横比进行。
所以这个
好了,将这个模块和全局变量增添到上一次成立的工程模块中。
把按钮中的代码改成:
subcommand1_click()
Withpicture1
.ScaleMode=3
.BorderStyle=0
DibGet.hdc,0,0,.scalewidth,.scaleheight
ZoomImage,.scalewidth*2,.scaleheight*2
EndWith
picture2.AutoRedraw=True
DibPutpicture2.hdc
picture2.refresh
endsub
图像能否已经放大到本来的两倍了呢?
速度不算很慢吧?
什么?
很慢?
先编译成EXE再运转吧。
下边是成效图:
原图:
二次线性插值放大5倍:
对于二次线性插值就说到这里了,下一次将说一些基本的滤镜成效:
锐化、柔化、扩散、雕琢。
请大家持续关注
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常见 方法 及其 基础 原理