线性插值算法
来源:互联网 发布:丽水学院网络 编辑:程序博客网 时间:2024/05/18 17:01
二次线性插值算法。
(为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)
假设我们有一个很简单的图片,图片只有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 这两个变量则用来记录水平方向和垂直方向的放大倍率。
所以这个过程也能够让图像缩放不按照原始的纵横比进行。
- 线性插值算法
- 线性插值算法
- 线性插值算法
- 算法之线性插值原理
- 高速二次线性插值算法
- 图形处理--线性插值算法细节
- 线性插值算法实现图像缩放
- 图像旋转+二线性插值算法
- 二次线性插值图像缩放算法
- 线性插值
- 线性插值
- 线性插值
- 用线性插值算法实现图像缩放
- J2ME图像缩放线性插值算法代码
- 用线性插值算法实现图像缩放
- 用线性插值算法实现图像缩放
- 用线性插值算法实现图像缩放
- 5 .图像的缩放,线性插值算法
- java 正则表达式
- 如何打印 RichTextBox
- 如何打印 DataGridView
- sapi 5.1如何配置中文朗读
- 关于-858993460
- 线性插值算法
- 家庭办公你也能做到!通过Symantec PcAnywhere控制远程计算机-使用方法图解教程
- 一个由c/C++编译的程序占用的内存分为以下几个部分(转)
- eclipse 开发webservice anxi 过程
- PostgreSQL--安装数据库
- 特殊符号大全
- 每日一课 配置SQL Server
- 深入浅出ShellExecute [转]
- v512工作室Java高端培训系列之Eclipse视频教程