变换矩阵

模式识别系列之特征降维(1)主成分分析

半城伤御伤魂 提交于 2020-01-19 11:54:20
目录 1-PCA概述 2-理论推导 2.1-向量的内积与投影: 2.2-基的表示与变换: 2.3-协方差矩阵: 2.4-PCA推导 3-几何理解 4-计算过程 4.1-样本数小于特征数时的计算 4.2-matlab代码 5-实例 参考 1-PCA概述 主成分分析是一种常用的降维方法,它不使用标签信息,通过将原始坐标空间的数据( d × 1 d\times 1 d × 1 )投影到新的正交空间( k × 1 k\times 1 k × 1 )中实现数据降维,所谓的主成分就是指数据在新空间的基的方向。PCA以方差作为信息损失衡量的标准,使得数据降维过程中信息损失最小,即降维后数据的方差要尽量大。PCA首先找到所有数据方差最大的方向,并将其作为新的坐标空间的第一个轴的方向,然后在这个方向的垂直超平面上寻找第二个方差最大的方向,并作为新坐标空间第二个轴的方向,以此类推,直到找到需要的k个方向,也就是K个主成分,显然这k个新的基方向是两两垂直的。PCA的主要过程可以用“扭动坐标轴,保留K个轴”来形容。 为什么要以方差最大为依据呢?降维是为了数据更好地表示与计算,显然我们不希望降维后的数据成了一坨,使得原本分界明显的数据掺和在一起。例如,将数据投影到一维坐标系中,显然绿色的投影更好一些,因为其分散程度大,也就是方差更大。 对n个d维数据构成的数据集 X X X ( d × n d\times

第六章 基础纹理(2)

为君一笑 提交于 2020-01-17 15:36:05
目录 凹凸映射 1.1 高度纹理 1.2 法线纹理 1.3 使用模型空间存储法线的优点和使用切线空间的优点 2. 实践 2.1 在切线空间下计算 2.2 在世界空间下计算 3.Unity中的法线纹理类型 @ 凹凸映射 纹理另一种常见的应用就是凹凸映射(bump mapping)。凹凸映射的目的是使用一张纹理来修改模型表面的法线,以便为模型提供更多的细节。这种方法不会真的改变模型的顶点位置,只是让模型看起来好像是“凹凸不平”的,但可以从模型的轮廓处看出“破绽”。 有两种主要的方法可以用来进行凹凸映射:一种方法是使用一张高度纹理(height map)来模拟表面位移(displacement),然后得到一个修改后的法线值,这种方法也被称为高度映射(height mapping);另一种方法则是使用一张法线纹理(normal map)来直接存储表面法线,这种方法又被称为法线映射(normal mapping)。尽管我们常常将凹凸映射和法线映射当成是相同的技术,但读者需要知道它们之间的不同。 1.1 高度纹理 我们首先来看第一种技术,即使用一张高度图来实现凹凸映射。高度图中存储的是强度值(intensity),它用于表示模型表面局部的海拔高度。因此,颜色越浅表明该位置的表面越向外凸起,而颜色越深表明该位置越向里凹。这种方法的好处是非常直观,我们可以从高度图中明确的知道一个模型表面的凹凸情况

Android 变形矩阵——Matrix

荒凉一梦 提交于 2020-01-17 06:49:19
对于图像的色彩处理,Android系统提供了ColorMatrix颜色矩阵来帮助我们进行图像处理。而对于图像的图形变化,Android系统也是通过来进行处理的,每个像素点都表达了其坐标的X、Y信息。Android的图形变换矩阵是一个3x3的矩阵,如图(1)所示。 当使用变换矩阵去处理每一个像素点的时候,与颜色矩阵的矩阵乘法一样,计算公式如下所示。 X1 = a * X + b * Y + c Y1 = d * X + e * Y + f l = g * X + h * Y + i 通常情况下,会让g=h=0,i=1,这是使 l = g * x + h *y + i恒成立。因此,只需要关注上面几个参数就可以了。 与色彩变换矩阵的初始矩阵一样,图像变换矩阵也有一个初始矩阵。很明显,就是对直角元素a、e、i我1,其他元素我0的矩阵,如图(2)所示。 图像的变化处理通常包含以下四类基本变化 ● Translate——平移变换 ● Rotate——选择变换 ● Scale——缩放变换 ● Skew——错切变换 ▶ 平移变换 平移变换的坐标值变换过程如图(3)所示,即将每个像素点都进行平移变换。 当从p(X0,Y0)平移到p(X,Y),坐标值发送了如下所示的变换 X = X0 + △X Y = Y0 + △Y 如果写成矩阵形式就是如图(4)所示。 通过技计算可发现如下等式。 X = X0 +

2.6 矩阵的初等变换

[亡魂溺海] 提交于 2020-01-15 10:26:33
文章目录 初等变换:行、列 定理 等价 性质 初等方阵 初等方阵与初等变换的关系 三种初等方阵的行列式、逆矩阵 定理 初等矩阵的作用 定理 A可逆条件总结 初等变换法求逆矩阵 初等行变换法(只做行变换) 参考 初等变换:行、列 下面是三种初等行变换,列变换与行变换一样也是三种。 初等变换的本质是:对矩阵的变化 只有当矩阵A为方阵时,初等变换才会和行列式产生联系 定理 任何矩阵都能通过初等变换化为标准型 化为标准型的处理过程为: 先处理第一列 等价 性质 反身性、对称性、传递性、任何矩阵都等价于一个标准型 初等方阵 有以下三种初等方阵 初等方阵与初等变换的关系 初等变换表示的是对矩阵的变换,而初等方阵就是一个实实在在的矩阵 三种初等方阵的行列式、逆矩阵 定理 左乘一个初等方阵相当于实施行变换,右乘一个初等方阵相当于实施列变换。 初等矩阵的作用 初等矩阵可以将初等变换的“动作”(箭头表示)转换为一个等式“=”,数学喜欢用等式 定理 任意矩阵A都可以通过左乘右乘初等矩阵化为标准型 推论:A、B等价的充要条件是存在可逆矩阵P、Q使得 P A Q = B PAQ=B P A Q = B 如果A可逆则A可以表示成数个初等矩阵相乘 A可逆条件总结 初等变换法求逆矩阵 初等行变换法(只做行变换) 对A和E同时做初等行变换,当A化成E时,E同时就化成了A逆 如果矩阵行列式本来是0

直线提取与边界追踪

ε祈祈猫儿з 提交于 2020-01-14 02:17:41
文章目录 1.用霍夫变换提取直线 2.边界跟踪 图像的基本特征之一是直线。一般物体平面图像的轮廓可近似为直线及弧线的组合,对物体轮廓的检测与识别可以转化为对这些基元的检测与提取。另外,在运动图像分析和估计领域也可以采用直线对应法实现刚体旋转量和位移量的测量,所以直线检测对图像算法的研究具有重要意义。 边缘是一个局部的概念,一个区域的边界是一个整体的概念,边界追踪是一种串行的图像分割技术。图像由于噪声以及光照不均匀等原因,边缘点可能是不连续的,边界追踪可以将其变为有意义的信息。下面分别介绍直线的提取与边界追踪。 1.用霍夫变换提取直线 Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。它通过将原图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。由于利用了图像的全局特性,所以受噪声和边界间断的影响较小,鲁棒性能好。Hough变换常用来对图像中的直线进行识别。 图像上任意直线区域都可以一一对应参数空间中的点,而图像上的任意像素都同时存在于很多直线区域之上。将图像上的直线区域想象为容器,把特定像素想象成放在容器中的棋子,只不过在这里,每个棋子都可以同时存在于多个容器中。那么Hough变换可以理解为依次检查图像上的每个棋子(特定像素),对于每个棋子,找到所有包含它的容器(平面上的直线区域),并为每个容器的计数器加1

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

﹥>﹥吖頭↗ 提交于 2020-01-06 04:32:41
透视投影是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 –

opengl学习笔记

不羁的心 提交于 2020-01-03 08:38:56
准备: 1、准备资源: 从 GLEW1.13.0 下载GLEW,并且解压出glew-1.13.0目录。 从FreeGLUT官网下载3.0.0版本。直接从这里下的 编译后的FreeGLUT ,选for MSVC,下载后解压。 2、将所有的x64(64位)版本的.h和.lib拷贝到vs2015安装目录下的vc文件夹里的include和lib里 将所有.dll文件拷贝到C:\Windows\SysWOW64这个目录下 如果是32位系统就不一样了 3、打开ivs2015,创建新的控制台应用程序 #include <glut.h> #include <glew.h> 包括上边的两个头文件 1 void myDisplay(void) 2 { 3 glClear(GL_COLOR_BUFFER_BIT); 4 glColor3f(0.0f, 1.0f, 0.0f); 5 glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 6 glFlush(); 7 } 8 9 int main(int argc, char *argv[]) 10 { 11 glutInit(&argc, argv); 12 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 13 glutInitWindowPosition(100, 100); 14

投影矩阵推导(翻译)

我们两清 提交于 2020-01-01 21:57:24
投影矩阵推导(翻译) 原网址: http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c10123/Deriving-Projection-Matrices.htm 3D矩阵变换中,投影矩阵是最复杂的。位移和缩放变换一目了然,旋转变换只要基本的三角函数就能想象出来,投影矩阵则很难凭借直觉想象出来。 总述:什么是投影 计算机显示屏是二维平面,所以如果你想显示三维物体,需要找到把三维物体渲染成二维图像的方法。这正是投影要做的。最简单的做法:直接丢掉三维物体各顶点的Z坐标。对于一个立方体,看起来像图1: 图1 通过丢掉Z坐标方法投影到XY平面 这种投影简单且不实用。所以,一开始就不应该投影到“面”(plane)上,而应该投影到一个“体”(volume)内,即所谓的“规范视域体”(canonical view volume)。规范视域体的顶点坐标在不同的API(DirectX/OpenGL)中有所不同。这里就用D3D的标准,从 (-1,-1,0)到(1,1,1)。当所有的顶点映射到规范视域体中后,XY坐标用来再映射到屏幕上。Z坐标看起来无用,不过通常用来表示深度信息。这也是为什么会投影到一个“体”,而不是“面”的原因。 下面将讲述两种常见变换:正交变换、透视变换。 正交变换 “正交”的由来是投影线与显示平面垂直

图形学的矩阵变换

喜夏-厌秋 提交于 2019-12-27 17:52:32
确定一个四棱锥的一块空间,两个断面之间的空间就是需要投影的空间 gluLookAt的函数的作用,它封装了世界坐标系到观察坐标系的转换,从“从一个点去看另一个点的方法(ps:包括方向)” 世界坐标系是最大的坐标系,最小的是模型坐标系;最后显示的结果是观察坐标系; 可以建立一个巨大的虚拟世界,这个世界里面包含了很多的对象; 但是这个世界是没有“观察”的;等有了“观察”之后,就需要观察的位置和产生的结果的地方(gluLookAt);并且需要哪些东西可以在观察的位置出现,这个就是gluPerspective 模型矩阵描述了一系列变换的信息。我们首先计算物体的模型矩阵,然后将物体每个顶点的坐标(在局部的物体坐标系下)都左乘该模型矩阵,得到这一帧该物体每个顶点的坐标。 三大变换: 模型视图变换 (自身) 投影变换  (观察) 视口变换(显示) 在模型矩阵中,我们关心物体在变换后处在世界坐标系下的位置。事实上,我们更加关心物体相对于观察者的位置。最简单的方案是将观察者置于原点处,面向z轴正半轴,那么空间中的点在世界坐标系下的位置就是其相对于观察者的位置。观察者的位置和方向变化时(用一个变换来描述),就好像整个世界的位置和方向进行了相反的变换。所以,在所有物体的模型矩阵的左侧再乘以一个表示整个世界变换的模型矩阵,就可以了。这个表示整个世界变换的矩阵又称为“视图矩阵”,因为他们经常一起工作

unity shader之预备知识

北城以北 提交于 2019-12-26 20:09:18
1.渲染流水线 任务:从一个三维场景出发,生成(或者渲染)一张二维图像。即:计算机需要从一系列的定点出数据,纹理等信息出发,把这些信息最终转换程一张人眼可以看到的图像。而这个工作通常是由CPU和GPU共同完成的。 三个阶段: (1)应用阶段(CPU):1.准备场景数据。2.粗粒度剔除工作。3设置模型的渲染状态,输出渲染所需要的几何信息. 应用阶段大致可以分为三个阶段: 1.把数据加载到显存中。 2.设置渲染状态。渲染状态:定义场景中的网格是怎样被渲染的。如:使用那个顶点着色器/片元着色器。 3.调用DrawCall。DrawCall是一个命令,发起方为CPU,接收方为GPU。 (2)几何阶段:把定点坐标变换到屏幕空间中,再交给光栅器进行处理。对输入的渲染图源进行多部处理后,将会输出屏幕空间的二维顶点坐标,每个定点对应的深度值,着色等相关信息。 (3)光栅化阶段:产生屏幕上的像素,并渲染最终的图像。光栅化的任主要是决定每个渲染图源中的那些像素应该被绘制再屏幕上。对上一阶段得到的逐定点数据进行插值,然后再进行逐像素处理。 为了避免我们看到的那些正在进行光栅化的图元,GPU会使用双重缓冲策略(前置缓冲,后置缓冲)。当场景被渲染到后置缓冲中,GPU会交换前后置缓冲中的内容,前置缓冲事之前显示在屏幕上的图像。 (1)顶点着色器:处理单位是顶点,输入进来的每个定点都会调用一次定点着色器