CG透视变换推导汇总

CG透视变换推导汇总
CG透视变换推导汇总

透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。

透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。

没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如

gluPerspective(…) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了)。

我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考

可以找到一组坐标(v1,v2,v3),使得

v = v1 a + v2 b + v3 c (1)

而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得

p – o = p1 a + p2 b + p3 c (2)

从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:

p = o + p1 a + p2 b + p3 c (3)

(1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!

我们现在把(1)(3)写成矩阵的形式:

这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D 点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR

这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。

下面是如何在普通坐标 (Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:

从普通坐标转换成齐次坐标时,

如果(x,y,z)是个点,则变为(x,y,z,1);

如果(x,y,z)是个向量,则变为 (x,y,z,0)

从齐次坐标转换成普通坐标时,

如果是(x,y,z,1),则知道它是个点,变成(x,y,z);

如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移T、旋转R、缩放S这3个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向,这可以通过下面的式子清楚地看出:

而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。

此外,对于一个普通坐标的点P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。因此,如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量。

由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

简单的线性插值

这是在图形学中普遍使用的基本技巧,我们在很多地方都会用到,比如2D位图的放大、缩小,Tweening变换,以及我们即将看到的透视投影变换等等。基本思想是:给一个x属于[a, b],找到y属于[c, d],使得x与a的距离比上ab长度所得到的比例,等于y与c的距离比上cd长度所得到的比例,用数学表达式描述很容易理解:

这样,从a到b的每一个点都与c到d上的唯一一个点对应。有一个x,就可以求得一个y。

此外,如果x不在[a, b]内,比如x < a或者x > b,则得到的y也是符合y < c或者y > d,比例仍然不变,插值同样适用。

透视投影变换

好,有了上面两个理论知识,我们开始分析这次的主角——透视投影变换。这里我们选择OpenGL的透视投影变换进行分析,其他的 APIs会存在一些差异,但主体思想是相似的,可以类似地推导。经过相机矩阵的变换,顶点被变换到了相机空间。这个时候的多边形也许会被视锥体裁剪,但在这个不规则的体中进行裁剪并非那么容易的事情,所以经过图形学前辈们的精心分析,裁剪被安排到规则观察体(Canonical View Volume, CVV)中进行,CVV是一个正方体,x, y, z的范围都是[-1,1],多边形裁剪就是用这个规则体完成的。所以,事实上是透视投影变换由两步组成:

1)用透视变换矩阵把顶点从视锥体中变换到裁剪空间的CVV中。

2)CVV裁剪完成后进行透视除法(一会进行解释)。

我们一步一步来,我们先从一个方向考察投影关系。

上图是右手坐标系中顶点在相机空间中的情形。设P(x,z)是经过相机变换之后的点,视锥体由eye——眼睛位置,np——近裁剪平面,fp——远裁剪平面组成。N是眼睛到近裁剪平面的距离,F是眼睛到远裁剪平面的距离。投影面可以选择任何平行于近裁剪平面的平面,这里我们选择近裁剪平面作为投影平面。设P’(x’,z’)是投影之后的点,则有z’ = -N。通过相似三角形性质,我们有关系:

同理,有

这样,我们便得到了P投影后的点P’

从上面可以看出,投影的结果z’始终等于-N,在投影面上。实际上,z’对于投影后的P’已经没有意义了,这个信息点已经没用了。但对于3D图形管线来说,为了便于进行后面的片元操作,例如z缓冲消隐算法,有必要把投影之前的z保存下来,方便后面使用。因此,我们利用这个没用的信息点存储z,处理成:

这个形式最大化地使用了3个信息点,达到了最原始的投影变换的目的,但是它太直白了,有一点蛮干的意味,我感觉我们最终的结果不应该是它,你说呢?我们开始结

合CVV进行思考,把它写得在数学上更优雅一致,更易于程序处理。假入能够把上面写成这个形式:

那么我们就可以非常方便的用矩阵以及齐次坐标理论来表达投影变换:

其中

哈,看到了齐次坐标的使用,这对于你来说已经不陌生了吧?这个新的形式不仅达到了上面原始投影变换的目的,而且使用了齐次坐标理论,使得处理更加规范化。注意

在把

变成

的一步我们是使用齐次坐标变普通坐标的规则完成的。这一步在透视投影过程中称为透视除法(Perspective Division),这是透视投影变换的第2步,经过这一步,就

丢弃了原始的z值(得到了CVV中对应的z值,后面解释),顶点才算完成了投影。而在这两步之间的就是CVV裁剪过程,所以裁剪空间使用的是齐次坐标

,主要原因在于透视除法会损失一些必要的信息(如原始z,第4个-z保留的)从而使裁剪变得更加难以处理,这里我们不讨论CVV裁剪的细节,只关注透视投影变换的两步。

矩阵

就是我们投影矩阵的第一个版本。你一定会问为什么要把z写成

有两个原因:

1)P’的3个代数分量统一地除以分母-z,易于使用齐次坐标变为普通坐标来完成,使得处理更加一致、高效。

2)后面的CVV是一个x,y,z的范围都为[-1,1]的规则体,便于进行多边形裁剪。而我们可以适当的选择系数a和b,使得

这个式子在z = -N的时候值为-1,而在z = -F的时候值为1,从而在z方向上构建CVV。

接下来我们就求出a和b:

这样我们就得到了透视投影矩阵的第一个版本:

使用这个版本的透视投影矩阵可以从z方向上构建CVV,但是x和y方向仍然没有限制在[-1,1]中,我们的透视投影矩阵的下一个版本就要解决这个问题。

为了能在x和y方向把顶点从Frustum情形变成CVV情形,我们开始对x和y进行处理。先来观察我们目前得到的最终变换结果:

我们知道-Nx / z的有效范围是投影平面的左边界值(记为left)和右边界值(记为right),即[left, right],-Ny / z则为[bottom, top]。而现在我们想把-Nx / z 属于[left, right]映射到x属于[-1, 1]中,-Ny / z属于[bottom, top]映射到y属于[-1, 1]中。你想到了什么?哈,就是我们简单的线性插值,你都已经掌握了!我们解决掉它:

则我们得到了最终的投影点:

下面要做的就是从这个新形式出发反推出下一个版本的透视投影矩阵。注意到

