OpenCV学习(4.2) 图像的几何变换

1.目标

  • 学习将不同的几何变换应用到图像上,如平移、旋转、仿射变换等。
  • 你会看到这些函数: cv.getPerspectiveTransform

2.缩放

缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小,也可以指定比例因子。可以使用不同的插值方法。对于下采样(图像上缩小),最合适的插值方法是 cv.INTER_AREA 对于上采样(放大),最好的方法是 cv.INTER_CUBIC (速度较慢)和 cv.INTER_LINEAR (速度较快)。默认情况下,所使用的插值方法都是 cv.INTER_AREA 。你可以使用如下方法调整输入图片大小:

代码:

import cv2



image = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
image = cv2.imread(image)



#图像几何变换
import numpy as np


res11 = cv2.resize(image,None,fx=2, fy=2, interpolation = cv2.INTER_AREA)
res12 = cv2.resize(image,None,fx=2, fy=2, interpolation = cv2.INTER_LINEAR)
res13 = cv2.resize(image,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#OR
height, width = image.shape[:2]
res2 = cv2.resize(image,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

cv2.imshow('res11',res11)
cv2.imshow('res12',res12)
cv2.imshow('res13',res13)
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在OpenCV中,cv2.resize() 函数用于改变图像的大小。您提供的代码行演示了如何将输入图像 image 放大到原来的两倍。

这里是代码行的详细解释:

  • res11 = cv2.resize(image, None, fx=2, fy=2, interpolation = cv2.INTER_AREA):这行代码执行了图像放大的操作。
    • image 是您想要调整大小的图像。
    • None 表示输出图像的大小会根据 fx 和 fy 参数自动计算。如果您想显式指定输出图像的大小,可以传递一个元组 (width, height)
    • fx=2 和 fy=2 表示图像在 x 轴和 y 轴方向上放大两倍。
    • interpolation=cv2.INTER_AREA 是插值方法,用于在放大或缩小图像时确定新像素值。cv2.INTER_AREA 是一种适合缩小图像的插值方法,但如果您是在放大图像,通常使用 cv2.INTER_LINEAR 或 cv2.INTER_CUBIC 会得到更好的结果,因为它们可以提供更平滑的边缘和更少的锯齿效果。

如果您的目的是放大图像,通常建议使用 cv2.INTER_LINEAR 或 cv2.INTER_CUBIC 作为插值方法。

 

输出结果: 

3.平移变换

平移变换是物体位置的移动。如果知道 (x,y) 方向的偏移量,假设为 (t_x,t_y)**,则可以创建如下转换矩阵 **M

您可以将变换矩阵存为 np.float32 类型的 numpy 数组,并将其作为 cv.warpAffine 的第二个参数。请参见以下转换(100,50)的示例:

import numpy as np
import cv2 as cv


img = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
img = cv.imread(img)
cv.imshow('img',img)
print(img.shape)
rows,cols = img.shape[0],img.shape[1]
M1 = np.float32([[1,0,100],[0,1,50]])
M2 = np.float32([[1,0,50],[0,1,100]])
M3 = np.float32([[1,0,-100],[0,1,-50]])
M4 = np.float32([[1,0,-50],[0,1,-100]])
dst1 = cv.warpAffine(img,M1,(cols,rows))
dst2 = cv.warpAffine(img,M2,(cols,rows))
dst3 = cv.warpAffine(img,M3,(cols,rows))
dst4 = cv.warpAffine(img,M4,(cols,rows))
cv.imshow('img1',dst1)
cv.imshow('img2',dst2)
cv.imshow('img3',dst3)
cv.imshow('img4',dst4)
cv.waitKey(0)
cv.destroyAllWindows()

dst1 = cv.warpAffine(img,M1,(cols,rows))

在OpenCV中,cv.warpAffine() 函数用于对图像进行仿射变换。这个函数可以将图像按照给定的变换矩阵进行旋转、平移、缩放等变换。

以下是代码行的详细解释:

  • dst1 = cv.warpAffine(img, M1, (cols, rows))
    • img 是您想要进行仿射变换的输入图像。
    • M1 是一个2x3的变换矩阵,它定义了如何变换图像。这个矩阵通常是通过计算得到的,它包含了图像的旋转、平移和缩放信息。
    • (cols, rows) 是输出图像的大小,cols 是输出图像的列数,rows 是输出图像的行数。这个参数确定了变换后图像的大小。

例如,如果您想要将图像绕其中心旋转30度,您可以首先计算旋转矩阵 M1,然后使用 cv.warpAffine() 函数进行变换

 

cv.warpAffine 函数的第三个参数是输出图像的大小,其形式应为(宽度、高度)。记住宽度=列数,高度=行数。 

输入:

输出:

4.旋转 

以 \theta角度旋转图片的转换矩阵形式为:

但 Opencv 提供了可变旋转中心的比例变换,所以你可以在任意位置旋转图片,修改后的转换矩阵为:

其中:

为了找到这个转换矩阵,opencv 提供了一个函数, cv.getRotationMatrix2D 。请查看下面的示例,它将图像相对于中心旋转 90 度,而不进行任何缩放。

import cv2 as cv


img = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
img = cv.imread(img)
cv.imshow('img',img)

rows,cols = img.shape[0],img.shape[1]
# cols-1 and rows-1 are the coordinate limits.
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))
cv.imshow('dst',dst)

