360 likes | 611 Views
第 3 章 图像的几何变换. 张 桦 教授 天津理工大学 计算机与通信工程学院. 本章要点:. 图像的平移 图像的镜像变换 图像的缩放 图像的转置 图像的旋转. 3.1 图像的平移. 1. 理论基础 图像平移( Translation )是将图像中所有的点都按照指定的平移量 , 进行水平、垂直移动。 设初始坐标为( x0,y0 )的点 经过平移( tx,ty )后 坐标变为 (x1,y1) 。. 1. 理论基础. tx 坐标原点 (x0,y0) ty (x1,y1)
E N D
第3章 图像的几何变换 张 桦 教授 天津理工大学 计算机与通信工程学院
本章要点: • 图像的平移 • 图像的镜像变换 • 图像的缩放 • 图像的转置 • 图像的旋转
3.1 图像的平移 1. 理论基础 图像平移(Translation)是将图像中所有的点都按照指定的平移量,进行水平、垂直移动。 设初始坐标为(x0,y0)的点 经过平移(tx,ty)后 坐标变为(x1,y1)。
1. 理论基础 tx 坐标原点 (x0,y0) ty (x1,y1) 图3-1 像素平移示意图 显然(x0,y0)和(x1,y1)的关系如下: x1=x0+tx y1=y0+ty
2. 理论验证 x x (0,0) (0,0) (0,0) y y y
3. 流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框输入偏移量tx,ty。 (3) 开辟一个同样大小的缓冲区。 (4) 对原图依次循环每个像素,每读入一个像素点(x0,y0),根据它的坐标,找到目标图像的位置(x1=x0-tx,y1=y0-ty),将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。
3.2 图像的镜像变换 1. 理论基础 图像的镜像变换分为两种:一种是水平镜像,另一种是垂直镜像。 图像的水平镜像操作是以原图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换; 图像的垂直镜像操作是以原图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。 镜像变换后图的高和宽都不变。
1.理论基础----水平镜像 设图像高度为Height,宽度为Width, 原图中的(x0,y0)经过水平镜像后, 坐标将变成(Width-x0,y0)。 即: x1=Width-x0 y1=y0
1.理论基础----垂直镜像 点(x0,y0)经过垂直镜像后, 坐标将变成为(x0,Height-y0), 即: x1=x0 y1=Height-y0
2.理论验证 (a)原图(b)水平镜像处理效果图(c)垂直镜像处理效果图 图3-2 镜像处理
3. 流程设计 (1) 取得原图的数据区指针。 (2) 开辟一个同样大小的缓冲区。 (3) 每个像素依次循环。 在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标(用图像的宽度减去坐标值)在显示到图像上。 垂直镜像中,则对垂直坐标做相应的处理。
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; }
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; }
3.3 图像的缩放 1. 理论基础 假设图像X轴方向缩放比率是kx,Y轴方向缩放比率是ky,那么原图中点(x0,y0)对应与新图中的点(x1,y1)为: x1=x0*kx y1=y0*ky
1.放大图像理论基础 当kx>1且ky>1时,原图像被放大。 放大图像时,产生了新的像素,可通过插值算法来近似处理。 例如:当kx=ky=2时,图像放大2倍, 原图中的某一个像素,对应新图的4个像素。 ●●● ●● (a)原图中的某一个像素(b)对应新图的4个像素 图3-3 图像放大示意图
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 图像缩小示意图 从上可见,放大与缩小的原理不同。
2.理论验证 (c)长宽各放大2倍的效果图 (a)原图 (b)长宽缩小0.5倍的效果图
3.流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框获得放大整数比例:kx,ky。 更改图象的宽度和高度。 (3) 每个像素依次循环。计算该象素在原图象中的坐标,将原图的象素值赋给目标象素相应位置kx*ky个值。
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; } } }
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 } }
3.4 图像的转置 1.理论基础 图像的转置(Transpose)操作是将图像像素的x坐标和y坐标互换。该操作将改变图像的高度和宽度,转置后图像的高度和宽度将互换。 x1=y0 y1=x0
2.理论验证 图3-6 图像转置
3.流程设计 (1) 取得原图的数据区指针。 (2) 通过对话框输入偏移量tx,ty。 (3) 开辟一个同样大小的缓冲区。 (4) 对原图依次循环每个像素, 每读入一个像素点(x0,y0),根据它的坐标, 找到目标图像的位置(x1=y0,y1=x0), 将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。
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; }
3.5 图像的旋转 1. 理论基础 • 图像的旋转必须指明图像绕着什么旋转。 • 一般以图像的中心为原点,旋转一定的角度。 • 旋转后,图像的大小一般会改变。
1.理论基础 如下图,点(x0,y0)经过旋转α度后坐标变成(x1,y1)。 3-7 图像旋转示意图
1.理论基础 在旋转前: x0=γcos(β) y0=γsin(β) 旋转后: x1=γcos(β-α)=γcos(β)cos(α)+γsin(β)sin(α) =x0cos(α)+y0sin(α) y1=γsin(β-α)=γsin(β)cos(α)-γcos(β)sin(α) =-x0sin(α)+y0cos(α)
2. 理论验证 (a)原图(b)旋转45°的效果图 图3-9 旋转处理
3.流程设计 (1) 以图像的中心为原点,旋转一定的角度。根据下图,将坐标系Ⅰ变成坐标系Ⅱ; 屏幕中的坐标一般是以左上角为原点,向右为x轴正方向、向下为y轴正方向,设其为坐标系Ⅰ。 旋转是绕中心坐标轴原点(a,b)进行的,向右为x轴正方向,向上为y轴正方向,设其为坐标系Ⅱ; 如果是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。
3.流程设计 (2)根据旋转公式,将该点顺时针旋转α角; (3)将坐标系Ⅱ变成坐标系Ⅰ。
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; //进行象素的复制 } } }
小结 本章主要介绍了图象的预处理中最基本的几何变换处理,包括图像的平移、图像的镜像变换、图像的缩放、图像的转置、图像的旋转。这些是进行图象几何校正的基本方法。