经过透视除法的形式,而P’只变化了x和y分量的形式,az+b和-z是不变的,则我们做透视除法的逆处理——给P’每个分量乘上-z,得到

而这个结果又是这么来的:

则我们最终得到:

M 就是最终的透视变换矩阵。相机空间中的顶点,如果在视锥体中,则变换后就在CVV中。如果在视锥体外,变换后就在CVV外。而CVV本身的规则性对于多边形的裁剪很有利。OpenGL在构建透视投影矩阵的时候就使用了M的形式。注意到M的最后一行不是(0 0 0 1)而是(0 0 -1 0),因此可以看出透视变换不是一种仿射变换,它是非线性的。另外一点你可能已经想到,对于投影面来说,它的宽和高大多数情况下不同,即宽高比不为1,比如640/480。而CVV的宽高是相同的,即宽高比永远是1。这就造成了多边形的失真现象,比如一个投影面上的正方形在CVV的面上可能变成了一个长方形。解决这个问题的方法就是在对多变形进行透视变换、裁剪、透视除法之后,在归一化的设备坐标(Normalized Device Coordinates)上进行的视口(viewport)变换中进行校正,它会把归一化的顶点之间按照和投影面上相同的比例变换到视口中,从而解除透视投影变换带来的失真现象。进行校正前提就是要使投影平面的宽高比和视口的宽高比相同。

便利的投影矩阵生成函数

3D APIs都提供了诸如gluPerspective(fov, aspect, near, far)或者D3DXMatrixPerspectiveFovLH(pOut, fovY, Aspect, zn, zf)这样的函数为用户提供快捷的透视矩阵生成方法。我们还是用OpenGL的相应方法来分析它是如何运作的。

gluPerspective(fov, aspect, near, far)

fov即视野,是视锥体在xz平面或者yz平面的开角角度,具体哪个平面都可以。OpenGL和 D3D都使用yz平面。

aspect即投影平面的宽高比。

near是近裁剪平面的距离

far是远裁剪平面的距离。

上图中左边是在xz平面计算视锥体,右边是在yz平面计算视锥体。可以看到左边的第3步top = right / aspect使用了除法(图形程序员讨厌的东西),而右边第3步right = top x aspect使用了乘法,这也许就是为什么图形APIs采用yz平面的原因吧!

在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法。正如我们所说,不同的图形API因为左右手坐标系、行向量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下Direct3D(以下简称D3D)以及J2ME平台上的JSR184(M3G)(以下简称M3G)的透视投影矩阵,主要出于以下几个目的:

(1)我们在写图形引擎的时候需要采用不同的图形API实现,当前主要是OpenGL和D3D。虽然二者的推导极为相似,但D3D的自身特点导致了一些地方仍然需要澄清。

(2) DirectX SDK的手册中有关于透视投影矩阵的一些说明,但并不详细,甚至有一些错误,从而使初学者理解起来变得困难,而这正是本文写作的目的。

(3) M3G是J2ME平台上的3D开发包,采用了OpenGL作为底层标准进行封装。它的透视投影矩阵使用OpenGL的环境但又进行了简化,值得一提。

本文努力让读者清楚地了解D3D与M3G透视投影矩阵的原理,从而能够知道它与OpenGL的一些差别,为构建跨API的图形引擎打好基础。需要指出的一点是为了完全理解本文的内容,请读者先理解上一篇文章《深入探索透视投影变换》的内容,因为OpenGL和它们的透视投影矩阵的原理非常相似,因此这里不会像上一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始!

OpenGL与D3D的基本差异

前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致OpenGL和D3D的透视投影矩阵不同的原因有以下几个:

(1)OpenGL默认使用右手坐标系,而D3D 默认使用左手坐标系。

(2)OpenGL使用列向量矩阵乘法而D3D使用行向量矩阵乘法。

(3)OpenGL的CVV的Z范围是[-1, 1],D3D的CVV的Z范围是[0, 1]。

以上这些差异导致了最终OpenGL和D3D的透视投影矩阵的不同。

D3D的透视投影矩阵推导

我们先来看最最基本的透视关系图(上一篇文章开始的时候使用的图):

这里我们考察的是xz平面上的关系,yz平面上的关系同理。这里o是相机位置。np是近裁剪平面,也是投影平面,N是它到相机的距离。fp是远裁剪平面,F 是它到相机的位置。p是需要投影的点,p’是投影之后的点。根据相似三角形定理,我们有

则有

注意到OpenGL使用右手坐标系,因此应该使用-N(请参考上一篇文章的这一步),而D3D使用左手坐标系,因此使用N,这是二者的不同点之一。这样,我们得到投影

之后的点

第三个信息点是变换之后的z在投影平面上的位置,也就是N,它已经没用了,我们把p’写成

从而用第三个没用信息点它来存储z(如果读者对这一点不太了解,请参考上一篇文章)。接下来我们求出a和b,从而在z方向上构建CVV。请注意这里是 OpenGL和D3D的另一个不同点,OpenGL的CVV的z范围是[-1, 1],而D3D的CVV的z范围是[0, 1]。也就是说,D3D 中在近裁剪平面上的点投影之后的点会处于CVV的z=0平面上,而在远裁剪平面上的点投影之后的点会在CVV的z=1平面上。这样我们的计算方程就是

从而我们得到了透视投影矩阵的第一个版本

这个时候第三个分量变换到CVV情形了,CVV的z范围是[0,1]。接下来根据上一篇文章所讲到的,我们要把前两个分量变成CVV情形,CVV的x和y范围是[-1, 1],如下图所示:

使用线性插值,我们有:

这里left和right是投影平面的左右范围,top和bottom是投影平面的上下范围。xcvv和ycvv是我们需要算出的在CVV情形中的x和y,也就是我们要计算出的结果。但在算出它们之前,我们先把上面的式子写成:

这里有一个需要注意的地方,如果投影平面在x方向上居中,则

那么第一个式子就可以销掉等号两边的1/2,写成

同理,如果投影平面在y方向上居中,则第二个式子可以写成

则我们现在分两种情况讨论:

(1)投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)

(2)一般情况

我们分别讨论:

(1)特殊情况方程

这组是特殊情况,方程比较简单,但也是使用频率最高的方式(这是D3DXMatrixPerspectiveLH、 D3DXMatrixPerspectiveRH、D3DXMatrixPerspectiveFovLH、

D3DXMatrixPerspectiveFovRH四个方法所使用的情况)。我们导出它:

