VB图像处理之二次线性插值的应用
热 ★★★★
VB图像处理之二次线性插值的应用
作者:闵涛 文章来源:闵涛的学习笔记 点击数:663 更新时间:2009/4/23 15:03:07
上次讲到了用DIB方法来获取图像的像素。从这次开始将如果运用已经得到的像素来处理图像。 图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种。这次我把自己的程序中所用的二次线性插值的算法公布给大家,希望对各位要使用VB写类似程序的朋友有所帮助。 程序中用到的API、数据类型、全局变量的定义请参考上一篇:《VB实现图像在数据库的存储与显示》
Public Sub ZoomImage(ByVal OutPutWidth As Long, ByVal OutputHeight As
Long) Dim I As Long Dim L As Long Dim X As Long Dim Y As
Long Dim Xb As Long Dim Yb As Long Dim Xe As Long Dim Ye
As Long Dim M As Integer Dim N As Integer Dim CurR As
Long Dim CurG As Long Dim CurB As Long Dim NxtR As
Integer Dim NxtG As Integer Dim NxtB As Integer Dim DR As
Single Dim DG As Single Dim DB As Single Dim DRt As
Single Dim DGt As Single Dim DBt As Single Dim Xratio As
Single Dim Yratio As Single Dim CurStep As Single Dim NxtStep
As Single Dim NegN As Single On Error GoTo ErrLine If Not
CanZoom Then Exit Sub Done = False OutPutWid = OutPutWidth -
1 OutPutHei = OutputHeight - 1 I = (Bits \ 8) - 1 ReDim
ColTmp(I, InPutWid, OutPutHei) '先从Y方向进行缩放处理,结果保存在此中间数组内 ReDim
ColOut(I, OutPutWid, OutPutHei) Xratio = OutPutWid /
InPutWid Yratio = OutPutHei / InPutHei TimeZoom =
timeGetTime NegN = 1 / Int(Yratio + 1) For X = 0 To
InPutWid CurR = ColVal(0, X, 0) CurG = ColVal(1, X, 0) CurB
= ColVal(2, X, 0) CurStep = 0 NxtStep = 0 For Y = 0 To
InPutHei - 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) If N > 1 Then DRt = (NxtR - CurR) * NegN DGt =
(NxtG - CurG) * NegN DBt = (NxtB - CurB) * NegN DR =
0 DG = 0 DB = 0 For L = Yb + 1 To Ye - 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 End If CurStep =
NxtStep CurR = NxtR CurG = NxtG CurB =
NxtB Next ColTmp(0, X, OutPutHei) = NxtR ColTmp(1, X,
OutPutHei) = NxtG ColTmp(2, X, OutPutHei) =
NxtB Next NegN = 1 / Int(Xratio + 1) For Y = 0 To
OutPutHei CurR = ColTmp(0, 0, Y) CurG = ColTmp(1, 0,
Y) CurB = ColTmp(2, 0, Y) CurStep = 0 NxtStep = 0 For
X = 0 To InPutWid - 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) If N > 1 Then DRt = (NxtR - CurR) *
NegN DGt = (NxtG - CurG) * NegN DBt = (NxtB - CurB) *
NegN DR = 0 DG = 0 DB = 0 For L = Xb + 1 To Xe
- 1 DR = DR + DRt DG = DG + DGt DB = DB +
DBt ColOut(0, L, Y) = CurR + DR ColOut(1, L, Y) = CurG +
DG ColOut(2, L, Y) = CurB + DB Next End
If CurStep = NxtStep CurR = NxtR CurG = NxtG CurB
= NxtB Next ColOut(0, OutPutWid, Y) = NxtR ColOut(1,
OutPutWid, Y) = NxtG ColOut(2, OutPutWid, Y) =
NxtB Next Done = True TimeZoom = timeGetTime -
TimeZoom CanPut = True Exit Sub ErrLine: MsgBox
Err.Description End Sub 全局变量定义:
Dim ColTmp() As Byte '用于保存插值中间变量 Dim OutPutHei As Long
'要插值的目标高度 Dim OutPutWid As Long '要插值的目标宽度 Public TimeZoom As Long
'插值运算使用的时间
没有相关教程
教程录入:mintao 责任编辑:mintao
上一篇教程: VB图像处理之像素的获取和输出 下一篇教程: VB图像处理之几个常用滤镜的实现
【字体:小 大 】【发表评论 】【加入收藏 】【告诉好友 】【打印此文 】【关闭窗口 】
注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
网友评论: (只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
同类栏目
赞助链接
500 - 内部服务器错误。
500 - 内部服务器错误。
您查找的资源存在问题,因而无法显示。