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

http://tech.ddvip.com   2006年07月30日    社区交流

本文详细介绍VB图像处理之二次线性插值的应用

  以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倍:

  关于二次线性插值就说到这里了,下一次将说一些基本的滤镜效果:锐化、柔化、扩散、雕刻。请大家继续关注

作者:WallesCai    责编:豆豆技术应用

正在加载评论...