则我们反推出透视投影矩阵:

其中

而 r-l和t-b可以分别看作是投影平面的宽w和高h。最后那个矩阵就是D3D的透视投影矩阵之一。另外呢,如果我们不知道right、left、top以及bottom这几个参量,也可以根据视野(FOV – Field Of View)参量来求得。下面是两个平面的视野关系图:

其中,两个fov分别是在x-z以及y-z平面上的视野。如果只给了一个视野,也可以通过投影平面的宽高比计算出来:

用一个视野算出w或者h,然后用宽高比算出h或者w。

(2)一般情况的方程

这组方程比较繁琐,但更具一般性(和OpenGL一般矩阵的推导一致,这也是D3DXMatrixPerspectiveOffCenterLH和 D3DXMatrixPerspectiveOffCenterRH两个方法所使用的情况)。我们导出它:

我们继续反推出透视投影矩阵:

其中

最后那个矩阵就是D3D的一般透视投影矩阵。

好了,目前为止,我们已经导出了D3D的两个透视投影矩阵。下面我把上一篇导出的OpenGL的透视投影矩阵写出来,大家可以拿它和刚刚导出的D3D的一般性透视投影矩阵做一个对比。

如果仔细观察,可以发现二者在元素的布局上是一个转置的关系,这个就是由它们使用的左右手坐标系以及使用的行列矩阵的差异造成的。而另外在一些元素的细节上也存在着差异,这是由于D3D的CVV的z范围不同造成的。可见在原理相同的情况下,细微的环境差异可以造成非常大的变化,而这就是透视投影矩阵存在诸多不同版本的原因。一般情况的透视投影矩阵也可以使用视野方式来定义,方法和特殊情况相同。

M3G的透视投影矩阵

M3G是对OpenGL进行的一个封装,它的透视投影变换矩阵被放到了类Camera里面。因为它封装了OpenGL,因此环境和OpenGL相同:右手坐标系、列向量乘法、CVV范围[-1, 1]。它唯一和OpenGL有些差异的地方就在于它只使用投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)的情况(就是我们上面D3D的第一种特殊情况)。我们用OpenGL透视投影矩阵最终版本来说明(再次提醒,如果读者对此感到迷惑,请参考第一篇文章):

上面是OpenGL透视投影矩阵的最终版本,也是一般性版本,我们要把它变成特殊性,版本,非常简单,和上面D3D的特殊情况一样,我们从对x和y进行插值的那一步来看:

和 D3D的第一种情况一样,销掉两边的1/2,得到:

则我们反推出透视投影矩阵:

最右边那个矩阵就是M3G的透视投影矩阵。仍然可以通过视野参数来设置透视投影矩阵,这里请读者自行推导,方法与上面D3D的完全相同。

数字图像处理实验四图像几何变换

课程名称数字图像处理与分析 实验序号实验4 实验项目图像几何变换 实验地点 实验学时实验类型 指导教师实验员 专业班级 学号姓名 2017年9月25日

成绩: 教 师 评 语

三、实验软硬件环境 装有MATLAB软件的电脑 四、实验过程(实验步骤、记录、数据、分析) 1、图片比例缩放 代码: I=imread('11.jpg'); J=imresize(I,1.25); J2=imresize(I,1.25,'bicubic'); imshow(I); figure,imshow(J); figure,imshow(J2); Y=imresize(I,[100150],'bilinear');%Y=imresize(I,[mrows ncols],method)---返回一个指定行列的图像。若行列比与原图不一致,输出图像将发生变形。 figure,imshow(Y) %nearest,bilinear,bicubic为最近邻插值、双线性插值、双三次插值方法。默认为nearest。 运行结果: 分析:由实验结果可知,实现了图片放大和缩小的效果。 2、图像旋转 代码:

J=imrotate(I,32,'bilinear');%J=imrotate(I,angle,method,’crop’)------crop用于剪切旋转后增大的图像部分,返回和原图大小一样的图象。 imshow(I); figure,imshow(J) 运行结果: 分析:由实验结果可知,实现了图片旋转的效果 3、图像剪切 代码:

J=imcrop(I); figure(1),imshow(I);title('yuantu'); figure(2),imshow(J);title('croptu') J1=imcrop(I,[604010090]);%对指定区域进行剪切操作figure(3),imshow(J1);title('croptu2'); 运行结果: 运行代码后,出现如下界面,选中要裁剪的区域,双击被选中的区域 出现以下界面:

图像处理课后习题

第一章绪论 1. 模拟图像处理与数字图像处理主要区别表现在哪些方面? (什么是图像?什么是数字图像?什么是灰度图像?模拟图像处理与数字图像处理主要区别表现在哪些方面?) 图像:是对客观对象的一种相似性的、生动性的描述或写真。 数字图像:一种空间坐标和灰度均不连续的、用离散数字(一般用整数)表示的图像。 灰度图像:在计算机领域中,灰度数字图像是每个像素只有一个采样颜色的图像。在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做 “黑白照片”。 模拟图像处理与数字图像处理主要区别:模拟图像处理是利用光学、照相方法对模拟图像的处理。(优点:速度快,一般为实时处理,理论上讲可达到光的速度, 并可同时并行处理。缺点:精度较差,灵活性差,很难有判断能力和非线性处理能力) 数字图像处理(称计算机图像处理,指将图像信号转换成数字格式并利用计算机对数据进行处理的过程)是利用计算机对数字图像进行系列操作,从而达到某种预期目的的技术.(优点:精度高,内容丰富,可进行复杂的非线性处理,灵活的变通能力,一只要改变软件就可以改变处理内容) 2. 图像处理学包括哪几个层次?各层次间有何区别和联系? 数字图像处理可分为三个层次:狭义图像处理、图像分析和图像理解。狭义图像处理是对输入图像进行某种变换得到输出图像,是一种图像到图像的过程。 图像分析主要是对图像中感兴趣的目标进行检测和测量,从而建立对图像目标的描述,图像分析是一个从图像到数值或符号的过程。 图像理解则是在图像分析的基础上,基于人工智能和认知理论研究图像中各目标的性质和它们之间的相互联系,对图像内容的含义加以理解以及对原来客观场景加以解译,从而指导和规划行动。 区别和联系:狭义图像处理是低层操作,它主要在图像像素级上进行处理,处理的数据量非常大;图像分析则进入了中层,经分割和特征提取,把原来以像素构成的图像转变成比较简洁的、非图像形式的描述;图像理解是高层操作,它是对描述中抽象出来的符号进行推理,其处理过程和方法与人类的思维推理有许多类似之处。 3. 图像处理与计算机图形学的区别与联系是什么? 数字图像处理,是指有计算机及其它有关的数字技术,对图像施加某种运算和处理,从而达到某种预期的目的,而计算机图形学是研究采用计算机生成,处理和显示图形的一门科学。 二者区别:研究对象不同,计算机图形学研究的研究对象是能在人的视觉系统中产生视觉印象的事物,包括自然景物,拍摄的图片,用数学方法描述的图形等,而数字图像处理研究对象是图像;研究内容不同,计算机图像学研究内容为图像生成,透视,消阴等,而数字图像处理研究内容为图像处理,图像分割,图像透析等;过程不同,计算机图像学是由数学公式生成仿真图形或图像,而数字图像处理是由原始图像处理出分析结果,计算机图形与图像处理是逆过程。 结合每个人的本专业学科、工作应用,谈谈数字图像处理的关系或在本专业学科中的应用。 检测技术与自动化装置是把自动化、电子、计算机、控制工程、信息处理、机械等多种

