1、使用双线性插值进行图像放大的实现一、 总体设计思路Step 1:实现图像的打开、显示、保存,在打开图片之后将图片读入内存并获得了该图像除文件头以外的部分在缓存内存储的句柄,以及该图的调色板,调色板颜色种类数等等参数。Step 2:在显示的基础上,利用代码根据放大比例重新开辟一个缓存。将原图的BITMAPINFOHEADER拷贝过来。并修改biHeight、biWidth、biSizeImage等参数。Step 3:利用双线性插值算法,以原图信息为基础生成新的像素信息。原理:双线性插值维基百科,自由的百科全书跳转到: 导航, 搜索双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插
2、值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。红色的数据点与待插值得到的绿色点假如我们想得到未知函数 在点 的值,假设我们已知函数 在 , , , 及 四个点的值。首先在 x 方向进行线性插值,得到然后在 y 方向进行线性插值,得到这样就得到所要的结果 ,如果选择一个坐标系统使得 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为或者用矩阵运算表示为与这种插值方法名称不同的是,这种插值方法并不是线性的,它的形式是它是两个线性函数的乘积。另外,插值也可以表示为在这两种情况下,常数的数目都对应于给定的 f 的数据点数目。
3、线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。双线性插值的一个显然的三维空间延伸是三线性插值。二、 具体实现方案及细节1、 需要改变的项:BITMAPINFOHEADER里的biHeight、biWidth、biSizeImage。所有像素点信息2、 具体方案的设计:对双线性插值的理解:放大图像时,插值就是根据比例得到一个坐标(x,y)。该坐标可分为四种情况:(1)得到的x和y都是整数且落在原图中,则直接取出该像素点的颜色信息即可。(2)得到的x为整数,y为小数。这个时候则根据插值法的计算方式。对y取y1=(int)y;y2=(int
4、)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三值分别进行计算。三、 程序图像放大效果一览灰度图像:真彩图:四、总结这次图像放大的实现,虽然最终基本实现。但是花了不少的时间。经过思考觉得主要原因在于编码规范性有待加强。测试也应该更加有条理,和考虑更加周到。总之,通过实现这个功能。我学到的不仅仅是双线性插值算法的使用,更重要的是测试方案的设计和实施。非常感谢许老师给予的耐心指导。