VB图像处理之二次线性插值的应用
2006-02-27 11:50:12 来源:WEB开发网核心提示:上次讲到了用DIB方法来获取图像的像素,从这次开始将如果运用已经得到的像素来处理图像,VB图像处理之二次线性插值的应用,图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种,好了,将这个模块和全局变量添加到上次建立的工程模块中,这次我把自己的程序中所用的二次线性插值的算法公布给大家,希望对各位要使用VB
上次讲到了用DIB方法来获取图像的像素。从这次开始将如果运用已经得到的像素来处理图像。
图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种。这次我把自己的程序中所用的二次线性插值的算法公布给大家,希望对各位要使用VB写类似程序的朋友有所帮助。
程序中用到的API、数据类型、全局变量的定义请参考上一篇:《VB实现图像在数据库的存储与显示》
->PublicSubZoomImage(ByValOutPutWidthAsLong,ByValOutputHeightAsLong)
全局变量定义:
->DimColTmp()AsByte'用于保存插值中间变量
简单解释一下关于二次线性插值算法。
(为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)
假设我们有一个很简单的图片,图片只有4个像素(2*2)
->AB
现在我们要把这个图片插值到9个像素:3*3
->AabB
其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。
想必看到这个图,大家心里已经有了这个算法了。
->ab=(A B)/2
推导:
->ab=A (B-A)/2
很简单,对吧,先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向。而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。
有可能为有朋友已经想到把原来的图像插值到4*4或5*5的方法了。
->Aab1ab2B
推导:
->ab1=A (B-A)*1/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
好了,其实二次线性算法就是这么一个东西,并不复杂。或许有写朋友会对于我给出的代码产生疑问。很简单的一个算法为什么要写这么多代码。
其实答案很简单:为了提高速度。
在VB中“ ”和“-”永远是最快的,“*”要比“/”和“\”快。不论是什么类型的变量都是这样的。
下面再来分析一下我的程序。
在我的程序中把两个方向的插值分解成了两个单独的部分。
先把
->AB
变成:
->Aab1...abNB
再变成:
->Aab1...abNB
这两个方向的插值算法完全相同
而Xratio和Yratio这两个变量则用来记录水平方向和垂直方向的放大倍率。所以这个过程也能够让图像缩放不按照原始的纵横比进行。
好了,将这个模块和全局变量添加到上次建立的工程模块中。
把按钮中的代码改成:
->subcommand1_click()
图像是否已经放大到原来的两倍了呢?速度不算很慢吧?
什么?很慢?先编译成EXE再运行吧。下面是效果图:
原图:
->->
二次线性插值放大5倍:
->
关于二次线性插值就说到这里了->
图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种。这次我把自己的程序中所用的二次线性插值的算法公布给大家,希望对各位要使用VB写类似程序的朋友有所帮助。
程序中用到的API、数据类型、全局变量的定义请参考上一篇:《
全局变量定义:
简单解释一下关于二次线性插值算法。
(为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)
假设我们有一个很简单的图片,图片只有4个像素(2*2)
现在我们要把这个图片插值到9个像素:3*3
其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。
想必看到这个图,大家心里已经有了这个算法了。
推导:
很简单,对吧,先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向。而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。
有可能为有朋友已经想到把原来的图像插值到4*4或5*5的方法了。
推导:
以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来记录这个递增量(这里只用红色来做例子)
好了,其实二次线性算法就是这么一个东西,并不复杂。或许有写朋友会对于我给出的代码产生疑问。很简单的一个算法为什么要写这么多代码。
其实答案很简单:为了提高速度。
在VB中“ ”和“-”永远是最快的,“*”要比“/”和“\”快。不论是什么类型的变量都是这样的。
下面再来分析一下我的程序。
在我的程序中把两个方向的插值分解成了两个单独的部分。
先把
变成:
再变成:
这两个方向的插值算法完全相同
而Xratio和Yratio这两个变量则用来记录水平方向和垂直方向的放大倍率。所以这个过程也能够让图像缩放不按照原始的纵横比进行。
好了,将这个模块和全局变量添加到上次建立的工程模块中。
把按钮中的代码改成:
图像是否已经放大到原来的两倍了呢?速度不算很慢吧?
什么?很慢?先编译成EXE再运行吧。下面是效果图:
原图:
二次线性插值放大5倍:
关于二次线性插值就说到这里了->
更多精彩
赞助商链接