第五章 Opencv图像的几何变换

news2024/9/26 5:23:02

目录

    • 1.缩放图像
      • 1-1.resize()方法
    • 2.翻转图像
      • 2-1.flip()方法
    • 3.仿射变换图像
      • 3-1.warpAffine()方法
      • 3-2.平移
      • 3-3.旋转
      • 3-4.倾斜
    • 4.透视图像
      • 4-1.warpPerspective()方法

几何变换是指改变图像的几何结构,例如大小、角度和形状等,从而使图像呈现出缩放翻转仿射透视效果。

1.缩放图像

1-1.resize()方法

  • 语法格式:dst = cv2.resize(src, dsize, fx, fy, interpolation)

  • 参数说明:

    • src:原始图像;数组类型。

    • dsize:输出的图像的大小,格式为(宽W,高H),单位为像素;元组类型。

    • fx:可选参数;水平方向的缩放比例。

    • fy:可选参数;垂直方向的缩放比例。

    • interpolation:可选参数;缩放的插值方式。在图像缩小或放大时需要删减或填补像素,该参数可以指定使用哪种算法对像素进行增减;建议使用默认值。

    • dst:输出图像;数组类型。

      注:

      1.resize()方法有两种使用方式,一种是通过dsize参数缩放,另一种是通过fx和fy参数缩放;其中,dsize优先级比fx、fy高。

      2.dsize参数是(宽W,高H)格式,而图像的shape属性是(高H,宽W)格式。

  • 实例:

    在这里插入图片描述

    实例解释:

    1.由dst1和dst2可知dsize优先级比fx、fy高;以及打印的高宽可知dsize参数格式与shape属性格式相反。

2.翻转图像

2-1.flip()方法

  • 语法格式:dst = cv2.flip(src, flipCode)

  • 参数说明:

    • src:原始图像;数组类型。

    • flipCode:翻转类型。0:X轴翻转;正数:Y轴翻转;负数:先X后Y或者说先Y后X。

    • dst:输出图像;数组类型。

  • 实例:

    在这里插入图片描述

3.仿射变换图像

图像的仿射变换是一种仅在二维平面中进行的几何变形,变换后的图像依然保持直线的“平直性”“平行性”,即原来是直线的变换后依然是直线,原来是平行线的变换后依然是平行线。常见的仿射变换包括:平移、旋转和倾斜。

3-1.warpAffine()方法

  • 语法格式:dst = cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)

  • 参数说明:

    • src:原始图像;数组类型。
    • M:仿射矩阵(是一个2行3列的矩阵);32位浮点数类型,仿射变换核心就是通过该矩阵进行变换的
    • dsize:输出图像的大小;单位是像素,默认是原图大小。
    • flags:插值方式;可选参数,建议默认值。
    • boderMode:边界类型;可选参数,建议默认值。
    • boderValue:边界值;可选参数,默认为0用黑色填充,建议默认值。
    • dst:输出图像;数组类型。
  • 实例:

    在这里插入图片描述

注:

1.仿射变换原理:假设某个像素点坐标为(x, y),设M = [[a, b, c], [d, e, f]],该像素点仿射变换后的新坐标为(X, Y)。现在来计算X、Y的值,X = x*a + y*b + c,Y = x*d + y*e + f。

2.平移、旋转和倾斜均利用仿射矩阵来变换,且仿射矩阵为32位浮点数类型。

3-2.平移

  • 平移仿射矩阵M:M = [[1, 0, 水平移动距离], [0, 1, 垂直移动距离]];距离为正数则向右和向下,这和之前讲的像素坐标系中的坐标正负一致。

  • 实例:

    看3-1的实例。

3-3.旋转

  • 旋转仿射矩阵M:

    由于想要得到旋转仿射矩阵M,需要经过复杂的运算;所以opencv提供了getRotationMatrix2D()方法自动计算出旋转仿射矩阵M。

    • 语法格式:M = cv2.getRotationMatrix2D(center, angle, scale)
    • 参数说明:
      • center:以哪个点作为旋转中心。格式为(W, H)。
      • angle:旋转的角度(单位是°);整数为逆时针,负数是顺时针。
      • scale:缩放比例,浮点数类型;为1时保持原来的比例。
      • M:旋转仿射矩阵。
  • 实例:

    在这里插入图片描述

