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…

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

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

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

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

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

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

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

介绍 按需直播肯定是为了减少带宽流量和服务器性能占用。安防行业GB28181协议天生就是按需播放的,有人请求播放时服务端才从设备端获取设备的直播流或录像视频,停止播放时就会停止获取视频流。同时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,体验一下它给我们带来的功能。 首先我们需要打开Developer Toolkit Browser 1.8,打开后在默认情况下,光标是选择在All选项卡上的,即我们现在所有Developer Toolkit Browser中的部件都可以看得…

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

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

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

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

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

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

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

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

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

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

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

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

Laravel5.5 MySQL配置、读写分离及操作

2019独角兽企业重金招聘Python工程师标准>>> Laravel 让连接不同数据库以及对数据库进行增删改查操作: 参考:http://laravelacademy.org/post/854.html 配置读写分离 应用的数据库配置位于 config/database.php(但是数据库用户及密码等敏感信…

Kinect开发笔记之八C#实现Kinect声音的追踪

声明:本文中特征多针对Kinect for windows 1.0,新版的Kinect Sensor可能有部分数值或方法有一定变化,请知晓。Kinect的声音来自下方的4个麦克风组成的麦克风阵列。传感器内含数字信号处理器,可以用来强化接受声音的清晰度同时处理…

国服服务器_《Minecraft我的世界》第三方服务器的基本储备

今天我想单独来聊一聊Minecraft我的世界第三方服务器的发展。世外荒原玩家作品我来到头条的第一篇文章就发表了一篇我对Minecraft现状的看法,现在国服的状态对老玩家不是很友好。(这不说明国服的运营战略路线是有问题的)因此诞生了一大堆第三方服务器。世外荒原玩家…

Unity中Time.deltaTime的含义及其应用

相信Unity的开发者或者初学者都对Time.deltaTime并不陌生,我们经常会在代码中用到或者看到它,今天去官方的API文档查了一下,感觉它非常有用,所以翻译一下以引导初学者。 原文网址: file:///Applications/Unity/Unity…

unity3d曲线text文本

测试.pngusing System; using System.Collections.Generic;namespace UnityEngine.UI.Extensions {/// <summary>/// Curved text.让文本按照曲线进行显示 【注意对Image的变形 也是可以的】/// 说明&#xff1a; 对Text的操作就和 shadow 和 outline 组件类似。/// <…

Unity中Quaternion的含义及其使用

官网API文档&#xff1a; file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quaternion.html Quaternion的意思是四元数&#xff0c;用于代表旋转。 它们是紧致的&#xff0c;不会产生万向节死锁并且能够很容易被插值。Unity内使用Quat…

Python PIPEs

2019独角兽企业重金招聘Python工程师标准>>> https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm 转载于:https://my.oschina.net/zungyiu/blog/1860857