数字图像基础【7】应用线性回归最小二乘法(矩阵版本)求解几何变换(仿射、透视)

news2025/1/20 5:55:06

这一章主要讲图像几何变换模型,可能很多同学会想几何变换还不简单嚒?平移缩放旋转。在传统的或者说在同一维度上的基础变换确实是这三个,但是今天学习的是2d图像转投到3d拼接的基础变换过程。总共包含五个变换——平移、刚性、相似、仿射、透视

平移、刚性、相似

我们先看最简单的几何变换模型——平移和刚性。首先是平移变换,就一组参数 tx 和 ty组成的一个向量。这个跟我们之前学习OpenGL的时候是一致的,这里就不多说了。然后就是刚性变换,刚性变换在平移变换的基础上,增加旋转角度θ相关的矩阵。刚性变换的一个特点,就是不改变图像内部结构的长度和角度。

那么旋转矩阵的它是怎么来的,我们可以利用变换前后的两组点位置,用数学关系推导。两坐标点通过圆半径等长作为中间恒量,就可以写出数学恒等式。然后会发现,旋转矩阵是一个很完美的矩阵,它是一个正交矩阵。

  • 正交矩阵的行列式为1
  • 且每个列向量都是单位向量且相互正交
  • 它的逆等于它的转置 R(-1)是R(T)

接着我们再说第三个变换,相似变换。这个变换又是在前者(刚性变换)的基础上增加了缩放尺度的矩阵。因为存在缩放,所以相似变换它会改变目标内部结构的长度,但还是保持着对象内部角度的不变性。这些都在OpenGL的时候接触过,数学原理就不在这展开了。(建议同学可以在平时吃午饭的时候回顾一下线性代数,推荐B站的这套教学视频)

仿射、透视

接下来说说本篇的重点,仿射变换和透视变换。两者在机器视觉里面是很重要的变换,无论是在二维的图像处理和三维的网格处理当中都经常使用到。

我们先看仿射变换,它由一个线性变换矩阵+平移向量组成。线性变换矩阵T=[a, b, c, d]四个参数来表示。上图很清楚的表达了仿射变换前后带来的变形,其对象内部结构也会发生变换,但是其内部结构的平行性是可以得到保持的。下面我们来看一个仿射变换的例子。

当设置单位矩阵(a、d = 1.0)的时候,是一个有缩放能力的单位阵,图形对象保持原样没有变形;把参数b=0.2以后,原来的正方形的两边发生了倾斜变形;把参数c=0.2以后,原来的正方形的上下底边发生了旋转进而使得正方形也发生了变形;所以仿射变换它不仅会带来旋转而且还会变形,但图像内的平行性是相对不变的,是一个相对自由的线性变换。

有了概念之后,那么是如何求 仿射变换的矩阵系数呢?细想后发现,我们可以把仿射变换的矩阵看成K,那么仿射变换是不是就变成了小时候学习的二元一次方程 Y=KX+B ?此时就需要N组变换点,注意上图给的例子,(x1.1,y1.1) 和 (x2.1,y2.1)对应,表示第一组变换点。(x1.2,y1.2) 和 (x2.2,y2.2)对应,表示第二组变换点,如此类推到第N组变换点,各自都写成了矩阵乘法的代数式,总共有2N个代数式。

由线性回归的思想,在用最小二乘法就可以推导出X的公式,代入就可以求出其矩阵的具体参数。

紧接着我们看最后一个变换——透视变换(也叫投影变换)我们在说仿射变换的时候呢,它保持着图形对象内部结构的不变性。在透视变换中,图形对象内部结构的平行性也不能保持不变了,它是一个更加灵活自由度最大的一个变换模型。

从参数矩阵分析,此模型变换共有8个可变参数(也叫8个自由度),有两种表达形式数学代数形式 和 矩阵形式。当写成矩阵形式的时候,这个矩阵名称叫 H 单应矩阵(Homography)。这个透视变换它是计算机世界里面一个很重要的模型,比如说我们用一个针孔相机去拍一个平面,那么平面上的目标和我们图像上的目标会有一个对应关系,这个关系就可以用这个单应矩阵来表达(假设这个相机不存在畸变)

这里給出一个例子,介绍如何求解透视变换的单应矩阵。我们可以把输入输出写成特征矩阵的形式,仍然是一对点,2组方程,就可以利用线性回归的最小二乘法求解得到其单应矩阵参数。

线性回归——最小二乘法(矩阵版本)

那么对应到矩阵的二元一次方程该是如何计算呢?有请主角——矩阵版本的“最小二乘法”

先看看百度百科是如何描述的:最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合,其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

