计算机图形湖南大学 chapter-2 图像的几何变换

上传人:第*** 文档编号:31525644 上传时间:2018-02-08 格式:DOC 页数:21 大小:645KB
返回 下载 相关 举报
计算机图形湖南大学 chapter-2 图像的几何变换_第1页
第1页 / 共21页
计算机图形湖南大学 chapter-2 图像的几何变换_第2页
第2页 / 共21页
计算机图形湖南大学 chapter-2 图像的几何变换_第3页
第3页 / 共21页
计算机图形湖南大学 chapter-2 图像的几何变换_第4页
第4页 / 共21页
计算机图形湖南大学 chapter-2 图像的几何变换_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《计算机图形湖南大学 chapter-2 图像的几何变换》由会员分享,可在线阅读,更多相关《计算机图形湖南大学 chapter-2 图像的几何变换(21页珍藏版)》请在金锄头文库上搜索。

1、第二讲 图象的几何变换Phoenix 的 PhotoShop - 1 -第二讲 图象的几何变换这一讲我们将介绍图象的几何变换,包括图象的平移,旋转,镜象变换,转置,放缩等。如果你熟悉矩阵运算,你将发现,实现这些变换是非常容易的。1平移(translation)平移变换大概是几何变换中最简单的一种了。图 1.平移的示意图如图 1 所示,初始坐标为(x0,y0)的点经过平移(tx,ty) (以向右,向下为正方向)后,坐标变为(x1,y1) 。这两点之间的关系是 x1=x0+tx; y1=y0+ty.以矩阵的形式表示为:(1) 101tyxyx我们更关心的是它的逆变换:(2)1010tyxyx这是因

2、为:我们想知道的是平移后的图象中每个像素的颜色。例如我们想知道,新图中左上角点的RGB 值是多少?很显然,该点是原图中的某一点经过平移后得到的,这两点的颜色肯定是一样的,所以只要知道了原图那点的 RGB 值即可。那么到底新图中的左上角点对应原图中的哪一点呢?将左上角点的坐标(0,0)代入公式(2),得到 x0=-tx;y0=-ty;所以新图中的(0,0)点的颜色和原图中(-tx,-ty)的一样。这样就存在一个问题:如果新图中有一点(x1,y1) ,按照公式(2)得到的(x0,y0) 不在原图中该怎么办?通常的做法是,把该点的 RGB 值统一设成(0,0,0)或者(255,255,255)。另一

3、个问题是:平移后的图象是否要放大?一种做法是不放大,移出的部分被截断,如下图所示,图 2为原图,图 3 为移动后的图。这种处理,文件大小不会改变。第二讲 图象的几何变换Phoenix 的 PhotoShop - 2 -图 2. 移动前的图图 3. 移动后的图还有一种做法是:将图象放大,使得能够显示下所有部分。如图 4 所示。图 4. 移动后图象被放大这种处理,文件大小要改变。设原图的宽和高分别是 w1,h1 则新图的宽和高变为 w1+|tx|和 h1+|ty|,加绝对值符号是因为 tx,ty 有可能为负(即向左,向上移动) 。第二讲 图象的几何变换Phoenix 的 PhotoShop - 3

4、 -下面的函数 Translation 采用的是第一种做法,即移出的部分被截断。在给出源代码之前,先说明一个问题。如果你用过 Photoshop,Corel PhotoPaint 等图象处理软件,你可能听说过“灰度图” (grayscale)这个词。灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片。亮度由暗到明,变化是连续的,因此,要表示灰度图,就需要把亮度值进行量化。通常划分成 0 到 255 共 256 个级别,0 最暗(全黑) ,255 最亮(全白) 。.bmp 格式的文件中,并没有灰度图这个概念,但是,我们可以很容易的用.bmp 文件来表示灰度图。方法是用 256

5、 色的调色板,只不过这个调色板有点特殊,每一项的RGB 值都是相同的。也就是说 RGB 值从(0,0,0) , (1,1,1)一直到(255,255,255) 。 (0,0,0)是全黑色, (255,255,255)是全白色,中间的是灰色。这样,灰色图就可以用 256 色图来表示了。为什么会这样呢?难道是一种巧合?其实并不是。在表示颜色的方法中,除了 RGB 外,还有一种叫YUV 的表示方法,用的也很多。电视信号中用的就是一种类似于 YUV 的颜色表示方法。这种表示方法中,Y 分量的物理含义就是亮度, U 和 V 分量代表了色差信号(你不必了解什么是色差,只要知道有这么一个概念就可以了) 。使