cv.waitKey(0)
cv.destroyAllWindows()

cv.getRotationMatrix2D 是 OpenCV 库中的一个函数,用于计算二维旋转的变换矩阵。这个变换矩阵可以随后用于 cv.warpAffine 函数中,以实现对图像的旋转。

函数原型如下:

cv.getRotationMatrix2D(center, angle, scale)

参数说明:

  • center:旋转的中心点,通常是一个二元组 (x, y),表示图像中的旋转中心。
  • angle:旋转角度,正值表示逆时针旋转。
  • scale:缩放因子,用于在旋转的同时对图像进行缩放。

返回值是一个 2x3 的浮点型 NumPy 数组,表示旋转变换矩阵。

 

5.仿射变换

仿射变换是一种二维变换,它在平面内将一个图形变换成另一个图形,同时保持原图形中所有点之间的相对位置关系(即直线经过变换后仍然是直线,且平行线经过变换后仍然平行)。在仿射变换中,直线段保持直线且比例不变,但直线段可能会变短或变长。

仿射变换可以由以下几种基本变换组合而成:

  1. 平移(Translation):在平面上沿着某个方向移动所有点。
  2. 旋转(Rotation):围绕某个点旋转所有点。
  3. 缩放(Scaling):放大或缩小所有点,可以有不同的缩放比例沿 x 轴和 y 轴。
  4. 剪切(Shear):使平面上的点沿某个方向移动,移动的距离与点到某条参考线的距离成正比。

在数学上,仿射变换通常表示为一个矩阵和一个向量的组合,形式如下:

                                                               T(x)=Ax+b

其中,A 是一个 2x2 的矩阵,表示旋转、缩放和剪切,b 是一个 2 元素的向量,表示平移,x 是原始点的坐标,T(x) 是变换后点的坐标。

在图像处理中,仿射变换常用于校正图像的视角、校正由于相机镜头造成的畸变、或者将图像中的对象进行几何变换。在 OpenCV 中,可以使用 cv.getAffineTransform 来计算仿射变换矩阵,然后使用 cv.warpAffine 来应用这个变换到图像上。

在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中取三个点及其在输出图像中的对应位置。然后 cv.getAffineTransform 将创建一个 2x3 矩阵,该矩阵将传递给 cv.warpAffine 。

查看下面的示例,并注意我选择的点(用绿色标记):

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

img = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
img = cv.imread(img)
cv.imshow('img',img)


rows,cols = img.shape[0],img.shape[1]
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
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()

cv.waitKey(0)
cv.destroyAllWindows()

6.透视变换 