这里我尝试用最简单直白的语言描述一下矩阵版本的最小二乘法的核心思想。与其说最小二乘法是一个数学方法,我觉得它是由离散(特征)点去推导线性关系的一种解题细想。如果输入输出确定存在某种大致的线性关系,那么用真实的 Y' 值,减去 KX(K未知)其差值应该为0,或者其差值为恒定值B。注意这里的 “真实的 Y' 值”,并不是上面二元一次方程 Y=KX+B的Y,这里一定要区分开。那么这里就可以引申出机器学习中的损失函数的概念:

SSELoss(k) = || Y' - KX ||²

那么我们只需要把SSELoss损失函数的值控制在最小,也或者是说对SSELoss求导后,令其为0(函数斜率恒定,不在有变化)那么就可以得到我们的所希望的线性关系的参数代数式。

原理思想就是这个,那么我们这里开始深入分析最小二乘法,并尝试以矩阵形式进行展开。

第一步,列举一个多元线性方程的通用公式 f(x) = w₁x₁ + w₂x₂ ... wnxn + b, 这里的共n个自变量(x₁、x₂一直到xn)和n个特征(w₁、w₂一直到wn),常数b表示截距的意思。

第二步,改写矩阵相乘的形式,把特征提取成一个特征矩阵w = [w₁,w₂, ... wn]┬,自变量x = [x₁,x₂, ... xn]┬(┬代表矩阵的转置)那么第一步的通用公式就可以写成 f(x) = w┬·x + b(加粗效果wx代表矩阵)

第三步,把多组自变量数据(假设共有m组测试数据),每一组改写成自变量矩阵x的形式。这样左边就能组成一个m行,n+1列的输入矩阵。右边就是对应的因变量构成m行1列的结果矩阵。这样 f(x) = w┬·x + b就具体形象起来了。

第四步,我们考虑把截距b也纳入进特征矩阵,另其也当成一个恒定的特征量。新定义w-hat = [w₁,w₂, ... wn, b]┬,相对应的x-hat = [x₁,x₂, ... xn, 1]┬,并定义由所有测试数据集所组成的矩阵 X-hat 。这样原来的f(x) = w┬·x + b,就可以改写成 f(x) = w-hat┬ · x-hat。而对应具体的测试数据集和结果集就可以写成 y =​​​​​​​ ​​​​​​​X-hat · w-hat(注意矩阵乘法顺序、转置不能搞错)

第五步,构造损失函数SSELoss(w),我们用真实结果集 y 减去 X-hat·w-hat,再求2-范式。根据2-范式的定义,我们可以巧妙的把损失函数-代数2-范式的形式,改写成矩阵相乘的写法。(可以仔细想想 1xN的矩阵 和 Nx1的矩阵相乘后的代数式展开)

第六步,也是最后一步,就和开始前介绍思想原理的时候说的,对损失函数SSELoss(w)求导,并求解其导函数为0的时候,特征矩阵w的表达形式。

详情请参考B站这套课程。Lesson 2.2 机器学习矩阵求导与最小二乘法_哔哩哔哩_bilibili

That ‘ s All.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚融宝10-Excel数据批量导入

目录 一、数据字典 (一)、什么是数据字典 (二)、数据字典的设计 二、Excel数据批量导入 (一)后端接口 1、添加依赖 2、创建Excel实体类 3、创建监听器 4、Mapper层批量插入 5、Service层创建监听…

2023年,想要靠做软件测试获得高薪,我还有机会吗?

时间过得很快,一眨眼,马上就要进入2023年了,到了年底,最近后台不免又出现了经常被同学问道这几个问题:2023年还能转行软件测试吗?零基础转行可行吗? 本期小编就“2023年,入行软件测…

一文解决nltk安装问题ModuleNotFoundError: No module named ‘nltk‘,保姆级教程

目录 问题一:No module named ‘nltk‘ 问题二:Please use the NLTK Downloader to obtain the resource 下载科学上网工具 问题三:套娃报错 如果会科学上网,可以直接看问题三 问题一:No module named ‘nltk‘ Mo…

【微服务笔记16】微服务组件之Gateway服务网关基础环境搭建

这篇文章,主要介绍微服务组件之Gateway服务网关基础环境搭建。 目录 一、Gateway服务网关 1.1、什么是Gateway 1.2、Gateway基础环境搭建 (1)基础环境介绍 (2)引入依赖 (3)添加路由配置信…

软件测试工程师的进阶之旅

很多人对测试工程师都有一些刻板印象,比如觉得测试“入门门槛低,没有技术含量”、“对公司不重要”、“操作简单工作枯燥”“一百个开发,一个测试”等等。 会产生这种负面评论,是因为很多人对测试的了解,还停留在几年…

Lesson12 udptcp协议