3-4.倾斜

opencv需要至少定位图像的3个点才能实现倾斜效果;3个点的位置类似为矩形的3个顶点,根据这三个点的位置变化计算出其他像素点的位置变化,从而实现图像的倾斜效果。依然满足直线的“平直性”“平行性”,这也是为什么不需要矩形4个顶点坐标的原因。

  • 倾斜仿射矩阵M:

    同求旋转仿射矩阵M,opencv提供了getAffineTransform()方法自动计算出倾斜仿射矩阵M。

    • 语法格式:M = cv2.getAffineTransform(src, dst)
    • 参数说明:
      • src:原图的3个点坐标(宽W,高H);3行2列的32位浮点数列表,如:[[][][0, 0], [1, 0], [0, 1]]
      • dst:倾斜图像的3个点坐标;格式与src一致。
      • M:倾斜仿射矩阵M。
  • 实例:

    在这里插入图片描述

4.透视图像

1.仿射实际上就是将图像在二维空间中变形;而透视就是将图像在三维空间中变形,即改变图像中物体的空间位置。比如:人眼在笔记本电脑某一边看另一边,靠近眼睛的一边会比远离眼睛的对边长,如下图所示。

在这里插入图片描述

2.opencv至少需要定位图像四个点才能计算透视矩阵M。因此,也就是说是不满足直线的“平直性”“平行性”,这也是不把它归为仿射变换一类的原因。

4-1.warpPerspective()方法

  • 语法格式:dst = cv2.warpPerspective(src, M, dsize, flags, borderMode, borderValue)

  • 参数说明:

    • src:原始图像;数组类型。
    • M:透视矩阵(是一个3行3列的矩阵);也是32位浮点数类型。
    • dsize:输出图像的大小;单位是像素,默认是原图大小。
    • flags:插值方式;可选参数,建议默认值。
    • boderMode:边界类型;可选参数,建议默认值。
    • boderValue:边界值;可选参数,默认为0用黑色填充,建议默认值。
    • dst:输出图像;数组类型。
  • 透视矩阵M:

    opencv提供了getPerspectiveTransform()方法自动计算出透视矩阵M。

    • 语法格式:M = getPerspectiveTransform(src, dst)
    • 参数说明:
      • src:原图4个点坐标;格式为4行2列的32为浮点数列表,如:[[0, 0],[1, 0],[0, 1],[1, 1]]。
      • dst:透视图的4个点坐标,格式与src相同。
      • M:透视矩阵
  • 实例:

    在这里插入图片描述

1.非常坑的地方:前面操作像素章节时,像素坐标都是(H, W)的格式;但这里坐标全变成(W, H)格式了!dsize格式也是(W, H)!

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

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

相关文章

KUKA机器人外部自动运行模式的相关信号配置

KUKA机器人外部自动运行模式的相关信号配置 通过例如PLC这样的控制器来进行外部自动运行控制时,运行接口向机器人控制系统发出机器人进程的相关信号(例如运行许可、故障确认、程序启动等),机器人向上级控制系统发送有关运行状态和故障状态的信息。 必需的配置:  配置CEL…

Oracle-01-简介篇

🏆一、Oracle的历史和发展 Oracle公司成立于1977年,由拉里埃里森(Larry Ellison)、鲍勃明特(Bob Miner)和埃德奥茨(Ed Oates)共同创立。起初,公司的主要业务是开发和销售…

docker基础用法及镜像和容器的常用命令大全

1.docker 体系架构 Docker 采用了 C / S 架构,包括客户端和服务端。Docker 守护进程作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过 socket 或…

数字IC手撕代码--乐鑫科技(次小值与次小值出现的次数)

前言:本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。目录如下:1.数字IC手撕代码-分频器(任意偶数分频)2.数字IC手撕代…

九龙证券|阿里+鸿蒙+人工智能+元宇宙概念热度爆棚,“会说话的猫”亮了!

近一周组织调研个股数量有240多只,汤姆猫成为调研组织数量最多的股票。 证券时报数据宝统计,近一周组织调研公司数量有240多家。从调研组织类型来看,证券公司调研相对最广泛,调研230多家公司。 “会说话的猫”亮了 汤姆猫成为近…