透视变换(Perspective Transformation)是一种更加一般的变换,它可以将一个平面上的图像映射到另一个平面上,同时保持直线的直线性质,但不保持平行线的平行性。这意味着,透视变换可以改变物体的视角,使得原本平行的线在变换后的图像中会相交,产生一种深度感或透视效果

透视变换在图像处理中的应用非常广泛,比如在图像校正、三维重建、虚拟现实和增强现实等领域。它允许我们从一个特定的视角观察一个物体,就像我们通过窗户看外面的世界,窗户的框架会提供一个不同的视角,即使窗户外的物体是平面的。

在数学上,透视变换通常通过一个3x3的变换矩阵来表示,这个矩阵可以将一个二维坐标系中的点映射到另一个二维坐标系中的点。透视变换矩阵的构造通常需要四个对应的点对,即原始图像中的四个点及其在目标图像中的对应位置。

在OpenCV中,可以使用cv.getPerspectiveTransform函数来计算透视变换矩阵,然后使用cv.warpPerspective函数来应用这个变换到图像上

对透视转换,你需要一个 3x3 变换矩阵。即使在转换之后,直线也将保持直线。要找到这个变换矩阵,需要输入图像上的 4 个点和输出图像上的相应点。在这四点中,任意三点不应该共线。然后通过 cv.getPerspectiveTransform 找到变换矩阵。然后对这个 3x3 变换矩阵使用 **cv.warpPerspective**。

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

img = r'D:\study\EmotionDetection_RealTime-master\data\data\te\01.jpg'
img = cv.imread(img)
cv.imshow('img',img)


rows,cols = img.shape[0],img.shape[1]
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,M,(rows,cols))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

cv.waitKey(0)
cv.destroyAllWindows()


cv.getPerspectiveTransform 是 OpenCV 库中的一个函数,用于计算透视变换矩阵。透视变换是一种投影变换,它可以将一个平面上的图像映射到另一个平面上,同时保持直线的直线性质,但不保持平行线的平行性。这种变换通常用于校正图像中的透视畸变,例如将照片中的矩形对象(如建筑物的立面)转换为正视图像。

函数原型如下:

cv.getPerspectiveTransform(src, dst)

参数说明:

  • src:一个包含四个源点的 numpy 数组,这些点代表原始图像中的四个角点。
  • dst:一个包含四个目标点的 numpy 数组,这些点代表变换后图像中对应角点的期望位置。

返回值是一个 3x3 的浮点型 NumPy 数组,表示透视变换矩阵。

 

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

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

相关文章

【python】成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南

成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南 在Python编程中,尤其是进行文本挖掘和自然语言处理(NLP)时,gensim库是一个常用的工具,用于主题建模、文档相似度计算、词向量表示&#x…

【教程】使用 Tailchat 搭建团队内部聊天平台,Slack 的下一个替代品!

前言 多人协作,私有聊天一直是团队协作的关键点,现在有很多专注于团队协作的应用和平台,比如飞书、企业微信和Slack等。这期教程将带你手把手的搭建一个在线的团队协作向聊天室,希望对你有所帮助! 本期聊天室使用TailChat作为服务…

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境: 某品牌FlexStorage P5730服务器存储,存储中有一组由24块硬盘组建的RAID5阵列,包括1块热备硬盘。 服务器存储故障: 存储中的2个卷被删除,删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

【Java数据结构】二叉树详解(二)

🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2. 二叉树的模拟——正文 2.1获取树中节点的个数 2.2获取叶子节点的个数 2.3获取第K层节点的个数 2.4获取二叉树的高度 2.5 检测值为value的元素是否存在 …

明天15点!如何打好重保预防针:迎战HVV经验分享

在当今数字化时代,网络攻击日益猖獗,各行各业面临的网络安全威胁不断升级。从钓鱼邮件到复杂的APT攻击,网络犯罪分子的手法层出不穷,给各行各业的信息安全带来了前所未有的挑战。 在这样的背景下,"HVV行动"应…

【案例实战】 基于OpenCV实现鹿茸面积计算

学习《人工智能应用软件开发》,学会所有OpenCV技能就这么简单! 做真正的OpenCV开发者,从入门到入职,一步到位! 有人在我得B站答疑群里发了下面的图: 问:如何计算鹿茸最外圈蜡皮面积占整个鹿茸…

