手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>VB>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


  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 '插值运算使用的时间
   简单解释一下关于二次线性插值算法。

   (为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)

   假设我们有一个很简单的图片,图片只有4个像素(2*2)

A B
C D
   现在我们要把这个图片插值到9个像素:3*3

A ab B
ac abcd bd
C cd D
   其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。

   想必看到这个图,大家心里已经有了这个算法了。

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的方法了。

A ab1 ab2 B
ac1 ab1cd11 ab2cd21 bd1
ac2 ab1cd12 ab2cd22 bd2
C cd1 cd2 D
   推导:

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中“ ”和“-”永远是最快的,“*”要比“/”和“\”快。不论是什么类型的变量都是这样的。

   下面再来分析一下我的程序。

   在我的程序中把两个方向的插值分解成了两个单独的部分。

   先把

A B
C D
   变成:

A ab1...abN B
C cd1...cdN D
   再变成:

A ab1...abN B
ac1 ............. db1
... ............ ...
acN .............. bdN
C cd1...cdN D
   这两个方向的插值算法完全相同

   而Xratio 和Yratio 这两个变量则用来记录水平方向和垂直方向的放大倍率。所以这个过程也能够让图像缩放不按照原始的纵横比进行。

   好了,将这个模块和全局变量添加到上次建立的工程模块中。

   把按钮中的代码改成:

sub command1_click()
  With picture1
   .ScaleMode=3
   .BorderStyle=0
   DibGet .hdc ,0 , 0 , .scalewidth , .scaleheight
   ZoomImage , .scalewidth * 2 , .scaleheight * 2
  End With
  picture2.AutoRedraw=True
  DibPut picture2.hdc
  picture2.refresh
end sub
   图像是否已经放大到原来的两倍了呢?速度不算很慢吧?

   什么?很慢?先编译成EXE再运行吧。下面是效果图:

   原图:


   二次线性插值放大5倍:


   关于二次线性插值就说到这里了

上一篇: VB图像处理之像素的获取和输出
下一篇: VB实现图像在数据库的存储与显示

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!