netstat命令->查看网络状态 n 拒绝显示别名,能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服務状态p 显示建立相关链接的程序名t (tcp)仅显示tcp相关选项u (udp)仅显示udp相关选项a (all)显示所有选项,默认不显示LISTEN相关 pidof命令-&…

SQL select详解(基于选课系统)

表详情: 学生表: 学院表: 学生选课记录表: 课程表: 教师表: 查询: 1. 查全表 -- 01. 查询所有学生的所有信息 -- 方法一:会更复杂,进行了两次查询,第一…

机器学习笔记之正则化(六)批标准化(BatchNormalization)

机器学习笔记之正则化——批标准化[Batch Normalization] 引言引子:梯度消失梯度消失的处理方式批标准化 ( Batch Normalization ) (\text{Batch Normalization}) (Batch Normalization)场景构建梯度信息比例不平衡批标准化对于梯度比例不平衡的处理方式 ICS \text{…

《抄送列表》:过滤次要文件,优先处理重要文件

目录 一、题目 二、思路 1、查找字符/字符串方法:str1.indexOf( ) 2、字符串截取方法:str1.substring( ) 三、代码 详细注释版: 简化注释版: 一、题目 题目:抄送列表 题目链接:抄送列表 …

Java[集合] Map 和 Set

哈喽,大家好~ 我是保护小周ღ,本期为大家带来的是 Java Map 和 Set 集合详细介绍了两个集合的概念及其常用方法,感兴趣的朋友可以来学习一下。更多精彩敬请期待:保护小周ღ *★,*:.☆( ̄▽ ̄)/$:*.★* ‘ 一、…

JVM知识汇总

1、JVM架构图 2、Java编译器 Java编译器做的事情很简单,其实就是就是将Java的源文件转换为字节码文件。 1. 源文件存储的是高级语言的命令,JVM只认识"机器码"; 2. 因此将源文件转换为字节码文件,即是JVM看得懂的"…

Node.js—Buffer(缓冲器)

文章目录 1、概念2.、特点3、创建Buffer3.1 Buffer.alloc3.2 Buffer.allocUnsafe3.3 Buffer.from 4、操作Buffer4.1 Buffer 与字符串的转化4.2 Buffer 的读写 参考 1、概念 Buffer 是一个类似于数组的对象 ,用于表示固定长度的字节序列。Buffer 本质是一段内存空间…

视觉学习(四) --- 基于yolov5进行数据集制作和模型训练

环境信息 Jetson Xavier NX:Jetpack 4.4.1 Ubuntu:18.04 CUDA: 10.2.89 OpenCV: 4.5.1 cuDNN:8.0.0.180一.yolov5 项目代码整体架构介绍 1. yolov5官网下载地址: GitHub: https://github.com/ultralytics/yolov5/tree/v5.0 2. …

单元测试中的独立运行

单元测试中的独立运行 单元测试是针对代码单元的独立测试。要测试代码单元,首先要其使能够独立运行。项目中的代码具有依赖关系,例如,一个源文件可能直接或间接包含大量头文件,并调用众多其他源文件的代码,抽取其中的一…

论文阅读:Unsupervised Manifold Linearizing and Clustering

Author: Tianjiao Ding, Shengbang Tong, Kwan Ho Ryan Chan, Xili Dai, Yi Ma, Benjamin D. Haeffele Abstract 在本文中,我们建议同时执行聚类并通过最大编码率降低来学习子空间联合表示。 对合成和现实数据集的实验表明,所提出的方法实现了与最先进的…

limit、排序、分组单表查询(三)MySQL数据库(头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。 目录 第1关:对查询结果进行排序 任务描述 相关知识 对查询结果排序 指定排序方向 编程要求 第2关&a…

浏览器架构和事件循环

浏览器架构 早期浏览器【单进程多线程】 Page Thread 页面渲染,负责执行js,plugin,drawNetWork Thread 网络请求其余线程 file, storage缺点:只要其中一个线程崩溃,页面就会崩溃。 现代浏览器架构 多进程的浏览器,浏览器的每一个…

几种常见的激活函数

文章目录 常见的激活函数介绍Sigmoid函数ReLU函数LeakyReLU函数Tanh函数Softmax函数总结 常见的激活函数介绍 激活函数是神经网络中的重要组成部分,它决定了神经元的输出。在神经网络的前向传播中,输入数据被传递给神经元,经过加权和和激活函…

Unity自动化打包(1)

一 安装Jenkins https://www.jenkins.io/download/ 官网 1) 使用 brew 安装 2) 安装完成后一般都会遇到问题 我用的是jenkins-lts 稳定版 解决办法 删除掉对应的文件夹 1 rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services 2…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…