从人才战略到人才生态,金徽酒高增长的“明线”与“暗线”

执笔 | 文 清 编辑 | 扬 灵 2016年3月,金徽酒于A股上市,全年实现营收12.77亿元。2023年,金徽酒实现营收25.48亿元,比上市当年增加99.5%,近乎翻倍。而当我们深度关注金徽酒,在其业绩高增长的“明线”背…

弘君资本:半导体板块强势拉升,上海贝岭涨停,台基股份等大涨

半导体板块5日盘中强势拉升,到发稿,台基股份涨超15%,中晶科技、上海贝岭等涨停,国科微、长川科技涨超7%,紫光国微、富满微、金海通等涨超5%。 组织表示,半导体职业处于历史较低水平,大基金三期…

通配符https数字证书260

随着越来越多的人开始使用互联网,互联网上的信息变得繁杂,用户很难识别网站信息的真实性,为了维护互联网的环境,开发者开始使用https证书对网站传输数据进行加密和身份认证,以此来保护用户的隐私以及标示网站的真实性。…

电脑e盘不见了,看这三个解决方法

在使用电脑的过程中,我们有时会遇到E盘突然消失的情况,这无疑给我们的数据管理和使用带来了很大的困扰。那么,电脑e盘不见了是怎么回事呢?本文将为你讲解可能的原因,并为你提供三个实用的解决方法。通过了解这些原因和…

通用漏洞-crlfurl重定向拒绝服务攻击

1.crlf注入 1.1原理 crlf是在数据包头头部采取一些回车加换行的操作,把自己的其他代码放到数据包中去覆盖掉原本的数据的方法,常配合xss漏洞使用,这个漏洞本身的造成危害并不严重,CRLF Injection又叫HTTP响应拆分/截断&#xff…

下载Keil芯片包的方法

Keil里面弹出来的这个蓝色超链接,没梯子不要用edge浏览器 Arm Keil | Devices

回归方程 | 海洋气象中的应用

下面的内容为大家讲解关于非线性回归的内容,下面先带着大家回顾一下回归方程 回归方程 利用样本数据建立因变量(预报量)与一个或者多个自变量(预报因子)之间的统计关系经验方程式(回归方程),用以描述预报量随自变量的平均变化情况,并据此对…

什么时候需要用到 @EnableWebSecurity 注解?

有小伙伴在学习 Spring Security 的遇到一个问题: 箭头所指的位置报红,也就是 Spring 容器中没有找到一个类型为 HttpSecurity 的 Bean。 小伙伴说如果他在配置类上加 EnableWebSecurity 注解,就不报错;不加该注解则会报错。那么…

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录 前言打印数组函数一、插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序总结 前言 C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍 打印数组函数 打印数组函数定义 // 打印…

Angular17(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目,可以使用 Angular CLI(命令行界面)。以下是使用 Angular CLI 创建一个新项目的步骤: 1、安装 Angular CLI: 打开你的命令行界面(在 Windows 上是 CMD、PowerShell 或 Git Bas…

反向海淘代购系统|pandabuy系统方案|系统流程讲解:引领全球购物新潮流

随着全球化的深入发展和互联网技术的不断进步,人们的购物方式也在发生着翻天覆地的变化。反向海淘代购系统作为这一变革的杰出代表,正逐渐走进大众视野,为消费者带来前所未有的全球购物体验。 一、反向海淘代购系统的定义 传统的海淘模式主…

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务,包括免费创建自己的设备连接。 首先,登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Flink SQL查询语法部分详解(提供需求、数据练习复现)

一、Hints 动态表选择:可以在查询表的时候动态修改表的参数配置 1、读取kafka的数据建表 CREATE TABLE students (id STRING,name STRING,age INT,sex STRING,clazz STRING ) WITH (connector kafka,topic students, -- 指定topicproperties.bootstrap.servers …

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的,点击选择 输入密码 然后就ok了 ✅ 总结 只能说:玄学!