6、用这种表示方法有很多好处,最主要的有两点:1 因为 Y 代表了亮度,所以,Y 分量包含了灰度图的所有信息,只用 Y 分量就完全能够表示出一幅灰度图来。当同时考虑 U,V 分量时,就能够表示出彩色信息来。这样,用同一种表示方法可以很方便的在灰度和彩色图之间切换,而RGB 表示方法就做不到这一点了。2 人眼对于亮度信号非常敏感,而对色差信号的敏感程度相对较弱。也就是说,图象的主要信息包含在 Y 分量中。这就提示了我们,如果在对 YUV 信号进行量化时,可以“偏心”一点,让 Y 的量化级别多一些(谁让它重要呢?)而让 UV 的量化级别少一些,就可以实现图象信息的压缩,这一点将在图象压缩那一讲中仔细研

7、究,这里就不深入讨论了。而 RGB 的表示方法就做不到这一点,因为 RGB 三个分量同等重要,缺了谁也不行。YUV 和 RGB 之间有着如下的对应关系(3) 10.437.01.528956.BGRVU(4)58.Y当 RGB 三个分量的大小一样时,假设都是 a,代入公式(3) ,得到 Y=a,U=0,V=0 。你现在该明白我前面所说不是巧合的原因了吧。使用灰度图有一个好处,那就是方便。首先 RGB 的值都一样,其次,图象数据即调色板索引值,也就是实际的 RGB 值,也就是亮度值;另外因为是 256 色的调色板,所以图象数据中一个字节代表一个像素,很齐整,如果是 2 色图或 16 色图,还要拼

8、凑字节,很麻烦。如果是彩色的 256 色图,由于图象处理后有可能会产生不属于这 256 种颜色的新颜色,就更麻烦了,这一点,今后你就会有深刻体会的 。所以,做图象处理时,一般采用灰度图。为了将重点放在算法本身上,今后给出的程序如不做特殊说明,都是针对 256 级灰度图的,其它颜色的情况,你可以自己想一想,把算法补全。想得到一幅灰度图,你可以使用 Sea 或者 PhotoShop 等软件提供的颜色转换功能将彩色图转换成灰度图。好了,言归正传,下面给出 Translation 的源代码。算法的思想是先将所有区域填成白色,然后找平移后显示区域的左上角点(x0,y0)和右下角点(x1,y1)。分几种情

9、况。先看 x 方向(width 指图象的宽度)1tx-width很显然,图象完全移出了屏幕,不用做任何处理2-width=0) & (x0=0) & (y0=0) & (x0=0) & (y0Hold)lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;*lpTempPtr=*lpPtr;hDc=GetDC(hWnd);if(hBitmap!=NULL)DeleteOb

10、ject(hBitmap);hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);hf=_lcreat(c:zoom.bmp,0);_lwrite(hf,(LPSTR) _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);_l

11、close(hf);ReleaseDC(hWnd,hDc);LocalUnlock(hTempImgData);LocalFree(hTempImgData);GlobalUnlock(hImgData);return TRUE;注意事项:source2 目录下为本章介绍的源程序 ,功能是打开一幅位图,实现几何变换.运行时,文件 c:test.bmp 必须存在命令行编译过程如下vcvars32rc bmp.rccl geotrans.c bmp.res user32.lib gdi32.lib第二讲 图象的几何变换Phoenix 的 PhotoShop - 21 -由于放大图象时产生了新的像素

12、,另外浮点数的操作,使得得到的坐标可能并不是整数,这一点我们在介绍旋转时就提到了,我们采用的做法是找与之最临近的点。实际上,更精确的做法是采用插值(Interpolation) ,即利用邻域的像素来估计新的像素值。其实我们前面的做法也是一种插值,称为最邻近插值(Nearest Neighbour Interpolation) 。下面先介绍线形插值 (Linear Interpolation)。线形插值使用原图中两个值来构造所求坐标处的值。举一个一维的例子,如图 16 所示,如果已经知道了两点 x0,x2 处的函数值 f(x0),f(x2),现在要求 x1 处的函数值 f(x1)。我们假设函数是

13、线形的,利用几何知识可以知道:f(x1)=(f(x2)-f(x0)*(x1-x0)/(x2-x0)+f(x0); (13)图 16. 线形插值的示意图 图 17. 双线形插值的示意图在图象处理中需要将线形插值扩展到二维的情况,即采用双线形插值(Bilinear Intrepolation) ,图 17为双线形插值的示意图.已知 a,b,c,d 四点的灰度,要求 e 点的灰度,可以先在水平方向上由 a,b 线形插值求出 g,c,d 线形插值求出 f,然后在垂直方向上由 g,f 线形插值求出 e线形插值是基于这样的假设,即原图的灰度在两个像素之间是线形变化的,一般情况下,这种插值的效果还不错。更精确的方法是采用曲线插值(Curvilinear Interpolation) ,即认为像素之间的灰度变化规律符合某种曲线,但这种处理的计算量是很大的。关于插值,我们就介绍到这里,有兴趣的读者可以参考“数值分析”方面的书。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号