预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共19页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

数字图像处理实验报告 学号:0904210226 姓名:柏雄文 实验一:C++实现图像的旋转 实验目的 用VC++编程实现图像任意角度的旋转 程序设计 1.实现图像的打开 主要打开图像的程序:OpenPictureDialog1->Execute() 2.图像的旋转 实现图像旋转的算法原理:图像的旋转是以图像的中心为原点,旋转一定的角度。旋转后图像的大小一般会发生改变。图像的旋转既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。如图1-3,点(x0,y0)经过旋转度后坐标变成(x1,y1)。 图1-3图像旋转示意图 在旋转前: (1-1) 旋转后: (1-2) 上图旋转是绕坐标轴原点(0,0)进行的,向右为X轴正方向,向上为Y轴正方向,设其为坐标系II,而屏幕中的坐标一般以左上角为原点,以向右为X轴正方向、向下为Y轴正方向,设其为坐标系I。如果是绕一个指定点(a,b)旋转,则要先将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。 下面是坐标系平移转换公式的推导。如图1-4所示,将坐标系I平移到坐标系II处,其中坐标系II的原点在坐标系I中的坐标为(a,b)。 图1-4旋转中心平移示意图 设图像的宽度为w,高度为h,得到 (1-3) 其逆变换矩阵表达式为: (1-4) 按如下方法即可旋转图像: (1)根据公式1-3,将坐标系I变到坐标系II; (2)根据公式1-2,将该点顺时针旋转角; (3)根据公式1-4,将坐标系II变到坐标系I。 假设图像在新的坐标系下,以旋转后新图像左上角为原点,未旋转时中心坐标为(a,b),旋转后中心坐标为(c,d),则旋转变换矩阵表达式为: 因此, (1-5) 逆变换为: (1-6) 这样,对于新图中的每一点,可以根据式1-6求出对应原图中的点,得到它的灰度,如果超出原图范围,则置成白色。设图像原始宽度为wide原始高度为height,旋转后应首先计算出公式中需要的几个参数。 如图1-4所示,原始图像4个角的坐标分别为: 旋转后图像4个角的坐标分别为: 按照旋转公式,在旋转后的新图中,这4个点的坐标为: 则新图像的宽度newwide和高度newheight为: 由图1-4可知,原图的中心坐标(a,b)在显示屏幕上的位置为: 旋转后图像的中心坐标(c,d)在显示屏幕上的位置为: 根据式1-6,设中间变量t1,t2,令: 所以 则 实现步骤:首先将角度化为弧度,获得原始图像的宽度和高度以及原图的三个点的坐标,经过旋转后得到新图三个点的坐标,并计算新图的宽度和高度,最后在原图范围内对像素点进行变换。 三.程序代码 #include<afxwin.h> #include<windows.h> #include<iostream> #include<stdlib.h> #include<math.h> #definePI3.14159265 typedefstruct { doublere; doubleim; }COMPLEX; COMPLEXAdd(COMPLEXc1,COMPLEXc2) { COMPLEXc; c.re=c1.re+c2.re; c.im=c1.im+c2.im; returnc; } COMPLEXSub(COMPLEXc1,COMPLEXc2) { COMPLEXc; c.re=c1.re-c2.re; c.im=c1.im-c2.im; returnc; } COMPLEXMul(COMPLEXc1,COMPLEXc2) { COMPLEXc; c.re=c1.re*c2.re-c1.im*c2.im; c.im=c1.re*c2.im+c2.re*c1.im; returnc; } intnWidth; intnHeight; intnColorBits; intnColor; intnLen; intnByteWidth; BYTE*lpBitmap; BYTE*lpBits; voidOpenFile(CStringFileName); voidSaveFile(CStringFileName); voidHistogramEq(); voidOpenFile(CStringFileName) { HANDLEhFile=::CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile==0) { printf("不能调开文件,请重新选择!\n"); return; }