数字图像处理复习题

第一章绪论 一.选择题 1. 一幅数字图像是:( ) A、一个观测系统 B、一个有许多像素排列而成的实体 C、一个2-D数组中的元素 D、一个3-D空间的场景。 提示:考虑图像和数字图像的定义 2. 半调输出技术可以:( ) A、改善图像的空间分辨率 B、改善图像的幅度分辨率 C、利用抖动技术实现 D、消除虚假轮廓现象。 提示:半调输出技术牺牲空间分辨率以提高幅度分辨率 3. 一幅256*256的图像,若灰度级数为16,则存储它所需的比特数是:( ) A、256K B、512K C、1M C、2M 提示:表达图像所需的比特数是图像的长乘宽再乘灰度级数对应的比特数。 4. 图像中虚假轮廓的出现就其本质而言是由于:( ) A、图像的灰度级数不够多造成的 B、图像的空间分辨率不够高造成 C、图像的灰度级数过多造成的 D、图像的空间分辨率过高造成。 提示:平滑区域内灰度应缓慢变化,但当图像的灰度级数不够多时会产生阶跃,图像中的虚假轮廓最易在平滑区域内产生。 5. 数字图像木刻画效果的出现是由于下列原因所产生的:() A、图像的幅度分辨率过小 B、图像的幅度分辨率过大 C、图像的空间分辨率过小 D、图像的空间分辨率过大 提示:图像中的木刻效果指图像中的灰度级数很少 6. 以下图像技术中属于图像处理技术的是:()(图像合成输入是数据,图像分类输出 是类别数据) A、图像编码 B、图像合成 C、图像增强 D、图像分类。 提示:对比较狭义的图像处理技术,输入输出都是图像。 解答:1.B 2.B 3.A 4.A 5.A 6.AC 二.简答题 1. 数字图像处理的主要研究内容包含很多方面,请列出并简述其中的4种。 2. 什么是图像识别与理解? 3. 简述数字图像处理的至少3种主要研究内容。 4. 简述数字图像处理的至少4种应用。 5. 简述图像几何变换与图像变换的区别。 解答: 1. ①图像数字化:将一幅图像以数字的形式表示。主要包括采样和量化两个过程。②图像增强:将一幅图像中的有用信息进行增强,同时对其无用信息进行抑制,提高图像的可观察性。③图像的几何变换:改变图像的大小或形状。④图像变换:通过数学映射的方法,将空域的图像信息转换到频域、时频域等空间上进行分析。⑤图像识别与理解:通过对图像中各种不同的物体特征进行定量化描述后,将其所期望获得的目标物进行提取,并且对所提取的目标物进行一定的定量分析。 2. 图像识别与理解是指通过对图像中各种不同的物体特征进行定量化描述后,将其所期望获得的目标物进行提取,并且对所提取的目标物进行一定的定量分析。比如要从一幅照片上确定是否包含某个犯罪分子的人脸信息,就需要先将照片上的人脸检测出来,进而将

立方体纹理映射

1问题描述与算法思想 1.1纹理映射简介 纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。 立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。 1.2实验目的 1) 掌握位图纹理读入方法; 2)掌握立方体纹理映射算法。 1.3功能要求 1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。 2)设置屏幕背景色为黑色。 3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。 4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。 5)使用键盘方向旋转纹理立方体。 6)使用动画按钮播放或停止立方体动画。 1.4算法原理(算法思想) 立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一个

透视投影(Perspective Projection)变换推导