倒计时3天:现实与虚拟交织,元宇宙警察将如何执法?

在元宇宙、Web3高速发展的时代,欧科云链以科技助警,帮助公安等机构实现对新型犯罪的监管与侦破。 ——摘要元宇宙作为应用场景和生活方式的未来,拥有着巨大的发展潜力。伴随5G网络、云计算、区块链等技术迅速发展,虚拟现实、人机交…

java面试题-JVM类加载机制

类加载的生命周期?1. 加载阶段(Loading)在Java程序中,当需要使用某个类时,JVM会使用类加载器来查找并加载该类文件。类加载器会首先从文件系统或网络中查找相应的 .class 文件,读取类的二进制数据&#xff…

【JDK8新特性之方法引用-案例实操】

一.JDK8新特性之方法引用-案例实操 之前我们学习了Stream流以及Lambda表达式相关的内容,如果想看的同学可以看一下之前的文章,接下来我们就来学习让Lambda表达式更加简洁的方法引用。 二. 什么是方法引用?为什么要使用方法引用? …

Leetcode Solutions - Part 1

回溯: 字符串的排列 回溯:78. 子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums …

【Java】让我们对多态有深入的了解(九)

目录 (1)接口的基本介绍​编辑 (2)接口的注意事项和细节 1.接口不能被实例化 2.接口中所有方法是public方法,接口中的抽象方法,可以不用abstract修饰 3.一个普通类实现接口,必须将接口所有…

ARMv8 architecture里的Memory aborts

在AArch64 Virtual Memory System Architecture中,有以下几种机制会导致PE在访问memory失败时产生exceptions。 Debug exception: An exception caused by the debug configuration.Alignment fault: An Alignment fault is generated if the address used for a m…

【YSYY】DSPE-PEG-cRGD,磷脂-聚乙二醇-靶向穿膜肽,靶向功能材料

靶向穿膜肽RGD环肽,磷脂-聚乙二醇-cRGD中的cRGD是五元环肽。 DSPE(1,2-二硬脂酰-sn-甘油-3-磷酸乙醇胺)是一种饱和的18碳磷脂,常用于脂质体的合成。聚乙二醇(PEG)偶联DSPE具有亲水性。聚乙二醇能增强溶解性…

一文2000字手把手教你自动化测试Selenium+pytest+数据驱动

主流自动化框架 selenium :web端自动化框架 ,(行业里面最核心的框架) appium :手机app端框架 requests :接口测试 selenium 工具类封装 selenium提供了很多方法供我们去完成网页元素的操作, …

1.创建Springboot项目

一:进入https://start.spring.io/,如下是相关步骤:地址https://start.spring.io/maven 方式springboot版本项目名称jar方式点击创建二:点击(generate)生产自动下载1.IDEA 直接打开2.启动成功SpringdiApplic…

【计算机网络】TCP底层设计交互原理

文章目录1.TCP底层三次握手详细流程2.TCP洪水攻击介绍和ss命令浅析3.Linux服务器TCP洪水攻击入侵案例4.TCP洪水攻击结果分析和解决方案5.TCP底层四次挥手详细流程1.TCP底层三次握手详细流程 TCP的可靠性传输机制:TCP三次我手的流程 一次握手:客户端发送一…

Java中抽象类有什么用

抽象类是用来捕捉子类的通用特性的,是被用来创建继承层级里子类的模板。现实中有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同;而写成抽象类,这样看代码时,就知道这是抽象方法,而知…

39-Golang中的接口

Golang中的接口基本介绍基本语法注意事项和细节案例实现对Hero结构体切片的排序:sort.Sort(data Interface)实现接口和继承之间的比较区别基本介绍 interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型…

【编程入门】应用市场(NodeJS版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…

JUC-Synchronized相关内容

设计同步器的意义多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可…

25 openEuler管理网络-使用nmcli命令配置ip

文章目录25 openEuler管理网络-使用nmcli命令配置ip25.1 nmcli介绍25.2 设备管理25.2.1 连接到设备25.2.2 断开设备连接25.3 设置网络连接25.3.1 配置动态IP连接25.3.1.1 配置IP25.3.1.2 激活连接并检查状态25.3.2 配置静态IP连接25.3.2.1 配置IP25.3.2.2 激活连接并检查状态25…