科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VB图像处理之二次线性插值的应用

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种

作者:WallesCai 来源:CSDN 2007年10月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
简单解释一下关于二次线性插值算法。

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

  假设我们有一个很简单的图片,图片只有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倍:


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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章