透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如 gluPerspective(…) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了)。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考 可以找到一组坐标(v1,v2,v3),使得 v = v1 a + v2 b + v3 c (1) 而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得 p – o = p1 a + p2 b + p3 c (2) 从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p: p = o + p1 a + p2 b + p3 c (3) (1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点! 我们现在把(1)(3)写成矩阵的形式: 这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。 “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR 这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。 下面是如何在普通坐标 (Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:

倾斜透视

倾斜透视 一,倾斜透视的基本画法 凡是一个平面与水平面成一边低一边高的情况时,如屋顶,楼梯,斜坡等,这种水平面成倾斜的平面表现在画面是叫倾斜透视.倾斜透视有向下斜与向上斜两种,凡是近高远低的叫向下倾斜,近低远高的叫向上倾斜,它们有各自的灭点,向上斜的灭线都消灭在’’天点”上(也称天际点),向下斜的灭线都消灭在”地点”上(也称地下点).图63是平行透视中的三种倾斜情况,在平行透视中,天点和地点一定是在心点的垂直线上,图中A是向下倾斜,它的灭线就向地点集中;B是向上倾斜,它的灭线就向天点集中;C这种方法是倾斜的角度正与画面成平行,无远高近低或远低近高的变化,因此,就要按实际的角度来画,不用天点与地点,图64是成角透视,在成角透视中,倾斜面得天点和地点一定是在灭点的垂直线上,图D是向左上方倾斜,它的天点就在左灭点的上方,图E是向右下方倾斜,它的地点就在右灭点的下方,以上这几种方法就是画倾斜透视的基本规律. 二,天点和地点的应用 图66是一个建筑物的木架,它的屋顶是倾斜的,前方的屋顶向右上方倾斜,它的灭线都应向右方的天点集中,后方的屋顶是向右下方倾斜,它的灭线就都向右方的地点集中,这两个点(天点,地点)都在右灭点的垂直线上,图中基座上有二个石阶,一个向右上方倾斜,天点定在右方,一个向左上方倾斜,天点在左方,两个石阶的倾斜方向虽不同,但倾斜角度比屋顶的倾斜角度小,因此石阶天点的位置就低于屋顶天点的位置,又因向左上方倾斜的石阶和屋顶虽然与地面所成的倾斜角度不同,但方向一致,因此这两个天点都在同一个灭点的垂直线上,这种相互关系,一定要分别清楚,图65是一幅中国木结构房屋剖析图,呈俯视画图,但是它的屋面画法也是与图66相同的.

深入探索3D拾取技术

深入探索3D拾取技术 在游戏中,玩家需要通过点击2D屏幕来选择3D物体,这个过程就是拾取(picking)。拾取是3D游戏必不可少的基本操作,它实现了玩家和游戏世界内对象的交互。 虽然拾取技术很基本,但它却迷惑了很多3D初学者。很多朋友都问过我关于拾取的细节问题,这让我觉得很有必要具体探讨一下该技术。其实,拾取之所以让很多开发者感到复杂,主要原因在于它跨域了流水线的多个阶段,并且是逆流水线上行。另外,它是一个2D信息扩展到3D的过程,必须对信息做相应的扩展和额外的计算才能够得到正确的结果。下面我门具体分析一下这个技术。 水流线主要阶段分析 我们来直观地看一下从相机空间到viewport的变换 相机空间中的一个顶点v,经过透视变换后进入了CVV中。这个变换矩阵实际上完成了两个工作: 1)将顶点从3D空间投影到2D的投影平面(Projection Plane)上。 2)将投影平面上的2D投影点通过线性插值变换到齐次裁剪空间CVV中。 这些变换都通过透视矩阵一次完成。我之所以把这一步分解为两步,因为这对于分析拾取很重要。 顶点进入齐次裁剪空间并经过CVV裁剪,最终进行透视除法从4D齐次形式变回成3D形式。然后经过一个线性插值(被封装在视口(viewport)变换中),变换到viewport中,多个点以三角形的形式经过光栅化后被玩家看到。最后一步的点变换可以描述为: 3)将CVV中的点通过线性插值变换到viewport中。

分析了这个变换过程之后,我们知道了从相机空间开始实际处理点位置信息的操作,就是上面的三个步骤。这样,我们可以先把顶点从viewport中先变换回投影平面上,也就是我们可以先完成(2)和(3)的逆处理。这里我们不用考虑裁剪和透视除法这些操作,因为反推的时候,处于视口中的点,已经是经过裁剪后留下的有效点了,必定处于CVV内,也必定处于projection plane内!而且从viewport逆变换到projection plane,点一直保持2D形式。 picking的开始是玩家在屏幕上点击一个位置——这实际上是在viewport中进行了点击。我们通过响应玩家的点击事件,得到在viewport中的点击位置,记为P0(Xp0,Yp0)。然后我们把p0从viewport中线性插值到CVV中,得到P1(Xp1,Yp1): 上面的线性插值(如果对线性插值公式不熟悉,请参考《深入探索透视投影变换》一文中的线性插值部分)公式在x方向上计算出了CVV中的P1,y方向的公式同理。接下来我们再把P1从CVV中变换到projection plane中,得到P2(Xp2,Yp2): y方向的计算同理。P2就是viewport中玩家点击的点在projection plane上所对应的位置。目前来看很好。我们已经获得了相机空间中的投影平面上,玩家点击的位置。但目前的点是一个2D点——它处于投影平面上。玩家需要拾取的是一个3D对象,因此我们需要将2D信息拓展到3D中。 向3D世界拓展 将2D的点信息拓展到3D空间进行picking,会使用射线(ray)进行。ray就是一端固定,另一端无限延伸的线性模型。如下图所示:

深入探索透视投影变换

深入探索透视投影变换 -Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教 -email: popyy@https://www.360docs.net/doc/374050049.html, 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如 gluPerspective(…)就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了 )。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。 齐次坐标表示 透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。 根据《向量几何在游戏编程中的使用6》中关于基的概念。对于一个向量v以及基oabc, 可以找到一组坐标(v1,v2,v3),使得 v = v1 a + v2 b + v3 c (1)

数字图像处理课程设计报告

本科综合课程设计报告 题 目 ____________________________ 指导教师__________________________ 辅导教师__________________________ 学生姓名__________________________ 学生学号__________________________ _______________________________ 院(部)____________________________专业________________班 ___2008___年 _12__月 _30__日 数字图像处理演示系统 信息科学与技术学院 通信工程 052

1 主要内容 1.1数字图像处理背景及应用 数字图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。目前,图像处理演示系统应用领域广泛医学、军事、科研、商业等领域。因为数字图像处理技术易于实现非线性处理,处理程序和处理参数可变,故是一项通用性强,精度高,处理方法灵活,信息保存、传送可靠的图像处理技术。本图像处理演示系统以数字图像处理理论为基础,对某些常用功能进行界面化设计,便于初级用户的操作。 1.2 图像处理演示系统设计要求 能加载和显示原始图像,显示和输出处理后的图像; 系统要便于维护和具备可扩展性; 界面友好便于操作; 1.3 图像处理演示系统设计任务 数字图像处理演示系统应该具备图像的几何变换(平移、缩放、旋转、翻转)、图像增强(空间域的平滑滤波与锐化滤波)的简单处理功能。 1.3.1几何变换 几何变换又称为几何运算,它是图像处理和图像分析的重要内容之一。通过几何运算,可以根据应用的需要使原图像产生大小、形状、和位置等各方面的变化。简单的说,几何变换可以改变像素点所在的几何位置,以及图像中各物体之间的空间位置关系,这种运算可以被看成是将各物体在图像内移动,特别是图像具有一定的规律性时,一个图像可以由另外一个图像通过几何变换来产生。实际上,一个不受约束的几何变换,可将输入图像的一个点变换到输出图像中的任意位置。几何变换不仅提供了产生某些特殊图像的可能,甚至还可以使图像处理程序设计简单化。从变换性质来分可以分为图像的位置变换、形状变换等 1.3.2图像增强 图像增强是数字图像处理的基本内容之一,其目的是根据应用需要突出图像中的某些“有用”的信息,削弱或去除不需要的信息,以达到扩大图像中不同物体特征之间的差别,使处理后的图像对于特定应用而言,比原始图像更合适,或者为图像的信息提取以及其他图像分析技术奠定了基础。一般情况下,经过增强处理后,图像的视觉效果会发生改变,这种变化意味着图像的视觉效果得到了改善,某些特定信息得到了增强。

