opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换

Geometric Transformations of Images

1图像转换

OpenCV提供了两个转换函数cv2.warpAffinecv2.warpPerspective,可以使用它们进行各种转换。 cv2.warpAffine采用2x3变换矩阵,而cv2.warpPerspective采用3x3变换矩阵作为输入。

2图像缩放

缩放只是调整图像大小.为此,OpenCV附带了一个函数cv.resize().
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

  • 对shrinking,优选的interpolation方法:cv2.INTER_AREA该方法可以避免波纹的出现
  • 对zooming,优选的interpolation方法:cv2.INTER_CUBICcv2.INTER_LINEAR(默认)

方法一

import numpy as np
import cv2img = cv2.imread('messi5.jpg')res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

方法二

import numpy as np
import cv2height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

3图像平移

平移是对象位置的转换。 如果你知道(x,y)方向的偏移,让它为(tx,ty),你可以创建变换矩阵M,如下所示:

$$ M= \left[ \begin{matrix} 1 & 0 & tx \\ 0 & 1 & ty \end{matrix} \right] \ $$

可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数.

应用

按(100,50)平移
代码

import cv2
import numpy as npimg = cv2.imread('img.jpg',0)
rows,cols = img.shapeM = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

clipboard.png

clipboard.png

4图像旋转

通过变换矩阵实现图像旋转角度θ:

$$ M= \left[ \begin{matrix} cosθ & -sinθ \\ sinθ & cosθ \end{matrix} \right] \ $$

OpenCV提供可调旋转,旋转中心可调,因此可以在任何的位置旋转.修正的变换矩阵由下式给出:

$$ \left[ \begin{matrix} \alpha & \beta & (1-\alpha) \cdot center.x - \beta\cdot center.y \\ -\beta & \alpha & \beta\cdot center.x + (1-\alpha) \cdot center.y \end{matrix} \right] \ $$

$ \alpha = scale \cdot cosθ $
$ \beta = scale \cdot sinθ $

为了找到这个转换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D.

应用

将图像相对于中心旋转90度而不进行任何缩放
代码

import cv2
import numpy as npimg = cv2.imread('img.jpg',0)
rows,cols = img.shape# cols-1 and rows-1 are the coordinate limits.
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

clipboard.png

clipboard.png

5仿射变换

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

import cv2
import numpy as np
import matplotlib.pylab  as pltimg = cv2.imread('img5.jpg')
rows,cols,ch = img.shapepts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])M = cv2.getAffineTransform(pts1,pts2)dst = cv2.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()

clipboard.png

5透视变换

对于透视变换,需要一个3x3变换矩阵。 即使在转换之后,直线仍将保持笔直. 要找到此变换矩阵,输入图像上需要4个点,输出图像上需要相应的点. 在这4个点中,其中3个不应该共线. 然后可以通过函数cv2.getPerspectiveTransform找到变换矩阵. 然后将cv2.warpPerspective应用于此3x3变换矩阵。

代码

import cv2
import numpy as np
import matplotlib.pylab  as pltimg = cv2.imread('img6.jpg')
rows,cols,ch = img.shapepts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])M = cv2.getPerspectiveTransform(pts1,pts2)dst = cv2.warpPerspective(img,M,(300,300))plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

clipboard.png

NOTE
仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”.
从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面.透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间.

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

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

相关文章

.net调用c++方法时如何释放c++中分配的内存_C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

一、C语言程序的构成与C、Java相比,C语言其实很简单,但却非常重要。因为它是C、Java的基础。不把C语言基础打扎实,很难成为程序员高手。1、C语言的结构先通过一个简单的例子,把C语言的基础打牢。C语言的结构要掌握以下几点&#x…

Django 使用 mysql 数据库连接

启用 mysql 数据库连接 修改 app01 下的 __init__.py import pymysqlpymysql.install_as_MySQLdb() 修改 settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django,USER: django,PASSWORD: django,HOST: 192.168.0.200,PORT: 3306,} } 测试 #生成同步…

Kinect开发笔记之四检测并调试Kinect设备

之前我们已经装好了Developer Toolkit 1.8,下面我们来做进一步的测试。首先到开始菜单中找到Kinect for Windows SDK v1.8,点击其中的Developer Toolkit Browser v1.8.0。打开后,有许多东西,我们选择最右边的Tools来筛选一下&…

c语言双引号和单引号的区别_Python中的单引号和双引号有什么区别?

在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串。但是这两种通用的表达方式可以避免出错之外,还可以减少转义字符的使用,使程序看起来更清晰。举两个例子:1、包含单引号的字符串定义一个字符串m…

mysql 开发基础系列22 SQL Model(带迁移事项)

一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql。 sql model 常用来解决下面几类问题: (1) 通过设置sql mode, …

五月28学习笔记

<!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title></title> </head> <body> <!--链接标签--> <!--核心属性就是href 属性值可以是一个跳转的地址--&…

Kinect开发笔记之五使用PowerShell控制Kinect

这是第一次用MarkDown编辑器来写博客&#xff0c;挺喜欢这种没有任何格式舒服的编辑器&#xff0c;自由洒脱更加易读&#xff0c;留一个不自然的自然段纪念下找到舒服的编辑器。 这次要记录使用win7/win8内建的PowerShell来控制Kinect&#xff0c;改变Kinect的俯仰角度。 在我…

