当前位置: 首页 > news >正文

OpenCV||超详细的几何变换

2D图像几何变换的3×3矩阵:

图像常见的几何变换:

 图像来源:《OpenCV 4.5计算机视觉开发实战:基于Python》作者:朱文伟 李建英;

1. 平移(Translation)

在OpenCV中,平移不是直接通过一个函数完成的,而是先通过创建一个平移矩阵,然后使用warpAffine函数应用这个矩阵。

cv2.getTranslationMatrix2D(center, offset, scale)

  • center:源图像中的变换中心。
  • offset:沿x和y方向移动的距离。
  • scale:通常设置为1.0,因为平移不涉及缩放。

返回的矩阵然后传递给warpAffine函数进行实际的平移操作。

2. 旋转(Rotation)

cv2.getRotationMatrix2D(center, angle, scale)

  • center:旋转中心。
  • angle:旋转角度,以度为单位。正值表示逆时针旋转。
  • scale:图像缩放比例。

这个函数返回一个2x3的旋转矩阵,该矩阵可以传递给warpAffine进行图像的旋转。

图像旋转后显示完整图像示例代码

import cv2  
import numpy as np  def rotate_image(image, angle):  # 获取图像尺寸  (h, w) = image.shape[:2]  # 计算图像中心  center = (w // 2, h // 2)  # 获取旋转矩阵(注意角度需要转换为弧度)  M = cv2.getRotationMatrix2D(center, angle, 1.0)  # 计算旋转后图像的边界框  cos = np.abs(M[0, 0])  sin = np.abs(M[0, 1])  nW = int((h * sin) + (w * cos))  nH = int((h * cos) + (w * sin))  # 调整旋转矩阵以考虑平移  M[0, 2] += (nW / 2) - center[0]  M[1, 2] += (nH / 2) - center[1]  # 执行旋转  rotated = cv2.warpAffine(image, M, (nW, nH))  return rotated  # 读取图像  
image = cv2.imread('your_image.jpg')  # 旋转图像,例如旋转45度  
rotated_image = rotate_image(image, 45)  # 显示原始和旋转后的图像  
cv2.imshow("Original Image", image)  
cv2.imshow("Rotated Image", rotated_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

3. 缩放(Resizing)

缩放通常使用resize函数,而不是通过几何变换矩阵。

cv2.resize(src, dsize, fx=0, fy=0, interpolation=cv2.INTER_LINEAR)

  • src:输入图像。
  • dsize:输出图像的大小。这是一个宽度和高度的元组。如果它是零,则通过fxfy计算大小。
  • fxfy:沿x轴和y轴的缩放比例。
  • interpolation:插值方法,用于确定如何计算输出图像中的像素值。

4. 仿射变换(Affine Transformation)

仿射变换是一个更一般的变换,包括旋转、平移、缩放和倾斜。

cv2.warpAffine(src, M, dsize, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

  • src:输入图像。
  • M:2x3的变换矩阵。
  • dsize:输出图像的大小。
  • flags:插值方法。
  • borderMode:边界像素模式。
  • borderValue:当borderMode=cv2.BORDER_CONSTANT时,边界像素的值。

5. 透视变换(Perspective Transformation)

透视变换用于从一个视角转换到另一个视角,需要一个3x3的变换矩阵。

cv2.warpPerspective(src, M, dsize, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

  • 参数与warpAffine相似,但M是一个3x3的透视变换矩阵。

6 图像金字塔(Image Pyramid)

在Python的OpenCV库中,图像金字塔(Image Pyramid)是一种用于图像多尺度表达的有效结构,主要用于图像特征检测、图像分割和图像压缩等领域。图像金字塔通过逐步减小图像的分辨率来创建一系列图像,这些图像以金字塔形状排列,层级越高,图像越小,分辨率越低。

OpenCV提供了两个主要的函数来实现图像金字塔的构建:cv2.pyrDown()cv2.pyrUp()

1. cv2.pyrDown(src[, dst[, dstsize[, borderType]]])

功能:对图像进行下采样(缩小),生成图像金字塔的下一层。

参数解释

  • src:输入图像,即当前层的图像。
  • dst:输出图像,即下采样后的图像。这是一个可选参数,如果提供,则输出图像会存储在这里。
  • dstsize:输出图像的大小。如果此参数为0(默认值),则输出图像的尺寸将是输入图像尺寸的一半(宽度和高度都减半)。
  • borderType:边界像素的插值方法。在大多数情况下,使用默认值cv2.BORDER_DEFAULT即可。

返回值:下采样后的图像。如果提供了dst参数,则函数返回None;否则,返回下采样后的图像。

2. cv2.pyrUp(src[, dst[, dstsize[, borderType]]])

功能:对图像进行上采样(放大),尝试从图像金字塔的下一层重建当前层。但需要注意的是,上采样并不是下采样的完全逆操作,因为上采样过程中会丢失一些信息,导致重建的图像比原始图像模糊。

参数解释

  • src:输入图像,即金字塔下一层的图像。
  • dst:输出图像,即上采样后的图像。这是一个可选参数,如果提供,则输出图像会存储在这里。
  • dstsize:输出图像的大小。如果此参数为0(默认值),则输出图像的尺寸将是输入图像尺寸的两倍(宽度和高度都加倍)。但通常建议明确指定dstsize,以匹配原始图像的尺寸或所需的尺寸。
  • borderType:边界像素的插值方法。在大多数情况下,使用默认值cv2.BORDER_DEFAULT即可。

返回值:上采样后的图像。如果提供了dst参数,则函数返回None;否则,返回上采样后的图像。

7 图像翻转(Flipping) 

cv2.flip(src, flipCode)
  • src:输入图像,即你想要翻转的图像。
  • flipCode:指定翻转方向的标志。它是一个整数,决定了图像翻转的方式。
    • flipCode为0时,表示沿x轴翻转(即上下翻转),实际上这并不会改变图像,因为x轴是水平的,而翻转通常是相对于垂直轴(y轴)或水平轴(但在这里不适用,因为x轴翻转在视觉上没有效果,除非你改变了坐标系统的解释)。但这里通常理解为参数设置错误或不适用于此上下文。
    • flipCode > 0时(通常是1),表示沿y轴翻转(即左右翻转)。
    • flipCode < 0时(通常是-1),表示沿x轴和y轴同时翻转(即上下左右翻转,相当于180度旋转)。
import cv2  # 读取图像  
img = cv2.imread('your_image_path.jpg')  # 左右翻转图像  
flipped_img_lr = cv2.flip(img, 1)  # 上下左右翻转图像(180度旋转)  
flipped_img_udlr = cv2.flip(img, -1)  # 显示原图和翻转后的图像  
cv2.imshow('Original Image', img)  
cv2.imshow('Flipped Left-Right', flipped_img_lr)  
cv2.imshow('Flipped Up-Down and Left-Right', flipped_img_udlr)  cv2.waitKey(0)  
cv2.destroyAllWindows()

8 极坐标变换(Polar Transformation)

极坐标变换通常需要将图像的笛卡尔坐标(x, y)转换为极坐标(ρ, θ)。在OpenCV中,没有直接的函数来完成这个转换,但你可以通过以下步骤实现:

  1. 计算每个像素的极坐标:这通常涉及到遍历图像的每个像素,并计算其对应的ρ和θ值。

  2. 重新映射到极坐标网格:由于极坐标网格在ρ=0附近是密集的,而在ρ较大时变得稀疏,因此你可能需要创建一个新的图像,其大小取决于你想要的ρ和θ的分辨率。

  3. 插值:将原图像中的像素值映射到新的极坐标网格时,可能需要进行插值,因为源像素和目标像素之间可能不会一一对应。

由于这个过程比较复杂,且OpenCV没有直接提供这样的函数,因此通常需要自己编写代码来实现。

9 逆极坐标变换(Inverse Polar Transformation)

逆极坐标变换是极坐标变换的逆过程,即将极坐标(ρ, θ)转换回笛卡尔坐标(x, y)。同样,OpenCV没有直接的函数来完成这个转换,但你可以通过以下步骤来近似实现:

  1. 确定目标图像的大小:这取决于你想要的输出图像的分辨率。

  2. 计算每个目标像素的笛卡尔坐标:这通常是通过遍历目标图像的每个像素,并将其(x, y)坐标计算出来。

  3. 转换到极坐标:将(x, y)坐标转换为(ρ, θ),以便你可以从原始极坐标图像中检索对应的像素值。

  4. 插值:由于极坐标和笛卡尔坐标之间的映射可能不是一一对应的,因此你可能需要使用插值方法来获取最终的像素值。

链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节三、OpenCV||超详细的图像处理模块

章节四、OpenCV||超详细的灰度变换和直方图修正

章节五、OpenCV||超详细的图像平滑

相关文章:

OpenCV||超详细的几何变换

2D图像几何变换的33矩阵&#xff1a; 图像常见的几何变换&#xff1a; 图像来源&#xff1a;《OpenCV 4.5计算机视觉开发实战&#xff1a;基于Python》作者&#xff1a;朱文伟 李建英&#xff1b; 1. 平移&#xff08;Translation&#xff09; 在OpenCV中&#xff0c;平移不是…...

网络程序设计基础概述

文章目录 前言一、网络程序设计基础二、网络协议 1.IP协议2.TCP与UDP协议三、端口与套接字总结 前言 网络程序设计编写的是与其他计算机进行通信的程序代码。Java将网络程序所需要的东西封装成了不同的类。开发者只需要创建这些类的对象&#xff0c;调用相应的方法&#xff0c;…...

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中&#xff0c;数据库用户&#xff08;USER&#xff09;是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码&#xff0c;以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库&#xff0c;在其中执行各种类…...

用TensorFlow训练自己的第一个模型

现在学AI的一个优势就是&#xff1a;前人栽树后人乘凉&#xff0c;很多资料都已完善&#xff0c;而且有很多很棒的开源作品可以学习&#xff0c;感谢大佬们 项目 项目源码地址 视频教程地址 我在大佬的基础上基于此模型还加上了根据特征值缓存进行快速识别的方法&#xff0c;…...

MySQL数据库入门基础知识 【1】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。 首先数据有两种&#xff0c;一种是关系型数据库&#xff0c;另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据&#xff0c;表和表之间可以有很多复杂的关系&a…...

Anaconda下的 jupyter notebook安装及使用

安装 打开Anaconda Powershell Prompt或Anconda Prompt 输入命令conda install jupyter notebook进行安装 启动 切换到工作目录&#xff0c;输入命令jupyter notebook等待浏览器打开网页 命令行启动jupyter notebook的链接复制到浏览器同样可以打开jupyter notebook 在Ancon…...

C语言初阶(11)

1.结构体定义 结构体就是一群数据类型的集合体。这些数据类型被称为成员变量。结构的成员可以是标量、数组、指针&#xff0c;甚至是其他结构体。 2.结构体的声明和结构体变量命名与初始化 结构体声明由以下结构组成 struct stu {char name[12];int age; }; 结构体命名有两…...

Unity获取Animator动画播放完成事件

整理了一些在日常经验中处理动画播放完成事件的方法 方法: 1.Dotween配合异步实现 2.状态机计时方法实现 3.原生动画行为方法实现 方法一&#xff1a;Dotween异步方法 using UnityEngine; using System.Threading.Tasks; using DG.Tweening;public class PlayerAnimAsync : M…...

git submodule 使用

在Git中&#xff0c;子模块&#xff08;submodule&#xff09;是一种将一个Git仓库作为另一个Git仓库的子目录嵌入的方式。这使得主仓库能够跟踪和管理对外部依赖的更改。 添加子模块 初始化父仓库&#xff1a;如果你还没有创建父仓库&#xff0c;先创建它。 添加子模块&…...

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令&#xff0c;攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务&#xff0c;通过脚本执行界面从而获取服务器权限。 第一步&#xff1a;使用fofa语句搜索 搜索语句&#xff1a; port&…...

前端处理 Excel 文件

引入XLSX XLSX 是一个流行的 JavaScript 库&#xff0c;用于处理 Excel 文件&#xff08;包括 .xls 和 .xlsx 格式&#xff09;。它可以在 Node.js 环境和浏览器中运行&#xff0c;提供了丰富的 API 来读取、写入、修改 Excel 文件。当你使用 import * as XLSX from xlsx; 这行…...

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束 需求&#xff1a;按勾选的顺序给后端传值 难点&#xff1a;在 Element UI 的 el-cascader 组件中&#xff0c;默认的行为是根据数据的层级结构来显示选项&#xff0c;用户的选择也会基于这种层级结构&#xff0c;el-…...

Redis进阶(四):哨兵

为了解决主节点故障&#xff0c;需要人工操作切换主从的情况&#xff1b;因此需要一种方法可以自动化的切换&#xff1a;哨兵的引入大大改变这种情况。 哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候&#xff0c;还需要其他节点也去检测一…...

蓝屏事件:网络安全的启示

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技…...

技术方案评审原则

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言技术方案评审原则1.理论突破阶段2.技术突破阶段3.工程化阶段自动驾驶行业的技术方案分析前言 认知有限,望大家多多包涵,有什么问题也希望能够与大…...

117页PPT埃森哲-物流行业信息化整体规划方案

一、埃森哲-物流行业信息化整体规划方案 资料下载方式&#xff0c;请看每张图片右下角信息 埃森哲在物流行业信息化整体规划项目中的核心内容&#xff0c;旨在帮助物流企业通过信息技术的应用实现业务流程的优化、运营效率的提升以及市场竞争力的增强。以下是埃森哲在此类项目…...

百度网盘不下载怎么直接打印文件?

在数字化时代&#xff0c;百度网盘作为我们存储和分享文件的重要工具&#xff0c;承载了大量的文档、图片和资料。然而&#xff0c;当需要打印这些文件时&#xff0c;很多用户会面临一个共同的问题&#xff1a;不想下载到本地再打印&#xff0c;既占用空间又浪费时间。那么&…...

设置了 robots.txt 禁止爬虫抓取,为什么还是能被百度搜索出来

虽然设置了 robots.txt 禁止爬虫抓取&#xff0c;但网页仍可能被百度搜索出来&#xff0c;主要有以下几个原因&#xff1a; robots.txt 只是一种建议性协议&#xff0c;并非强制性[2]。虽然大多数搜索引擎会遵守 robots.txt 的规则&#xff0c;但并不是所有爬虫都会严格遵守。 …...

DedeCMS-V5.7.82-UTF8织梦管理系统漏洞

将靶场环境放到www目录下——访问/dedecms/uploads 安装程序 - 织梦内容管理系统 V5.7 UTF8SP2 同意协议——继续 继续 配置后——点击继续 进入后台 登录后台——填写用户名密码。 方法一&#xff1a;上传shell文件 后台——核心——附件管理——上传新文件。 访问/dedecms…...

【Python】字符串练习题及代码示例

1、使用while循环实现对字符串中每个字符进行输出。 代码示例&#xff1a; 2、请将代码实现如下进制的转换。 &#xff08;1&#xff09;v1675,请将v1转换为二进制。 代码&#xff1a; 注意&#xff1a;将十进制数转换为二进制数的方法是&#xff1a;bin(a),a是整型&#x…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...