深入探索透视投影矩阵.

-Twinsen 编写 - 本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教 -email: 透视投影是 3D 固定流水线的重要组成部分,是将相机空间中的点从视锥 体 (frustum) 变换到规则观察体 (Canonical View Volume) 中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入 3D 图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的 3D APIs 如 OpenGL 、 D3D 的确把具体的透视投影细节封装起来,比如 gluPerspective(…) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了)。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。 齐次坐标表示 透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。 根据《向量几何在游戏编程中的使用 6 》中关于基的概念。对于一个向量 v 以及基 oabc ,

深入探索正交投影变换

深入探索正交投影变换 之前我们在《深入探索透视投影变换》以及《深入探索透视投影变换(续)》中研究了OpenGL、D3D以及M3G的透视投影变换的原理以及生成方法。这些方法在当前的主流图形API 中得到了普遍使用。但关于投影应用,还有一类经常使用的投影方式需要我们深入理解——正交投影,我们在本篇文章里面研究它(这里假设读者已经看过前两篇文章,并理解了绝大多数的理论,因为正交投影比透视投影的推导关系简单得多,因此我们的推导会非常得快,如果读者有任何的不解,请参考前两篇文章或者通过email联系我)。 在具体研究之前我觉得有必要把平面投影的分类简单介绍一下,目的是为了让大家有一个总体的认识,从而更好的理解这个知识体系。请看下图: 平面投影分为平行投影和透视投影两种类型,后者我们在前两篇文章中介绍了。平行投影则是具有矩形观察体的投影方式(透视投影则是视锥观察体),它不会根据物体离视点的远近缩放物体(透视投影则会)。平行投影可以分成侧投影和正交投影两种类型。这两种类型如何区分呢?我们继续看图吧: 上图中,v是投影平面,n是它的法线。p和q是平面外两点,p’和q’分别是它们在平面上的投影点。q的投影方向向量为Q = 单位化(q’-q),而p的投影方向向量为P = 单

位化(p’-p),其中Q不平行于n而P平行于n,则q的投影叫做侧投影,而p的投影叫做正交投影。正交投影是我们今天的研究对象。 实际上上面对平面投影的分类还可以继续向下细分,比如透视投影可以分为一灭点、二灭点以及三灭点透视投影。侧投影则可以继续分为散点侧投、斜二轴侧投等等。而正交投影则可以分成轴侧投影以及多视点正交投影等等。如果读者对此感兴趣,可以参考相关的图形学教程。 接下来我们研究正交投影。分别介绍OpenGL、D3D以及M3G的。我们的环境约定(左右手坐标系、行列向量乘法、CVV范围)仍然尊重相应API自己的设置。 OpenGL正交投影变换 下图是OpenGL的右手坐标系中观察空间的情形,我们看到的是正交投影的矩形观察体,原点是相机位置,n是近裁剪平面到相机平面的距离,f是远裁剪平面到相机平面的距离。p是观察体中的一个点,p’是它投影之后的点。 投影之后我们有关系: 因为是正交投影,没有统一的投影射线目标点,因此投影之后的x和y不会变,而z 则永远地变成了-n,跑到了投影平面上(我们让投影平面和近裁剪平面重合),它已经没用了,则我们用这个没用的信息保存z(为了之后片元操作的时候用),写为:

一种透视变换图像金字塔匹配改进算法

