1 / 34

第 3 章 图像的几何变换

第 3 章 图像的几何变换. 张 桦 教授 天津理工大学 计算机与通信工程学院. 本章要点:. 图像的平移 图像的镜像变换 图像的缩放 图像的转置 图像的旋转. 3.1 图像的平移. 1. 理论基础 图像平移( Translation )是将图像中所有的点都按照指定的平移量 , 进行水平、垂直移动。 设初始坐标为( x0,y0 )的点  经过平移( tx,ty )后  坐标变为 (x1,y1) 。. 1. 理论基础. tx 坐标原点 (x0,y0) ty (x1,y1)

Download Presentation

第 3 章 图像的几何变换

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 图像的几何变换 张 桦 教授 天津理工大学 计算机与通信工程学院

  2. 本章要点: • 图像的平移 • 图像的镜像变换 • 图像的缩放 • 图像的转置 • 图像的旋转

  3. 3.1 图像的平移 1. 理论基础 图像平移(Translation)是将图像中所有的点都按照指定的平移量,进行水平、垂直移动。 设初始坐标为(x0,y0)的点 经过平移(tx,ty)后 坐标变为(x1,y1)。

  4. 1. 理论基础 tx 坐标原点 (x0,y0) ty (x1,y1) 图3-1 像素平移示意图 显然(x0,y0)和(x1,y1)的关系如下: x1=x0+tx y1=y0+ty

  5. 2. 理论验证 x x (0,0) (0,0) (0,0) y y y

  6. 3. 流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框输入偏移量tx,ty。 (3) 开辟一个同样大小的缓冲区。 (4) 对原图依次循环每个像素,每读入一个像素点(x0,y0),根据它的坐标,找到目标图像的位置(x1=x0-tx,y1=y0-ty),将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。

  7. 4. 编程实现

  8. 3.2 图像的镜像变换 1. 理论基础 图像的镜像变换分为两种:一种是水平镜像,另一种是垂直镜像。 图像的水平镜像操作是以原图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换; 图像的垂直镜像操作是以原图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。 镜像变换后图的高和宽都不变。

  9. 1.理论基础----水平镜像 设图像高度为Height,宽度为Width, 原图中的(x0,y0)经过水平镜像后, 坐标将变成(Width-x0,y0)。 即: x1=Width-x0 y1=y0

  10. 1.理论基础----垂直镜像 点(x0,y0)经过垂直镜像后, 坐标将变成为(x0,Height-y0), 即: x1=x0 y1=Height-y0

  11. 2.理论验证 (a)原图(b)水平镜像处理效果图(c)垂直镜像处理效果图 图3-2 镜像处理

  12. 3. 流程设计 (1) 取得原图的数据区指针。 (2) 开辟一个同样大小的缓冲区。 (3) 每个像素依次循环。 在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标(用图像的宽度减去坐标值)在显示到图像上。 垂直镜像中,则对垂直坐标做相应的处理。

  13. 4.编程实现----水平镜像 for(j = 0; j < height; j++) for(i = 0; i < wide;i++) { lpSrc = (LPBYTE)p_data +wide *j + i; lpDst = (LPBYTE)temp + wide* j+ wide- i; *lpDst = *lpSrc; }

  14. 4.编程实现----垂直镜像 for(i = 0; i < wide;i++) for(j = 0; j < height; j++) { lpSrc = (LPBYTE)p_data + wide * j+i; lpDst = (LPBYTE)temp + wide * (height - j - 1)+i; *lpDst = *lpSrc; }

  15. 3.3 图像的缩放 1. 理论基础 假设图像X轴方向缩放比率是kx,Y轴方向缩放比率是ky,那么原图中点(x0,y0)对应与新图中的点(x1,y1)为: x1=x0*kx y1=y0*ky

  16. 1.放大图像理论基础 当kx>1且ky>1时,原图像被放大。 放大图像时,产生了新的像素,可通过插值算法来近似处理。 例如:当kx=ky=2时,图像放大2倍, 原图中的某一个像素,对应新图的4个像素。 ●●● ●● (a)原图中的某一个像素(b)对应新图的4个像素 图3-3 图像放大示意图

  17. 1.缩小图像理论基础 当kx<1且ky<1时,原图像被缩小。 例如,当kx=ky=0.5时,图像被缩到一半大小,原图中4个像素对应新图中的一个像素。此时缩小后的图像中的(0,0)像素对应于原图中的(0,0)、(0,1)、(1,0)、(1,1)像素一个; 以此类推。在原图基础上,每行隔一个像素取一点,每割一行进行操作。如下图3-4所示。 ●●● ●● (a)原图中的某4个像素(b)对应新图的1个像素 图3-4 图像缩小示意图 从上可见,放大与缩小的原理不同。

  18. 2.理论验证 (c)长宽各放大2倍的效果图 (a)原图 (b)长宽缩小0.5倍的效果图

  19. 3.流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框获得放大整数比例:kx,ky。 更改图象的宽度和高度。 (3) 每个像素依次循环。计算该象素在原图象中的坐标,将原图的象素值赋给目标象素相应位置kx*ky个值。

  20. 4.编程实现----放大图像 // 针对图像每行进行操作 for(j = 0; j < height-1; j++) { // 针对图像每列进行操作 for(i = 0; i < wide-1; i++) { // 指向源DIB第i0行,第j0个象素的指针 lpSrc = (LPBYTE)p_data + wide * j + i; // 复制象素 for(int n=0;n<k1;n++) for(int m=0;m<k2;m++) { lpDst = (LPBYTE)temp + newwide *(j*k1+ n) + i*k2+m; *lpDst = *lpSrc; } } }

  21. 4.编程实现----缩小图像 for(j = 0; j < newheight-1; j++) {// 针对图像每列进行操作 for(i = 0; i < newwide-1; i++) {// 指向新DIB第i行,第j个象素的指针,注意此处宽度和高度是新DIB的宽度和高度 lpDst = (LPBYTE)hDIB + newwide * j + i; // 计算该象素在源DIB中的坐标 j0 = (LONG) (j / yzoom + 0.5); i0 = (LONG) (i / xzoom + 0.5); if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height)) // 判断是否在源图范围内 {// 指向源DIB第i0行,第j0个象素的指针 lpSrc = (LPBYTE)p_data + wide * j0 + i0; *lpDst = *lpSrc; // 复制象素 } else *lpDst = 255; // 对于源图中没有的象素,直接赋值为255 } }

  22. 3.4 图像的转置 1.理论基础 图像的转置(Transpose)操作是将图像像素的x坐标和y坐标互换。该操作将改变图像的高度和宽度,转置后图像的高度和宽度将互换。 x1=y0 y1=x0

  23. 2.理论验证 图3-6 图像转置

  24. 3.流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框输入偏移量tx,ty。 (3) 开辟一个同样大小的缓冲区。 (4) 对原图依次循环每个像素, 每读入一个像素点(x0,y0),根据它的坐标, 找到目标图像的位置(x1=y0,y1=x0), 将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。

  25. 4.编程实现 for(j = 0; j < height; j++) // 针对每行图像每列进行操作 for(i = 0; i < wide;i++) { // 指向源DIB第j行,第i个象素的指针 lpSrc = (LPBYTE)p_data+ lLineBytes * j + i; // 指向转置DIB第i行,第j个象素的指针 // 注意此处wide和height是源DIB的宽度和高度,应该互换 lpDst = (LPBYTE)temp + lNewLineBytes* i+ j; // 复制象素 *lpDst = *lpSrc; }

  26. 3.5 图像的旋转 1. 理论基础 • 图像的旋转必须指明图像绕着什么旋转。 • 一般以图像的中心为原点,旋转一定的角度。 • 旋转后,图像的大小一般会改变。

  27. 1.理论基础 如下图,点(x0,y0)经过旋转α度后坐标变成(x1,y1)。 3-7 图像旋转示意图

  28. 1.理论基础 在旋转前: x0=γcos(β) y0=γsin(β) 旋转后: x1=γcos(β-α)=γcos(β)cos(α)+γsin(β)sin(α) =x0cos(α)+y0sin(α) y1=γsin(β-α)=γsin(β)cos(α)-γcos(β)sin(α) =-x0sin(α)+y0cos(α)

  29. 2. 理论验证 (a)原图(b)旋转45°的效果图 图3-9 旋转处理

  30. 3.流程设计 (1) 以图像的中心为原点,旋转一定的角度。根据下图,将坐标系Ⅰ变成坐标系Ⅱ; 屏幕中的坐标一般是以左上角为原点,向右为x轴正方向、向下为y轴正方向,设其为坐标系Ⅰ。 旋转是绕中心坐标轴原点(a,b)进行的,向右为x轴正方向,向上为y轴正方向,设其为坐标系Ⅱ; 如果是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。

  31. 3.流程设计 (2)根据旋转公式,将该点顺时针旋转α角; (3)将坐标系Ⅱ变成坐标系Ⅰ。

  32. 4.编程实现 num1=(double)( -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold); num2=(double)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold); for(y1=0;y1<Hnew;y1++) { for(x1=0;x1<Wnew;x1++) { //x0,y0为对应的原图上的坐标 x0= (DWORD)(x1*cosa+y1*sina+num1); y0= (DWORD)(-1.0f*x1*sina+y1*cosa+num2); if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold)) //在原图范围内 { lpPtr=lpSrc+y0*Wold+x0; lpTempPtr=lpTemp+y1*Wnew+x1; *lpTempPtr=*lpPtr; //进行象素的复制 } } }

  33. 小结 本章主要介绍了图象的预处理中最基本的几何变换处理,包括图像的平移、图像的镜像变换、图像的缩放、图像的转置、图像的旋转。这些是进行图象几何校正的基本方法。

  34. 谢 谢!

More Related