您的位置: 旅游网 > 生活

VB图像处理之二次线性插值的应用

发布时间:2019-09-13 19:22:22

上次讲到了用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 '插值运算使用的时间

小儿肠痉挛腹痛表现有什么
小儿便秘饮食注意什么事项
宝宝咳的厉害怎么办
糖尿病胃轻瘫腹胀怎么治
猜你会喜欢的
猜你会喜欢的