2007,43(24)ComputerEngineeringandApplications计算机工程与应用 图像匹配算法由特征空间、相似性度量、变换类型和变换参数搜索四方面组成[1]。特征空间是指从原始图像中抽取的用于参与匹配的信息;相似性度量用来衡量待配准图像和参考图像之间的相似程度;变换类型用来刻画两幅图像之间几何位置的差别;变换参数的搜索指用什么方式来寻找变换类型中的参数,使得相似性度量达到极值点。 照片在拍摄时,受光照时间、角度、环境和噪声的影响,存在灰度失真和几何畸变。在这种条件下,匹配算法如何达到精度高、速度快以及抗干扰性强是人们追求的目标。目前图像匹配算法可以分为基于灰度相关的匹配算法、基于特征的匹配算法以及基于相位相关的匹配算法。 本文从提高匹配算法的速度、精度和稳定性入手,用改进的LMA(Levenberg-MarquardtAalgorithm)对图像匹配进行了研究。用多分辨率图像金字塔法,从低分辨率开始,搜索图像透视变换过程中的8个参数,然后缩小搜索的范围,对较高分辨率进行搜索。通过对照片进行匹配测试,证明这种方法可提高子象素的匹配速度、精度和稳定性,使匹配照片的象素成最佳排列,并可以对光学和数字两种相机拍摄的图像进行匹配,效果较好。 1图像特征提取 图像中的边缘和拐点是显著的特征,其中包含了许多重要的信息。准确地提取图像中的特征是算法鲁棒性的前提和保障。本文首先提取图像的边缘信息,再从边缘点中抽取特征较强的点,即拐点,作为最后的特征点。需要用到的边缘信息包括边缘点的位置、梯度方向及梯度值。首先利用Canny算法[6]提取图像的边缘。对图像中任一点p(i,j),规定向左和向下为正方向!i,j,则梯度方向!i,j由下式得到: !i,j= !′!′∈[0,2π] !′+2nπ!′"[0,2π # ] !′= 3 2 πy>0,x=0 -argtgy x x>0 π 2 y>0,x=0 π-argtg y x x< $ & & & & & & & & & & % & & & & & & & & & & ’ 0 (1)其中x= I(i+1,j)-I(i-1,j) 2 ,y= I(i,j+1)-I(i,j-1) 2 ,n为适当整数,使!落在区间[0,2π]内。 梯度值-Mag(i,j)由下式给出: Magp=(I(i+1,j)-I(i-1,j) 2 )2+( I(i,j+1)-I(i,j-1) 2 )2 ((2)上面得到的!i,j在[0,2π]内,取值复杂且不是整数,不利于进一步的处理。因此,将!i,j按 π 4 为区间长度进行归类,即Cp=n,当 一种透视变换图像金字塔匹配改进算法 金勇俊,李言俊,张科 JINYong-jun,LIYan-jun,ZHANGKe 西北工业大学航天学院,西安710072 CollegeofAstronautics,NorthwesternPolytechnicalUniversity,Xi’an710072,China E-mail:jingyjun@yahoo.com.cn JINYong-jun,LIYan-jun,ZHANGKe.Improvedperspectivetransformationimagepyramidregistrationmethod.ComputerEngineeringandApplications,2007,43(24):78-80. Abstract:Inordertoimprovetherobustandpreciseinimageregistration,wegettheHessianmatrixremovedtoimproveLMAforsearchingtheeightunknownparametersoftwoinputperspectivetransformationimagesandgetcomputationalgains.Weusemulti-resolutionpyramidconsistsofasetofimagesrepresentinganimageinmulti-resolution.Withthecoarsestleveltothefinestlevelsearchstrategy,wegetlargecomputationalgainsandhelppreventgettingtrappedinlocalminima.Astheexperimen-talresultsreveal,thisapproachisefficientanduseful. Keywords:perspectivetransformation;imageregistration;pyramidimage;Levenberg-MarquardtAalgorithm(LMA) 摘要:为提高图像匹配的精度和稳定性,在图像匹配过程中用消除了Hessian矩阵的LMA改进算法对两幅图像透视变换矩阵的8个未知参数进行拟合,减少了迭代的计算量。匹配过程中用多分辨率金字塔法对图像进行分解,采用由粗到精的搜索策略,进一步减少了计算量并避免了误匹配。通过对照片进行匹配测试,证明了这种方法的有效性和实用价值。 关键词:透视变换;图像匹配;图像金字塔;LMA 文章编号:1002-8331(2007)24-0078-03文献标识码:A中图分类号:TP751 基金项目:国家航空科学基金资助项目(No.04I53067)。 作者简介:金勇俊,博士研究生,主要研究方向:图像匹配制导。 78

数字图像处理图像变换实验报告

数字图像处理图像变换实验 报告 -标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

实验报告实验名称:图像处理 姓名:刘强 班级:电信1102 学号:1404110128

实验一图像变换实验——图像点运算、几何变换及正交变换一、实验条件 PC机数字图像处理实验教学软件大量样图 二、实验目的 1、学习使用“数字图像处理实验教学软件系统”,能够进行图像处理方面的 简单操作; 2、熟悉图像点运算、几何变换及正交变换的基本原理,了解编程实现的 具体步骤; 3、观察图像的灰度直方图,明确直方图的作用和意义; 4、观察图像点运算和几何变换的结果,比较不同参数条件下的变换效 果; 5、观察图像正交变换的结果,明确图像的空间频率分布情况。 三、实验原理 1、图像灰度直方图、点运算和几何变换的基本原理及编程实现步骤 图像灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度分布情况,为图像的相关处理操作提供了基本信息。 图像点运算是一种简单而重要的处理技术,它能让用户改变图像数据占据的灰度范围。点运算可以看作是“从象素到象素”的复制操作,而这种复制操作是通过灰度变换函数实现的。如果输入图像为A(x,y),输出图像为B(x,y),则点运算可以表示为: B(x,y)=f[A(x,y)] 其中f(x)被称为灰度变换(Gray Scale Transformation,GST)函数,它描述了输入灰度值和输出灰度值之间的转换关系。一旦灰度变换函数确定,该点运算就完全确定下来了。另外,点运算处理将改变图像的灰度直方图分布。点运算又被称为对比度增强、对比度拉伸或灰度变换。点运算一般包括灰度的线性变换、阈值变换、窗口变换、灰度拉伸和均衡等。 图像几何变换是图像的一种基本变换,通常包括图像镜像变换、图像转置、图像平移、图像缩放和图像旋转等,其理论基础主要是一些矩阵运算,详细原理可以参考有关书籍。 实验系统提供了图像灰度直方图、点运算和几何变换相关内容的文字说明,用户在操作过程中可以参考。下面以图像点运算中的阈值变换为例给出编程实现的程序流程图,如下:

透视投影矩阵推导

