深度学习中小知识点系列(二) 解读仿射变换和透视变换

news2024/11/28 4:53:06

综述

所有复杂的东西,都是由基本的组成的。所以我们需要先了解一下基础的变换有哪些:

img

平移

我们对矩形(图像)平移,需要怎么做?

对每一个像素点坐标平移。可以让每一个像素点的x,y坐标都加一个变量。

矩阵形式表示:

img

等式左边[X,Y,1]是像素坐标的齐次形式。等式右边是平移之后的坐标。

放缩

进行放缩,就是将矩形(图像)放缩n倍,也就是长宽各乘一个变量。

img

旋转

对矩形(图片)进行旋转,关于旋转的数学推导在后面仿射会介绍:

img

错切

前面的都比较直观,那错切是什么呢?

我们可以看下矩形关于y方向的错切:

img

看图就很直观了,那数学表达呢?

img

x轴上的错切就是同理了,公式如下:

img

然后两者和起来,就如下了:

img

好了,到此我们就了解了这四种变换了,那仿射变换是什么呢?可以看下图公式:

img

等式右边就是仿射变换矩阵,是由原图像平移,旋转,放缩,错切之后得来的。

在书上往往将仿射变换和透视变换放一起讲,这两者各是什么呢?

在刚学仿射变换和透视变换时,我是有些分不清的。印象最深刻的就是下图:

img

可以看到,仿射变换(下)是将矩形变换成平行四边形(即变换后各边依旧平行),而透视变换(上)可以变换成任意不规则四边形

这样看来,好像仿射变换是透视变换的子集。

那到底是不是呢?其实是的。仿射变换属于线性变换,而透视变换则不仅仅是线性变换。仿射变换可以看做是透视变换的一种特例。

直观上感受,我们可以认为:

仿射变换是单纯对图片进行缩放,倾斜和旋转,因此图片不论如何变化,线之间的平行性是不变的。如下图。

img

可以感受到,右图是可以通过左图平移,旋转,错切,缩放之后得来。

而透视变换,则是当观察者的视角发生变化时物体发生的透视变换,此转换允许造成透视形变。

我们看下图的公路,近处宽远处窄,就是因为视角的原因,

img

仿射变换

原理

基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换:
图像仿射变换公式
如果写成矩阵的形式,就是:
仿射变换矩阵表示
作如下定义:
仿射变换矩阵表示各部分描述
矩阵T(2×3)就称为仿射变换的变换矩阵,R为线性变换矩阵,t为平移矩阵,简单来说,仿射变换就是线性变换+平移。变换后直线依然是直线,平行线依然是平行线,直线间的相对位置关系不变,因此非共线的三个对应点便可确定唯一的一个仿射变换,线性变换4个自由度+平移2个自由度→仿射变换自由度为6。

opencv中实现仿射变换

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img = cv.imread('drawing.jpg')
rows, cols = img.shape[:2]

# 变换前的三个点
pts1 = np.float32([[50, 65], [150, 65], [210, 210]])
# 变换后的三个点
pts2 = np.float32([[50, 100], [150, 65], [100, 250]])

# 生成变换矩阵
M = cv.getAffineTransform(pts1, pts2)
# 第三个参数为dst的大小
dst = cv.warpAffine(img, M, (cols, rows))

plt.subplot(121), plt.imshow(img), plt.title('input')
plt.subplot(122), plt.imshow(dst), plt.title('output')
plt.show()

实验结果

仿射变换前后对比图

平移

图解平移
平移就是x和y方向上的直接移动,可以上下/左右移动,自由度为2,变换矩阵可以表示为:
平移变换矩阵表示

旋转

图解旋转
旋转是坐标轴方向饶原点旋转一定的角度θ,自由度为1,不包含平移,如顺时针旋转可以表示为:
旋转变换矩阵表示

翻转

翻转是x或y某个方向或全部方向上取反,自由度为2,比如这里以垂直翻转为例:
垂直翻转矩阵表示

刚体变换

旋转+平移也称刚体变换(Rigid Transform),就是说如果图像变换前后两点间的距离仍然保持不变,那么这种变化就称为刚体变换。刚体变换包括了平移、旋转和翻转,自由度为3。由于只是旋转和平移,刚体变换保持了直线间的长度不变,所以也称欧式变换(变化前后保持欧氏距离)。变换矩阵可以表示为:
刚体变换矩阵表示

