使用双线性插值进行图像放大的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用双线性插值进行图像放大的实现

一、总体设计思路

Step 1:实现图像的打开、显示、保存,在打开图片之后将图片读入内存并获得了该图像除文件头以外的部分在缓存内存储的句柄,以及该图的调色板,调色板颜色种类数等等参数。Step 2:在显示的基础上,利用代码根据放大比例重新开辟一个缓存。将原图的BITMAPINFOHEADER拷贝过来。并修改biHeight、biWidth、biSizeImage等参数。

Step 3:利用双线性插值算法,以原图信息为基础生成新的像素信息。

原理:

双线性插值

维基百科,自由的百科全书

跳转到:导航, 搜索

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

红色的数据点与待插值得到的绿色点

假如我们想得到未知函数在点的值,假设我们已知函数在

, , , 及四个点的值。

首先在x方向进行线性插值,得到

然后在y方向进行线性插值,得到

这样就得到所要的结果,

如果选择一个坐标系统使得的四个已知点坐标分别为(0, 0)、(0, 1)、(1, 0) 和(1, 1),那么插值公式就可以化简为

或者用矩阵运算表示为

与这种插值方法名称不同的是,这种插值方法并不是线性的,它的形式是

它是两个线性函数的乘积。另外,插值也可以表示为

在这两种情况下,常数的数目都对应于给定的f的数据点数目。

线性插值的结果与插值的顺序无关。首先进行y方向的插值,然后进行x方向的插值,所得到的结果是一样的。

双线性插值的一个显然的三维空间延伸是三线性插值。

二、具体实现方案及细节

1、需要改变的项:

①BITMAPINFOHEADER里的biHeight、biWidth、biSizeImage。

②所有像素点信息

2、具体方案的设计:

①对双线性插值的理解:

放大图像时,插值就是根据比例得到一个坐标(x,y)。该坐标可分为四种情况:

(1)得到的x和y都是整数且落在原图中,则直接取出该像素点的颜色信息即可。

(2)得到的x为整数,y为小数。这个时候则根据插值法的计算方式。对y取y1=(int)y;y2=(int)y+1;x取该整数即可。若得到的点都在原图上,则y方向进行插值得到该像素点的颜色信息。

(3)得到的x为小数,y为整数时。可仿照(2)进行计算。

(4)得到的想x,y都为小数。x1=(int)x;x2=(int)x+1;y1=(int)y;y2=(int)y+1;若得到的点都在原图上,则按照双线性插值的计算方法得到该像素点的颜色信息。

②对于求出的点中不在原图上的情况,我采取了放弃该像素点数值计算这样一种处理办法。

③遍历所有像素点以及进行插值时有两种遍历方案,即按照内存行列还是按照图像实际行列进行计算和插值。在处理灰度图时,我采取了前者。也就是按照内存的行列作为计算像

素点颜色信息的顺序和取插值的的位置依据。处理真彩色图片时,我采取了后者。

④放大倍数的实现,采取了将放大倍数开方得到边的比例的方法。

⑤灰度图像插值时取其调色板的索引值即可,真彩时对RGB三值分别进行计算。

三、程序图像放大效果一览

灰度图像:

真彩图:

四、总结

这次图像放大的实现,虽然最终基本实现。但是花了不少的时间。

经过思考觉得主要原因在于编码规范性有待加强。测试也应该更加有条理,和考虑更加周到。

总之,通过实现这个功能。我学到的不仅仅是双线性插值算法的使用,更重要的是测试方案的设计和实施。

非常感谢许老师给予的耐心指导。

相关文档
最新文档