【OpenCV】仿射变换中cv2.estimateAffine2D 的原理

news2024/11/25 4:46:06

目录

一、介绍

二、仿射变换矩阵 (M)

1.M中六个元素的说明

2.计算旋转角度

3.M的计算过程

三、输出状态 (inliers)

四、错切参数

1.错切参数的定义

2.错切参数例子

(1)水平错切

(2)垂直错切


一、介绍

        cv2.estimateAffine2D 是 OpenCV 库中的一个函数,用于估计两个二维点集之间的仿射变换矩阵。即第一个点集经仿射变换转换到第二个点集需要的操作,包括缩放、旋转和平移。

        先来看代码:

import cv2
import numpy as np

# 原始点集
srcPoints = np.array([[50, 50], [200, 50], [50, 200]], dtype=np.float32)
# 目标点集
dstPoints = np.array([[70, 100], [220, 70], [150, 250]], dtype=np.float32)

# 估计仿射变换矩阵
M, inliers = cv2.estimateAffine2D(srcPoints, dstPoints)

# 打印估计得到的仿射变换矩阵
print('M:\n', M)
'''
M:
[[ 1.          0.53333333 -6.66666667]
 [-0.2         1.         60.        ]]
'''

print('inliers:\n', inliers)
'''
inliers:
 [[1]
 [1]
 [1]]
'''

        从上面的代码中可以看到,函数的输入是两个参数,分别表示原始点集和目标点集。函数的输出参数包括两个部分:仿射变换矩阵和输出状态。

二、仿射变换矩阵 (M)

        第一个返回值是一个 2x3 的浮点型矩阵,表示从原始点集到目标点集的仿射变换。矩阵的前两列是旋转和缩放的部分,最后一列是平移的部分。可以使用这个矩阵来将原始图像或点集进行仿射变换,使其与目标图像或点集对齐。

1.M中六个元素的说明

        M[0,0]:表示x方向上的缩放。大于 1,则表示进行了放大操作;小于 1,则表示进行了缩小操作;等于 1,则表示没有进行缩放操作。

        M[0,1]:表示垂直错切参数,与M[1,0]一起用于计算旋转角度。

        M[0,2]:表示x方向上的平移。

        M[1,0]:表示水平错切参数,与M[1,1]一起用于计算旋转角度。

        M[1,1]:表示y方向上的缩放。大于 1,则表示进行了放大操作;小于 1,则表示进行了缩小操作;等于 1,则表示没有进行缩放操作。

        M[1,2]:表示y方向上的平移。

2.计算旋转角度

        旋转角度的计算公式:

angle = atan2(M[1, 0], M[0, 0])

        其中,atan2 是一个反三角函数,用于计算给定的 y 值和 x 值的反正切值。这个角度表示原始点集经过变换后的旋转角度。

代码如下,np.arctan2返回的是弧度值,如果需要角度值还需要再转换一下:

# 得到弧度值
da = np.arctan2(m[1, 0], m[0, 0])
# 得到角度值
theta_deg = np.degrees(da)

3.M的计算过程

        1. 首先,根据输入的原始点集 srcPoints 和目标点集 dstPoints,构建一个线性方程系统。对于每个点对 (srcPoint, dstPoint),构建以下两个方程:

\left\{\begin{matrix} dstPoint.x = M[0, 0] * srcPoint.x + M[0, 1] * srcPoint.y + M[0, 2] \\ dstPoint.y = M[1, 0] * srcPoint.x + M[1, 1] * srcPoint.y + M[1, 2] \end{matrix}\right.

        2. 将线性方程系统转化为矩阵形式 A * X = B,其中:

        A 是一个 2N x 6 的矩阵,其中 N 是点对的数量。A 的每一行对应一个点对,包含原始点的坐标和一个常数项。

        X 是一个 6 x 1 的矩阵,表示待求解的仿射变换矩阵的参数。

        B 是一个 2N x 1 的矩阵,包含目标点的坐标。

        3. 使用最小二乘法来求解矩阵 X,使得 A * X 尽可能接近 B。最小二乘法的目标是最小化残差的平方和。

        4. 根据求解得到的矩阵 X,构建估计的仿射变换矩阵 M:

\begin{matrix} \\ M[0, 0] = X[0] \\ M[0, 1] = X[1] \\ M[0, 2] = X[2] \\ M[1, 0] = X[3] \\ M[1, 1] = X[4] \\ M[1, 2] = X[5] \end{matrix}

        最小二乘法的目标是找到一个最优的仿射变换矩阵,使得原始点集经过变换后与目标点集尽可能接近。通过最小化残差的平方和,可以得到一个最优的估计结果。

        需要注意的是,由于存在噪声和异常值的影响,估计的仿射变换矩阵可能不是完全准确的。因此,输出的仿射变换矩阵 M 可能只是一个近似的估计结果,需要根据实际情况进行评估和调整。

三、输出状态 (inliers)

        inliers是一个整数或浮点数的向量,表示每个输入点对应的输出点是否被认为是内点(inlier)。内点是指在估计仿射变换时被认为是一致的点。输出状态的长度与输入点集的数量相同,每个元素的值为 0 或 1,其中 1 表示对应的点是内点,0 表示对应的点是外点(outlier)。

        cv2.estimateAffine2D确定内点(inliers)的算法有三个可选:

        cv2.RANSAC: 使用 RANSAC 算法进行估计。该选项适用于存在较多离群点的情况,可以提高估计的鲁棒性,这也是默认参数。
        cv2.LMEDS: 使用最小中值估计(Least-Median Estimation,LMedS)算法进行估计。该选项适用于存在少量离群点的情况,可以提高估计的准确性。
        cv2.RHO: 使用 RHO 算法进行估计。该选项适用于存在较多离群点的情况,可以提高估计的鲁棒性。

        可以通过下面的方式修改内点检测方式:

M, inliers = cv2.estimateAffine2D(srcPoints, dstPoints, cv2.RHO)

四、错切参数

1.错切参数的定义

        上面提到了一个名词叫错切参数,这里解释一下。错切参数(Shear parameters)是一种用于描述错切变换的数值参数。在二维图形变换中,错切变换是一种线性变换,它通过改变图形的形状来实现。

        在二维平面上,错切变换是一种将对象沿着水平或垂直方向进行平移和拉伸的变换。它会改变对象的形状,使其在一个方向上相对于另一个方向发生倾斜。

        在错切变换中,有两个主要的错切参数:水平错切参数(shear parameter)和垂直错切参数(shear parameter)。这些参数决定了在水平和垂直方向上的错切程度。
        水平错切参数(shx):它表示在水平方向上的错切程度。当 shx 的值为正时,图形在水平方向上向右上方倾斜;当 shx 的值为负时,图形在水平方向上向左上方倾斜;当 shx 的值为零时,表示没有水平方向上的错切变换。

        垂直错切参数(shy):它表示在垂直方向上的错切程度。当 shy 的值为正时,图形在垂直方向上向右下方倾斜;当 shy 的值为负时,图形在垂直方向上向左下方倾斜;当 shy 的值为零时,表示没有垂直方向上的错切变换。

        这些错切参数可以通过仿射变换矩阵中的相应元素来表示。在二维仿射变换矩阵中,水平错切参数通常对应于矩阵的第一行第二列元素(M[0, 1]),而垂直错切参数通常对应于矩阵的第二行第一列元素(M[1, 0])。

2.错切参数例子

        以下是一个示例,说明如何使用错切参数对对象进行变形:

(1)水平错切

        水平错切就是原图每个像素的y不变,x根据M[0,1]进行线性变换。

        假设有一个矩形对象,原始的顶点坐标为 (x1, y1), (x2, y2), (x3, y3), (x4, y4)。要对该矩形进行水平方向的错切变形,可以使用错切参数 shx,并将每个顶点的 x 坐标按照如下方式进行变换:

        \begin{matrix} \\ x_1{new} = x_{1} + shx * y_1 \\ x_2{new} = x_{2} + shx * y_2 \\ x_3{new} = x_3 + shx * y_3 \\ x_4{new} = x_4 + shx * y_4 \end{matrix}

        这样,通过调整 shx 的值,可以控制矩形在水平方向上的错切程度。

        下面是水平错切的代码和结果:

import cv2
import numpy as np

img_path = r'data/005.jpg'
target_path = r'data/005_1.jpg'
scale = 0.2 # 变换的比例
img = cv2.imread(img_path)
# 构造错切变换矩阵
M = np.float32([[1, 0.2, 0], [0, 1, 0]])
h, w, _ = img.shape
img_shear = cv2.warpAffine(img, M, (w + int(scale * w), h))
cv2.imwrite(target_path, img_shear)

(2)垂直错切

        垂直错切就是原图每个像素的x不变,y根据M[1,0]进行线性变换。

        要对矩形进行垂直方向的错切变形,可以使用错切参数 shy,并将每个顶点的 y 坐标按照如下方式进行变换:

\begin{matrix} \\ x_1{new} = shx * x_{1} + y_1 \\ x_2{new} = shx * x_{2} + y_2 \\ x_3{new} = shx * x_3 + y_3 \\ x_4{new} = shx * x_4 + y_4 \end{matrix}

        通过调整 shy 的值,可以控制矩形在垂直方向上的错切程度。

        下面是垂直错切的代码和结果:

import cv2
import numpy as np


img_path = r'data/005.jpg'
target_path = r'data/005_2.jpg'
scale = 0.2 # 变换的比例
img = cv2.imread(img_path)
# 构造错切变换矩阵
M = np.float32([[1, 0, 0], [0.2, 1, 0]])
h, w, _ = img.shape
img_shear = cv2.warpAffine(img, M, (w, h + int(scale * h)))
cv2.imwrite(target_path, img_shear)



        需要注意的是,错切参数的值可以是正数、负数或零,具体取决于所需的错切方向和程度。

        cv2.estimateAffine2D 的原理就介绍到这里,关注不迷路(#^.^#)

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

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

相关文章

开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势未来发展方向

开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势&未来发展方向 写在最前面一、开源与闭源:定义与历史背景开源和闭源的定义开源大模型:社区驱动的创新 二、开源和闭源的优劣势比较开源大模型(瓶颈)数据&…

windows中运行项目中.sh和kaggle安装与配置

在git bash中运行 命令如下: bash download_data.sh 或者 ./download_data.sh如果使用kaggle的数据集,会要求输入用户名和API。 API在这个文件里面,复制过来即可。 安装kaggle pip install kaggle去kaggle官网,点击这里&…

MES集成 | 集成标准不统一?看得帆云iPaaS怎么应对

得帆信息结合自身丰富实施经验及众多实践案例,编写了《得帆云 AIGC低代码PaaS平台系列白皮书——MES集成应用》,希望能为正在使用MES产品的企业数字化转型领导者和IT人员带来一些帮助。 MES是众多大型生产制造型企业在做生产执行管理时会实施的一套系统。…

监控电脑的软件叫什么丨科普小知识

监控电脑的软件叫电脑监控软件。 电脑监控软件是一种可以监控电脑使用情况的软件,通常具有记录屏幕活动、网站访问、聊天记录等功能。 应用场景 1、企业内部管理:企业管理者可以通过监控电脑软件来监视员工的工作活动,以确保员工遵守公司政…

2023年电子工程师大会暨第三届社区年度颁奖活动--【其利天下技术】

华秋电子发烧友将于2023年11月23日在深圳举办一场盛大的技术交流活动,即“2023年电子工程师大会暨第三届社区年度颁奖活动”。本次活动邀请了各大高校教授、企业高管、行业专家和电子工程师们齐聚一堂,围绕“开源硬件”、“OpenHarmony RISC-V”、“工程…

.NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !背景介绍 突然闯到路径搜索算法里…

接口测试基础与接口测试用例设计思路详解

接口测试简介 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的&#x…

Redis7--基础篇3(持久化)

持久化介绍 官网地址: https://redis.io/docs/manual/persistence RDB(Redis DataBase)AOF(Append Only File)RDB AOF RDB模式(Redis DataBase) RDB 持久性以指定的时间间隔执行数据集的时间点快照。 实现类似照片记录效果的方式,就是把某一时刻的数据…

Blender烘焙AO操作及对应的python代码

(一)Blender软件操作 1. 导入模型(这里省略) 2. 材质设置 模型使用的所有材质都需要删除Surface Shader,没有其他多余的计算,可以大量缩短烘焙时间。删除之后的只留下一个材质输出节点,如图所…

ubuntu从源码编译gdal

删除旧版本 sudo apt remove libgdal* sudo apt remove gdal* sudo apt autoremove下载proj和gdal https://github.com/OSGeo/PROJ/releases 这里使用的是9.3.0版本: https://github.com/OSGeo/gdal/releases 这里使用的是3.7.3版本: 编译 安装…

C#中.NET 7.0 Windows窗体应用通过EF访问已有数据库并实现追加、删除、修改、插入记录

目录 一、前言 1.Database.ExecuteSqlCommand 方法不被EF7.0支持 2.SET IDENTITY_INSERT Blog {ON,OFF}不起作用 3.主键和标识列分离,成功实现插入与修改 二、新建本文涉及的项目 三、程序设计 1.Form1.cs源码 2.Form1.cs[设计] 四、生成和测试 1.原始表 …

【论文阅读】SPARK:针对视觉跟踪的空间感知在线增量攻击

SPARK: Spatial-Aware Online Incremental Attack Against Visual Tracking introduction 在本文中,我们确定了视觉跟踪对抗性攻击的一个新任务:在线生成难以察觉的扰动,误导跟踪器沿着不正确的(无目标攻击,UA&#x…

删除 word 中嵌入文字下方的图片

问题:Word中插入图片,选择图片格式【衬于文字下方】后,无法选择图片并删除。 解决方法: 如图所示,选择 【开始】-【编辑】-【选择】-【选择对象】,然后鼠标放在图片位置即可选中图片进行删除操作。

React中StrictMode严格模式,导致开发环境,接口会请求两次或多次( useEffect 请求多次)

问题描述: 我在用 create-react-app时,开发环境,一进页面接口会请求两次或多次。 我在首页 useEffect里 请求一个接口,整个页面就在这里请求这一次接口。但 实际上请求了两次。我检查了代码,确定只调用了一次&#xf…

算法进阶——链表中环的入口节点

题目 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a;1<结点值<10000 要求&#xff1a;空间复杂度O(1)&#xff0c;时间复杂度O(n) 例如&#xff0c;输入{1,2},{3,4,5…

【文末送书】计算机网络 | IO多路转接技术 | poll/epoll详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

麒麟KYLINOS2303系统上禁用新功能介绍页面

原文链接&#xff1a;麒麟KYLINOS2303系统上禁用新功能介绍页面 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在麒麟KYLINOS2303系统上禁用新功能介绍页面的文章&#xff0c;在我们安装完系统登录后&#xff0c;会发现有新功能介绍这个界面&#xff0c;我们可以通…

OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建

目录 一、OpenCV 二、OpenCvSharp 三、OpenCvSharp开发环境搭建 四、下载 五、其他 一、OpenCV OpenCV是基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习函数库&#xff0c;支持Windows、Linux、Android和Mac OS操作系统。OpenCV由一系…

人工智能靠自学就行?

随着人工智能技术的飞速发展&#xff0c;这个领域的知识和技术对于很多人来说都充满了神秘和吸引力。很多人都想要学习人工智能&#xff0c;但是又不知道如何入手&#xff0c;是否需要参加培训机构或者跟着导师学习呢&#xff1f;今天&#xff0c;我想和大家分享一些关于自学人…

全流量分析应用运行和访问情况

在当今数字化时代&#xff0c;应用程序的运行和访问情况对于企业和组织来说至关重要。无论是在线销售平台、移动应用还是企业内部系统&#xff0c;应用的性能和可用性直接影响着用户体验、业务流程以及组织效率。因此&#xff0c;对应用的运行和访问情况进行全面分析和评估&…