缩放

图解缩放缩放是x和y方向的尺度(倍数)变换,在有些资料上非等比例的缩放也称为拉伸/挤压,等比例缩放自由度为1,非等比例缩放自由度为2,矩阵可以表示为:
缩放变换矩阵表示

相似变换

相似变换又称缩放旋转,相似变换包含了旋转、等比例缩放和平移等变换,自由度为4。在OpenCV中,旋转就是用相似变换实现的:
若缩放比例为scale,旋转角度为θ,旋转中心是(centerx,centery),则仿射变换可以表示为:
相似变换矩阵表示
其中:
上述公式中的α和β计算公式
相似变换相比刚体变换加了缩放,所以并不会保持欧氏距离不变,但直线间的夹角依然不变。

透视变换

前面仿射变换后依然是平行四边形,并不能做到任意的变换。
各种透视变换

原理

透视变换(Perspective Transformation)是将二维的图片投影到一个三维视平面上,然后再转换到二维坐标下,所以也称为投影映射(Projective Mapping)。简单来说就是二维→三维→二维的一个过程。
透视变换公式:
透视变换公式
透视变换矩阵表示:
透视变换矩阵表示
仿射变换是透视变换的子集。接下来再通过除以Z轴转换成二维坐标:
透视变换中的三维->二维
透视变换相比仿射变换更加灵活,变换后会产生一个新的四边形,但不一定是平行四边形,所以需要非共线的四个点才能唯一确定,原图中的直线变换后依然是直线。因为四边形包括了所有的平行四边形,所以透视变换包括了所有的仿射变换。

opencv中实现透视变换

OpenCV中首先根据变换前后的四个点用cv.getPerspectiveTransform()生成3×3的变换矩阵,然后再用cv.warpPerspective()进行透视变换。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('card.jpg')

# 原图中卡片的四个角点
pts1 = np.float32([[148, 80], [437, 114], [94, 247], [423, 288]])
# 变换后分别在左上、右上、左下、右下四个点
pts2 = np.float32([[0, 0], [320, 0], [0, 178], [320, 178]])

# 生成透视变换矩阵
M = cv.getPerspectiveTransform(pts1, pts2)
# 进行透视变换,参数3是目标图像大小
dst = cv.warpPerspective(img, M, (320, 178))

plt.subplot(121), plt.imshow(img[:, :, ::-1]), plt.title('input')
plt.subplot(122), plt.imshow(dst[:, :, ::-1]), plt.title('output')
plt.show()

实验结果

图片矫正结果

总结

