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

目录

一、介绍

二、仿射变换矩阵 (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 的原理就介绍到这里,关注不迷路(#^.^#)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S(一)

一、kubernetes 概述 1、kubernetes 基本介绍 kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效…

数据保密新标杆:迅软DSE企业防泄密系统为企业安全保驾护航

由于目前数据安全防护边界越来越大,企业面临的内部安全风险正在快速增长;企业内部安全防护体系和管理制度一旦有所缺失,就会造成严重的数据泄露安全事故。面对互联网泄密事件层出不穷,企业管理者们对于企业数据安全管理如何落实到…

教你怎样查询现货黄金的历史价格

现货黄金投资者可以在日常使用的软件MT4在的终端窗口中,查询金价的历史数据和动态的价格行情,甚至可以把这些导出,作为日后的深入分析之用,我们将通过本文和大家分享MT4导出这些数据的具体方法。 具体操作: 在MT4交易…

C++ 调用 Lua 函数

零、前言 Lua 作为一门脚本语言,可以作为 “配置文件”、“动态逻辑脚本” 等角色作用于宿主程序。 因为他是一门语言,所以他有以下的好处: 1. Lua 会处理语法细节,后续维护简单,并且可以有注释。 2. 可以编写逻辑&…

python之代理ip的配置与调试

目录 前言 一、代理IP的配置 二、代理IP的调试 2.1 使用curl命令测试代理IP 2.2 使用requests库调试代理IP 三、代理IP的获取 3.1 使用代理IP池 3.2 使用付费代理IP服务 总结 前言 代理IP是网络爬虫中常用的技术手段。通过使用代理服务器,可以实现对特定网…

内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…

【Linux】22、CPU 评价指标、性能工具、定位瓶颈、优化方法论:应用程序和系统

文章目录 一、评价 CPU 的指标1.1 CPU 使用率1.2 平均负载(Load Average)1.3 上下文切换1.4 CPU 缓存命中率 二、性能工具2.1 维度:从 CPU 性能指标出发,即当你查看某性能指标时,要清除知道哪些工具可以做到2.2 维度&a…

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

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

【活动通知】2023 Elastic Meetup 北京站将于12月2日下午1点30在北京召开

《2023 Elastic Meetup 北京站》活动将于 12 月 2 日下午 1 点 30 在北京市海淀区西北旺东路10号腾讯北京总部大楼213会议室举办,届时将有行业专家及知名企业分享他们在 Elasticsearch 应用中的经验与观点,带来最前沿的技术分享与思想碰撞。 请使用电脑浏…

vulnhub靶机Presidential

靶机地址:https://download.vulnhub.com/presidential/Presidential.ova 主机发现 arp-scan -l 端口扫描 nmap --min-rate 10000 192.168.21.150 端口服务扫描 nmap -sV -sT -O -p80 192.168.21.150 漏洞扫描 nmap --scriptvuln -p80 192.168.21.150 只有一个端…

车辆限迁查询API——查询您的车辆是否限制迁入迁出

随着城市的快速发展和人们生活水平的提高,车辆的使用量也不断增加。而随之而来的问题也愈发突出,其中之一就是车辆的限迁问题。 比如,在一些大城市,为了减少交通拥堵和空气污染,政府采取了限制车辆迁入迁出的措施&…

CleanMyMac X4.16免费版mac电脑一键清理电脑垃圾工具

但是,我最近发现随着使用时间的增加,一些奇奇怪怪的文件开始占据有限的磁盘空间,存储空间变得越来越小,系统占用空间越来越大,越来越多的无效文件开始影响我电脑的运行速度。 Mac的文件管理方式和Windows不太一样&…

初级程序员如何进阶

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 疑问的无限递归 我刚入…

比赛调研资料

视觉文旅 现有的模型 数据 功能 精准营销 基于地理推荐能力 乡村圈分析能力 都市圈分析能力 产品体系 三大数据平台 携程问道 旅游服务框架:前置(推荐种草),途中(客服),售后&#xff0…

多目标应用:基于多目标灰狼优化算法MOGWO求解微电网多目标优化调度(MATLAB代码)

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标灰狼优化算法MOGWO 多目标灰狼优化算法MOGWO简介: 三、多目标灰狼优化算法MOGWO求解微电网多目标优化调度 (1&#xff09…

英飞凌TC3xx的LMU SRAM保护机制(二)

目录 1.SRAM保护配置使能 2.测试结果分析 3.小结 我们接着上文继续来梳理如何配置LMU的保护机制 英飞凌TC3xx的LMU SRAM保护机制(一)-CSDN博客 1.SRAM保护配置使能 简单举两个例子,地址下限寄存器如下: 可以看到使用SRI地址的bit31-5用于作为边界&am…

Linux下安装两个版本python

1 python下载: 官网地址:Download Python | Python.org 第一:点击下载如下图: 第二:找到对应的python版本源码包: 点击右键复制下载地址,如下图 例如我的是:https://www.python.org/…

网络运维与网络安全 学习笔记2023.11.20

网络运维与网络安全 学习笔记 第二十一天 今日目标 交换网路径选择、Eth-Trunk原理、动态Eth-Trunk配置 Eth-Trunk案例实践、MUX VLAN原理、MUX VLAN配置 交换网路径选择 STP的作用 在交换网络中提供冗余/备份路径 提供冗余路径的同时,防止环路的产生 影响同网…

越南MIC新规针对ICT和ITE产品电气授权标准变更

从2024年1月1日起,所有ICT和ITE产品(如台式电脑、笔记本电脑、平板电脑、DVB-T2电视/机顶盒、DECT电话等)都需要越南MIC授权的电气安全标准——QCVN132:2022。 目前MIC仍未最终确定要求,因为这与另一个监管机构存在冲突。所以目前他们可以接受ISO 17025的…

电磁场与电磁波part6、7--均匀平面波的反射与透射、导行电磁波

1、分界面上的反射系数 反射波电场振幅 与入射波电场振幅 的比值,即: 2、驻波系数(驻波比) 合成波的电场强度的最大值与最小值之比,即: 3、导波系统中电磁波的传输问题属于电磁场边值问题,即…