在上一篇文章中我们讨论了透视投影变换的原理,分析了 OPe nGL 所使用的透视 投影矩阵的生成方法。正如我们所说,不同的图形APl 因为左右手坐标系、行向 量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的 透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下 DireCt3D (以 下简称D3D 以及J2ME 平台上的JSR184(M3G (以下简称M3G 的透视投影矩 阵,主要出于以下几个目的: (1) 我们在写图形引擎的时候需要采用不同的图形 API 实现,当前主要 是OPenGL 和D3D 虽然二者的推导极为相似,但 D3D 的自身特点导致了一些地 方仍然需要澄清。 (2) DireCtX SDK 的手册中有关于透视投影矩阵的一些说明,但并不详 细,甚至有一些错误,从而使初学者理解起来变得困难, 而这正是本文写作的目 的。 (3) M3G 是J2ME 平台上的3D 开发包,采用了 OPenG!作为底层标准进 行封装。它的透视投影矩阵使用 OPe nG 啲环境但又进行了简化,值得一提。 本文努力让读者清楚地了解D3D 与 M3G 透视投影矩阵的原理,从而能够知道它与 OPenG 啲一些差别,为构建跨 API 的图形引擎打好基础。需要指出的一点是为 了完全理解本文的内容,请读者先理解上一篇文章 《深入探索透视投影变换》的 内容,因为OPenGL 和它们的透视投影矩阵的原理非常相似,因此这里不会像上 一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始! OPenGL ? D3D 的基本差异 前面提到,不同API 的基本差异导致了最终变换矩阵的不同,而导致 OPenGL 和 D3D 的透视投影矩阵不同的原因有以下几个: (1) OPe nGL 默认使用右手坐标系,而 D3D 默认使用左手坐标系 OPerLGL ri^iUxandeci CoOrdinate system DmD handed coordinate SyStem

推导相机变换矩阵

推导相机变换矩阵 -潘宏 -2009.12.31 -本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教 -email: popyy@https://www.360docs.net/doc/374050049.html, 一些网友写信给我希望能够了解固定流水线中世界空间到相机空间变换矩阵的具体推导过程。其实之前我在《向量几何在游戏编程中的使用6》中已经简单的把相机变换作为一个使用基理论的例子进行了说明,但可能仍然不够具体。这篇文章中,我会尽力阐述相机变换的整个来龙去脉。希望能够对正在学习固定流水线的朋友们有所帮助。这里我们仍然会在推导相机变换之前介绍几个理论知识,目的是为了更好的理解推导过程。我们马上开始! 什么是相机变换? 在流水线中,当物体从模型坐标通过世界矩阵变换到世界空间之后,它将通过相机变换从世界空间变换到相机空间。下图的固定流水线中,蓝色框中的部分就是这个过程。 其实,所谓的相机空间,就是以相机作为坐标原点的一个参考系,所以,从世界空间变换到相机空间,就是把物体从世界坐标系,变换到相机为原点的相机坐标系,如下图所示。

左半部分是小人在世界空间中的位置,右半部分是小人变换到相机空间后的位置。这样的一个变换可以有很多种方式来实现:欧拉相机系统、UVN系统、Two Points & A Twist等等。这里我们讨论最为广泛的UVN系统构建相机矩阵,如果读者对其他方法感兴趣,可以查找相关的资料。我们仍然讨论OpenGL的相机矩阵的推导,其他API可以类似的推导。 坐标转换公式 我们在《向量几何在游戏编程中的使用6》中提到了正交矩阵,这是在基理论基础上的一个概念(如果对基理论不是很熟悉,请参考《向量几何在游戏编程中的使用6》)。正交矩阵所有列(行)向量构成了一个标准正交基(它的列向量都是互相正交,并且长度为1),因此,可以把正交矩阵看成是对一个坐标系的描述。同时,我们知道:同一个向量,在不同的基下面的坐标是不同的。因此,可以用正交矩阵来代表坐标系(也可以看作基)从而写出在统一的参考系(全局坐标系)下同一个向量在不同基中的坐标。 上面的式子表示,参考系中向量v在基Q中的坐标是v’,在基R中的坐标是v’’(注意这里的环境下基矩阵是用列向量表示的,这样相乘之后的结果表示的是基向量的线性组合)。如下图,黑色基表示的是参考系,红色是基Q,蓝色是基R,v是参考系中的一个向量。

透视投影矩阵推导

在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视投影矩阵的生成方法。正如我们所说,不同的图形API因为左右手坐标系、行向量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下Direct3D(以下简称D3D)以及J2ME平台上的JSR184(M3G)(以下简称M3G)的透视投影矩阵,主要出于以下几个目的: (1) 我们在写图形引擎的时候需要采用不同的图形API实现,当前主要是OpenGL和D3D。虽然二者的推导极为相似,但D3D的自身特点导致了一些地方仍然需要澄清。 (2) DirectX SDK的手册中有关于透视投影矩阵的一些说明,但并不详细,甚至有一些错误,从而使初学者理解起来变得困难,而这正是本文写作的目的。 (3) M3G是J2ME平台上的3D开发包,采用了OpenGL作为底层标准进行封装。它的透视投影矩阵使用OpenGL的环境但又进行了简化,值得一提。 本文努力让读者清楚地了解D3D与M3G透视投影矩阵的原理,从而能够知道它与OpenGL的一些差别,为构建跨API的图形引擎打好基础。需要指出的一点是为了完全理解本文的内容,请读者先理解上一篇文章《深入探索透视投影变换》的内容,因为OpenGL和它们的透视投影矩阵的原理非常相似,因此这里不会像上一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始! OpenGL与D3D的基本差异 前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致OpenGL和D3D的透视投影矩阵不同的原因有以下几个: (1) OpenGL默认使用右手坐标系,而D3D 默认使用左手坐标系。

数字图像处理图像变换实验报告

实验报告 实验名称:图像处理 姓名:刘强 班级:电信1102 学号:1404110128

实验一图像变换实验——图像点运算、几何变换及正交变换一、实验条件 PC机数字图像处理实验教学软件大量样图 二、实验目的 1、学习使用“数字图像处理实验教学软件系统”,能够进行图像处理方面的 简单操作; 2、熟悉图像点运算、几何变换及正交变换的基本原理,了解编程实现的具体 步骤; 3、观察图像的灰度直方图,明确直方图的作用和意义; 4、观察图像点运算和几何变换的结果,比较不同参数条件下的变换效果; 5、观察图像正交变换的结果,明确图像的空间频率分布情况。 三、实验原理 1、图像灰度直方图、点运算和几何变换的基本原理及编程实现步骤 图像灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度分布情况,为图像的相关处理操作提供了基本信息。 图像点运算是一种简单而重要的处理技术,它能让用户改变图像数据占据的灰度范围。点运算可以看作是“从象素到象素”的复制操作,而这种复制操作是通过灰度变换函数实现的。如果输入图像为A(x,y),输出图像为B(x,y),则点运算可以表示为: B(x,y)=f[A(x,y)] 其中f(x)被称为灰度变换(Gray Scale Transformation,GST)函数,它描述了输入灰度值和输出灰度值之间的转换关系。一旦灰度变换函数确定,该点运算就完全确定下来了。另外,点运算处理将改变图像的灰度直方图分布。点运算又被称为对比度增强、对比度拉伸或灰度变换。点运算一般包括灰度的线性变换、阈值变换、窗口变换、灰度拉伸和均衡等。 图像几何变换是图像的一种基本变换,通常包括图像镜像变换、图像转置、图像平移、图像缩放和图像旋转等,其理论基础主要是一些矩阵运算,详细原理可以参考有关书籍。 实验系统提供了图像灰度直方图、点运算和几何变换相关内容的文字说明,用户在操作过程中可以参考。下面以图像点运算中的阈值变换为例给出编程实现的程序流程图,如下:

相关文档
最新文档