图解图像各种变换
图解图像各种变换
图像仿射变换和透视变换性质总结
质总结](https://img-blog.csdnimg.cn/2020032911012244.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0liZWxpZXZlc3Vuc2hpbmU=,size_16,color_FFFFFF,t_70#pic_center)

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

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

相关文章

我叫:归并排序【JAVA】

1.认识我一下 1.归并排序(MERGE-SORT)利用归并的思想实现的排序方法,该算法采用经典的分治策略2.分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。 2.分合思想 3 分久必合 /*** 合并** param arr …

好用的6个AI写作工具推荐,热门AI写作软件有哪些?

人工智能的快速发展催生了许多创新的应用,其中之一就是AI写作软件。这些免费的AI写作软件通过借助先进的自然语言处理技术,可以帮助写作者和创作者提升创作效率。本文将为大家介绍七款免费的AI写作软件,它们功能强大且易于使用。 我们来看看O…

基于Springboot的墙绘产品展示交易平台(有报告),Javaee项目,springboot项目。

演示视频: 基于Springboot的墙绘产品展示交易平台(有报告),Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller&#xff0…

YOLOv8优化策略:自适应改变核大小卷积AKConv,效果优于标准卷积核和DSConv |2023.11月最新成果

🚀🚀🚀本文改进: AKConv 中,通过新的坐标生成算法定义任意大小的卷积核的初始位置。 为了适应目标的变化,引入了偏移量来调整每个位置的样本形状。 此外,我们通过使用具有相同大小和不同初始采样形状的 AKConv 来探索神经网络的效果。 AKConv 通过不规则卷积运算完成…

pinyin4j 汉字转拼音包括——多音字

一、Maven 依赖 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version> </dependency> 二、通过多音字字典匹配 2.1&#xff0c;先看效果效果 输入&#xff1a;我在重庆…

入侵redis之准备---VMware上面安装部署centos7镜像系统【详细含云盘镜像】

入侵redis之准备—VMware上面安装部署centos7镜像系统【详细含云盘镜像 废话不多说直接开始 下载centos7镜像 网上有好多&#xff0c;但是我相信来看小编文章的基本上应该都有centos7的镜像了吧&#xff0c;毕竟咱们都是同一类人&#xff0c;哈哈不卖关子了&#xff0c;小编直…

nginx三种虚拟主机的配置(IP,端口,域名)

准备工作&#xff1a; [rootbogon ~]# mkdir -p /data/nginx{1..3} #-p是用于递归创建使用 [rootbogon ~]# echo "hello nginx1" > /data/nginx1/index.html [rootbogon ~]# echo "hello nginx2" > /data/nginx2/index.html [rootbogon ~]# echo &q…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…

大连大学2023年11月程序设计竞赛(同步赛)

B、爆wa种子!&#xff08;数学&#xff09; 一、题目要求 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 爆wa种子发现了上次玩游戏时你和妙wa种子的py交易&#xff0c;所以他要求这次玩游戏你来当爆wa种子的枪手&#xff0c;为他写个程序…

Selenium 连接到现有的 Google Chrome 示例

python 3.7 selenium 3.14.1 urllib3 1.26.8 Google Chrome 119.0.6045.160 (64位) chromedriver.exe 119.0.6045.105(win32) 1 Google Chrome 添加参数 "--remote-debugging-port9222" 2 测试效果(chromedriver.exe 要和 Google Chrome 版本…

day65

今日回顾内容 web应用 HTTP协议 web应用 一、什么是web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件 对于传统的应用软件来说&#xff0c;…

【备忘录】软件记录

Anaconda 虚拟环境 创建Python环境 Spyder Python程序编辑 Jupyter Notebook 交互式开发环境

【虹科干货】ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

ntopng为人所知的“身份”是被动流量监控。然而&#xff0c;如今的ntopng6.0也进化出主动监控功能来&#xff0c;漏洞扫描功能便是其中一个。那么漏洞扫描功能是什么&#xff1f;其独特之处是什么&#xff1f;用户该如何使用&#xff1f; 新的漏洞扫描和CVE支持&#xff0c;可…

TUP通信

一&#xff0c;概括 二&#xff0c;常用方法 三&#xff0c; 实现步骤&#xff08;一发一收&#xff09; 四&#xff0c;案例&#xff08;一接一收&#xff09; &#xff08;1&#xff09;&#xff0c;客户端 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&…

老板说我能力不行,怎么办?

大家好&#xff0c;我是鱼皮&#xff0c;今天分享一个很现实的职场问题 —— 如果老板说你的能力不行&#xff0c;怎么办&#xff1f; 该问题源于 编程导航星球 内的鱼友提问&#xff0c;原问题如下&#xff1a; 鱼友提问 &#x1f41f;&#xff0c;我是 23 届毕业生&#x…

探究Kafka原理-6.CAP理论实践

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

华为智能手表独立导航,一呼即应轻松畅行

PetalMaps 手表独立导航&#xff0c;一声令下唤醒导航&#xff0c;打造了智慧的语音交互唤醒体验功能。导航时&#xff0c;语音播报、变道震动提醒功能&#xff0c;让您尽情体验腕上导航乐趣&#xff0c;同时又能安全抵达目的地。

如何在外远程访问本地NAS威联通QNAP?

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 威联通安装cpolar内网穿透二. 内网穿透2.1 创建隧道2.2 测试公网远程访问 三.…

51单片机的智能窗帘系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DS18B20温度模块DS1302时间模块光敏传感器步进电机蓝牙等模块构成。适用于智能窗帘、智能门窗家具等相似项目。 可实现基本功能: 版本一&#xff1a; 1、LCD1602实时显示北京时间、环境温度、光照强度、手动/自动控制等信息…

vatee万腾的数字探险:Vatee科技创新的未知征程

在科技风潮的巅峰&#xff0c;Vatee万腾如一艘科技探险的航船&#xff0c;勇敢地驶向未知的数字化征程。 Vatee万腾在数字探险的过程中展现出征服未知领域的坚定决心。他们不满足于现状&#xff0c;而是积极地寻找和探索那些尚未被揭示的数字化领域。这种决心使得Vatee能够在科…