基于QT的数字图像的几何变换程序设计
2015-02-22赵之源
赵之源
北京邮电大学 北京 100876
基于QT的数字图像的几何变换程序设计
赵之源
北京邮电大学 北京 100876
介绍了使用QT对BMP图像进行几何变换的相关概念和方法。根据BMP格式图像的格式类型和存储原理,介绍对BMP格式图像进行读取和写入方法,并在此基础上介绍了对BMP图片进行几何变换的处理的方法和C++代码。
数字图像;几何变换;QT;C++
数字图像的几何变换,顾名思义,就是对图像进行几何空间上的变换,比如图像的大小、图像的形状、图像的位置等变化。一般图像处理软件中的裁剪、缩放、旋转等功能都是基于数字图像的几何变换原理工作的。市场中常见的PS等图像处理软件可调节参数较少,不能满足用户部分用户需求,QT的界面设计使得开发带界面的软件更为方便,且可用C++语言编写,运行效率高,执行速度快,适合图像处理。
1、数字图像的几何变换原理
数字图像的几何变换一般分为两种,一种是位置变换,比如平移、旋转等;另一种是形状变换,比如缩放,裁剪等。当然还有综合两者的复合变换。图像几何变换的原理比较简单,一般可以理解为图像的像素点在平面内的各种方向上的平移。但是对于缩放变换一般还涉及到图像像素点的插值问题。
数字图像的几何变换过程可以理解为一个线性换,由公式(1)和公示(2)定义:
公式(1)、(2)中的X、Y表示变换后的像素坐标,x、y表示变前的像素坐标,a、b是实数。而插值一般用于图像的放大部分,对于放大后多出的像素需要经过特定的计算赋值,一般取新增像素点的周围点的平均值作为新增像素点的亮度值。
2、程序设计步骤
程序是基于QT设计的,使用C++编程语言,所以设计过程包括界面设计和程序设计思路。
2.1 程序界面设计
程序需要用户输入数据,故设计用户数据接口即可。
2.2 程序流程设计
程序设计的实现过程为:(1)读取BMP文件的文件头、信息头、颜色表、像素点数据等位图数据。(2)实现图像的平移功能。主要代码和注释如下:
for(inti=0;i for(intj=0;j { intx1=i+100; inty1=j+100; if(y1 data6[i][j]=data0[x1][y1]; else data6[i][j]=0; } (3)实现图像的左右反转功能。用每行最大点数减横坐标即可得到新的横坐标,纵坐标不变即完成反转 关键代码如下: for (inti=0; i for (int j=0; j data1[i][j]=data0[i][byteline-j]; (4)实现图像的上下反转功能。同左右反转原理,更改纵坐标即可。 关键代码如下: for (inti=0; i for (int j=0; j data2[i][j]=data0[Bitmapinfoheader.biHeight-i-1][j]; (5)实现图像的等比例缩小功能。主要代码如下: ///////原图像旋转平移后的坐标跟原坐标的对应关系 for(inti=0;i for(intj=0;j { data5[i][j]=data0[i*4][j*4]; } (6)实现图像的等比例扩大功能。 等比例扩大采用双线性内插法,前后共进行三次直线方程计算,得出对应点的坐标,关键代码如下: BYTEtemp1; BYTEtemp2; BYTEtemp3; floatx,y; for(inti=0;i for(intj=0;j { x=i/4.0; y=j/4.0; //双线性插入,共经过以下三条直线方程计算出插入点亮度。 temp1=data0[i/4][j/4]+(data0[i/4+1][j/4]-data0[i/4] [j/4])*(x-i/4); temp2=data0[i/4][j/4+1]+(data0[i/4+1][j/4+1]-data0[i/4] [j/4+1])*(x-i/4); temp3=temp1+(temp2-temp1)*(y-j/4); data6[i][j]=temp3; } (7)将图片数据写到新文件中。(8)如果缩放过程需要更改画布大小,要根据新图像所需画布大小重新更改文件头数据,包括文件宽度、高度、数据大小、文件大小。 本实验用的是500乘500的8位BMP格式的灰度图像。 原画布大小旋转丢失旋转后画布外的图像,实验结果如图3所示扩大画布大小旋转保留全部图像,实验结果如图4所示3、程序测试实验