可转债数据一览表集思录_可转债股票数据一览表

128107交科转债720612061浙江交科-11.90%25113578全筑转债754030603030全筑股份-1.26%3.84113573纵横转债754602603602纵横通信5.79%2.7113577春秋转债754890603890春秋电子-9.46%2.4123050聚飞转债370303300303聚飞光电2.52%7.05110070凌钢转债733231600231凌钢股份24.44%4.41…

国标流媒体H5实现无插件视频监控按需直播

介绍 按需直播肯定是为了减少带宽流量和服务器性能占用。安防行业GB28181协议天生就是按需播放的&#xff0c;有人请求播放时服务端才从设备端获取设备的直播流或录像视频&#xff0c;停止播放时就会停止获取视频流。同时GB28181协议又是目前安防设备厂商都支持的统一的协议&am…

ipa 安装包不用市场如果扫码下载安装 免费IOS安装API

在做开发过程中可能会用于生成测试包的情况,不过测试包不能直接安装,非常不方便,所以我提供给大家一下可通过链接下载安装的方法也可以把链接生成二维码扫码下载 api地址: https://tool.bitefu.net/ipa/ 文件地址:http://tool.bitefu.net/showdoc/web/#/3 源码下载:http://tado…

Kinect开发笔记之六Kinect Studio的应用

这一次我们来操作一下Kinect Studio&#xff0c;体验一下它给我们带来的功能。 首先我们需要打开Developer Toolkit Browser 1.8&#xff0c;打开后在默认情况下&#xff0c;光标是选择在All选项卡上的&#xff0c;即我们现在所有Developer Toolkit Browser中的部件都可以看得…

antd picker 使用 如何_如何打造 Serverless JavaScript 全栈商业级应用?

2019 年底我们发布过一篇《O’Reilly 1500 份问卷调研&#xff1a;2019 年 Serverless 落地到底香不香&#xff1f;》&#xff0c;揭示了海外 Serverless 的落地情况&#xff0c;但中国 Serverless 的落地实践分享相对较少&#xff0c;似乎谁都在喊 Serverless&#xff0c;谁都…

【Android Studio安装部署系列】十三、Android studio添加和删除Module 2

版权声明&#xff1a;本文为HaiyuKing原创文章&#xff0c;转载请注明出处&#xff01; 概述 新建、导入、删除Module是常见的操作&#xff0c;这里简单介绍下。 新建Module File——New——New Module... 选中Android Library 修改Library名称 在项目工程中修改依赖 和添加下面…

Kinect开发笔记之七Visual Studio结合C#调控Kinect俯仰角度

总感觉自己前面啰啰嗦嗦写了好多&#xff0c;却一直都没有使用用开发kinect的重型武器——Visual Studio。 那么本次我们就借助于Visual Studio&#xff0c;写一个C#程序&#xff0c;连接Kinect并调用Kinect SDK标准函数库来改变Kinect的俯仰角。 首先我们打开VS创建一个项目…

hadoop HDFS常用文件操作命令

命令基本格式: hadoop fs -cmd < args >1.ls hadoop fs -ls /列出hdfs文件系统根目录下的目录和文件 hadoop fs -ls -R /列出hdfs文件系统所有的目录和文件 2.put hadoop fs -put < local file > < hdfs file >hdfs file的父目录一定要存在&#xff0c;否则…

定量库存控制模型_探索全面流动管理TFM 库存控制与低减的理性策略

库存乃万恶之源库存不仅占用了资金&#xff0c;还占用了各种管理性资源&#xff0c;形成了“财务性显性成本“而且过多的库存导致“缓冲区”的存在&#xff0c;还使得各类问题变得不那么紧迫&#xff0c;从而掩盖了各类隐藏的问题&#xff0c;这被称为“隐形成本”零库存不仅做…

android studio更新之后打包遇到V1(Jar Signature)、 V2(Full APK Signature)问题

昨天更新了android studio 打包时遇到两个勾选框&#xff0c;于是开始了解… 问题 刚开始默认是勾选 V2&#xff08;Full APK Signature&#xff09;&#xff0c;然后我就打包去测试先了&#xff0c;发现安装失败。之后发现与签名有关系。 发现 android 7.0中引入了APK Signatu…

C#——一个简单的文件管理器

最近在紧张的学习C#&#xff0c;说实话对C#之前没有太多的接触过&#xff0c;只知道C#的特性与java很相似&#xff0c;接触了之后才发现C#跟java相比区别不是很多&#xff0c;但它是一门实现程序能力比Java还要好的语言&#xff08;仅代表个人观点&#xff09;。 有许多新手在…

关于epoll,select,poll的理解

select: 轮询fd_set 1.采用fd_set存储fd&#xff08;fd_set通过数组位图实现&#xff09; 2.每次调用select&#xff0c;都需要把fd集合从用户态拷贝到内核态&#xff0c;fd越多开销越大 3.每次调用select&#xff0c;都需要在内核遍历传递进来的fd&#xff0c;开销大(轮询&…

kali linux超级用户_如何优雅的在Linux上使用Powershell]

点击上方“蓝字”关注我们吧&#xff01;译文声明本文是翻译文章&#xff0c;文章原作者 TJ Null文章来源&#xff1a;https://www.offensive-security.com原文地址&#xff1a;https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/译文仅供参考&…