打印本文 打印本文 关闭窗口 关闭窗口
VB图像处理之二次线性插值的应用
作者:武汉SEO闵涛  文章来源:敏韬网  点击数667  更新时间:2009/4/23 15:03:07  文章录入:mintao  责任编辑:mintao
  上次讲到了用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 '插值运算使用的时间

打印本文 打印本文 关闭窗口 关闭窗口