python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换

opencv_header.png

前文传送门:

图像缩放

图像缩放只是调整图像的大小,为此, OpenCV 为我们提供了一个函数 cv.resize() ,原函数如下:

resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src 表示的是输入图像,而 dsize 代表的是输出图像的大小,如果为 0 ,则:

\[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}

\]

dsize 和 fx 、 fy 不能同时为 0 。

fx 、 fy 是沿 x 轴和 y 轴的缩放系数,默认取 0 时,算法如下:

\[\texttt{fx=(double)dsize.width/src.cols}

\]

\[\texttt{fy=(double)dsize.height/src.rows}

\]

最后一个参数 interpolation 表示插值方式:

INTER_NEAREST - 最近邻插值

INTER_LINEAR - 线性插值(默认)

INTER_AREA - 区域插值

INTER_CUBIC - 三次样条插值

INTER_LANCZOS4 - Lanczos插值

看一个简单的示例:

import cv2 as cv

#读取图片

src = cv.imread('maliao.jpg')

print(src.shape)

#图像缩放

result = cv.resize(src, (300, 150))

print(result.shape)

#显示图像

cv.imshow("src", src)

cv.imshow("result", result)

#等待显示

cv.waitKey()

cv.destroyAllWindows()

结果如下:

resize_1.png

需要注意的是,这里的 (300, 150) 设置的是 dsize 的列数为 300 ,行数为 150 。

同理,我们可以通过设定一个比例进行缩放,可以是等比例缩放,也可以是不等比例缩放,下面是等比例缩放的示例:

import cv2 as cv

# 设定比例

scale = 0.5

#读取图片

src = cv.imread('maliao.jpg')

rows, cols = src.shape[:2]

#图像缩放

result = cv.resize(src, ((int(cols * scale), int(rows * scale))))

print(result.shape)

#显示图像

cv.imshow("src", src)

cv.imshow("result", result)

#等待显示

cv.waitKey()

cv.destroyAllWindows()

结果如下:

resize_2.png

除了可通过设定 dszie 对图像进行缩放,我们还可以通过设定 fx 和 fy 对图像进行缩放:

import cv2 as cv

#读取图片

src = cv.imread('maliao.jpg')

print(src.shape)

#图像缩放

result = cv.resize(src, None, fx=0.5, fy=0.5)

print(result.shape)

#显示图像

cv.imshow("src", src)

cv.imshow("result", result)

#等待显示

cv.waitKey()

cv.destroyAllWindows()

结果如下:

resize_3.png

图像平移

图像平移是通过仿射函数 warpAffine() 来实现的,原函数如下:

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

在图像平移中我们会用到前三个参数:

需要变换的原始图像

移动矩阵M

变换的图像大小(如果这个大小不和原始图像大小相同,那么函数会自动通过插值来调整像素间的关系)。

图像的平移是沿着 x 方向移动 tx 距离, y 方向移动 ty 距离,那么需要构造移动矩阵:

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

\]

我们通过 Numpy 来产生这个矩阵(必须是float类型的),并将其赋值给仿射函数 warpAffine() ,下面来看个示例:

import cv2 as cv

import numpy as np

#读取图片

src = cv.imread('maliao.jpg')

rows, cols = src.shape[:2]

# 定义移动距离

tx = 50

ty = 100

# 生成 M 矩阵

affine = np.float32([[1, 0, tx], [0, 1, ty]])

dst = cv.warpAffine(src, affine, (cols, rows))

# 显示图像

cv.imshow('src', src)

cv.imshow("dst", dst)

# 等待显示

cv.waitKey(0)

cv.destroyAllWindows()

结果如下:

warpAffine_1.png

注意: warpAffine 函数的第三个参数是输出图像的大小,我这里设置的大小是原图片的大小,所以结果会有部分遮挡。

图像旋转

图像旋转主要调用 getRotationMatrix2D() 函数和 warpAffine() 函数实现,绕图像的某一个中心点旋转,具体如下:

M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

参数分别为:旋转中心、旋转度数、scale

rotated = cv2.warpAffine(src, M, (cols, rows))

参数分别为:原始图像、旋转参数、原始图像宽高

图像旋转:设( x0 , y0 )是旋转后的坐标,( x , y )是旋转前的坐标,( m , n )是旋转中心, a 是旋转的角度(顺时针),( left , top )是旋转后图像的左上角坐标,则公式如下:

\[\begin{bmatrix}x0 & y0 & 1\end{bmatrix} = \begin{bmatrix}x & y & 1\end{bmatrix} \begin{bmatrix}1 & 0 & 0 \\ 0 & -1 & 0 \\ -m & n & 1\end{bmatrix} \begin{bmatrix}\cos a & -\sin a & 0 \\ \sin a & \cos a & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ left & top & 1 \end{bmatrix}

\]

示例如下:

import cv2 as cv

#读取图片

src = cv.imread('maliao.jpg')

# 原图的高、宽

rows, cols = src.shape[:2]

# 绕图像的中心旋转

# 参数:旋转中心 旋转度数 scale

M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)

#

dst = cv.warpAffine(src, M, (cols, rows))

# 显示图像

cv.imshow("src", src)

cv.imshow("dst", dst)

# 等待显示

cv.waitKey()

cv.destroyAllWindows()

结果如下:

matrix2d_1.png

图像翻转

第一个图像翻转,这个可是制作表情包的利器。

图像翻转在 OpenCV 中调用函数 flip() 实现,原函数如下:

flip(src, flipCode, dst=None)

src:原始图像。

flipCode:翻转方向,如果 flipCode 为 0 ,则以 X 轴为对称轴翻转,如果 fliipCode > 0 则以 Y 轴为对称轴翻转,如果 flipCode < 0 则在 X 轴、 Y 轴方向同时翻转。

示例如下:

import cv2 as cv

import matplotlib.pyplot as plt

# 读取图片 由 GBR 转 RGB

img = cv.imread('maliao.jpg')

src = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 图像翻转

# flipCode 为 0 ,则以 X 轴为对称轴翻转,如果 fliipCode > 0 则以 Y 轴为对称轴翻转,如果 flipCode < 0 则在 X 轴、 Y 轴方向同时翻转。

img1 = cv.flip(src, 0)

img2 = cv.flip(src, 1)

img3 = cv.flip(src, -1)

# plt 显示图形

titles = ['Source', 'Ima1', 'Ima2', 'Ima3']

images = [src, img1, img2, img3]

for i in range(4):

plt.subplot(2, 2, i + 1)

plt.imshow(images[i])

plt.title(titles[i])

plt.xticks([])

plt.yticks([])

plt.show()

结果如下:

flip_1.png

示例代码

如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。

参考

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

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

相关文章

java中main方法返回类型是6_[单选] Java application中的主类需包含main方法,main方法的返回类型是什么()。...

[单选] Java application中的主类需包含main方法,main方法的返回类型是什么()。 更多相关问题 关于超声在人体中传播的速度,叙述正确的有A、与人体组织的弹性有关B、与人体组织的密度有关C、与人 患者女,50岁,2年前超声发现甲状腺右叶单发实性结节, 0.7 cm0.5 cm。先后数家…

linux中python编辑器_Linux下9款最好的Markdown编辑器

首先&#xff0c; Markdown是使用Perl编写的&#xff0c;简单、轻量级的工具&#xff0c;允许用户编写纯文本格式和高效的html或者XHTML。它实际上是一个易于阅读&#xff0c;易于编写纯文本的语言和文本到HTML的转换的软件工具。 希望你有一点了解&#xff0c;Mrakdown是什么&…

java监听数据库操作_第十六篇——JDBC操作数据库之监听器

JavaWeb应用中&#xff0c;很多的地方都和session有关。因此session相关的事件监听器&#xff0c;在日常工作中非常有用。有时候我们需要统计当前在线的人数和访问人数总数&#xff0c;此时就可以使用监听器技术来很简单的实现这种功能。注意&#xff1a;session并不是浏览器关…

pythonsuper函数_怎么使用python super函数调用父类

怎么使用python super函数调用父类 发布时间&#xff1a;2020-11-19 09:19:47 来源&#xff1a;亿速云 阅读&#xff1a;93 作者&#xff1a;小新 小编给大家分享一下怎么使用python super函数调用父类&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起…

java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示

构造自己的adapter&#xff0c;在getView中&#xff0c;设置颜色&#xff0c;点击item&#xff0c;刷新listview。代码&#xff1a;view plaincopy to clipboardprint?import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;impor…

python2.7安装matplotlib_Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip

一、 scipy,numpy,matplotlib sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matplotlib python import scipy import numpy import pylab scipy.test() numpy.test() pylab.test() 二、pip 1、先说一下什么是pip pip 是“…

instring java_Decode a string in Java

java中decode字符串&#xff1a;public class Utils {private static Pattern validStandard Pattern.compile("%([0-9A-Fa-f]{2})");private static Pattern choppedStandard Pattern.compile("%[0-9A-Fa-f]{0,1}$");private static Pattern va…

加装的硬盘进入后点不了文件夹_在外接移动硬盘上制作win to go教程

有很多使用Mac Book的小伙伴免不了要使用一些Windows下才有的软件(强行暗示Solidworks)&#xff0c;这类的大型软件在虚拟机当中运行稳定性又不太好&#xff0c;所以双系统便成了许多人的选择&#xff0c;但boot camp让本就拮据的机身内存雪上加霜&#xff0c;由此win to go便成…

java使窗体最大化_[转]java窗体运行时最大化及关闭方法示例

其实这原本是一个有关java的基础话题&#xff0c;不过既然有人提出来&#xff0c;不妨说两句&#xff0c;顺便也可做为初学者的一个参考。//1.窗体启动时最大化//Frame1.javaimport java.awt.*;import java.awt.event.*;import javax.swing.UIManager;public class Frame1 exte…

python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条

F12打开网页调试工具&#xff1a;选择“网络”选项卡后&#xff0c;发现有很多响应&#xff0c;我们筛选一下&#xff0c;只看XHR响应。&#xff08;XHR是Ajax中的概念&#xff0c;表示XMLHTTPrequest&#xff09;然后我们发现少了很多链接&#xff0c;随便点开一个看看&#x…

openjdk怎么执行java命令_Ubuntu 18.04 上使用 OpenJDK 安装并运行 Tomcat

在Linux上安装与卸载JDK和JRE&#xff0c;两种常用方法&#xff1a;一、通过 apt-get 命令在线进行安装与卸载(会自动配置好环境变量)二、通过下载并解压 .tar.gz 包进行手动安装与手动卸载(需要手动配置环境变量)注&#xff1a;javac命令是JDK中的&#xff0c;java命令是JRE中…

vscode卸载background插件_萌妹程序员鼓励师24小时在线陪你写代码,给我吹爆这个VSCode插件...

开源最前线(ID&#xff1a;OpenSourceTop) 猿妹综合整理项目地址&#xff1a;https://github.com/SaekiRaku/vscode-rainbow-fart最近&#xff0c;Github上有一个名为Rainbow Fart的VSCode 插件被玩坏了&#xff0c;有了这个插件&#xff0c;程序员鼓励师这个物种就要灭绝了。为…

python webui测试ie浏览器环境配置_python+selenium做ui自动化测试用法必会

一、前言大家都知道&#xff0c;基于Web端的测试的基础框架是需要Selenium做主要支撑的&#xff0c;这里边给大家介绍下Web测试核心之基于 Python 的 SeleniumSelenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用…

python调用matlab函数_从python调用MATLAB函数

我知道这是一个老问题&#xff0c;已经得到答复。 但是我一直在寻找相同的东西&#xff08;对于Mac&#xff09;&#xff0c;发现有很多选择与matlab交互的方法和成熟度不同。 这是我发现的&#xff1a; pymat 使用matlab引擎&#xff08;libeng&#xff09;进行通讯的低级接口…

java 获取td_[Java教程]jQuery获取table表中的td标签

[Java教程]jQuery获取table表中的td标签0 2017-07-28 00:00:08首先我来介绍一下我遇到的问题1.当有一个table表包含了标签&#xff0c;标签&#xff0c;大致可以认为是这样的&#xff1a;scene.ID scene.SceneName scene.QRUrl scene.LocalUrl if (!string.IsNullOrWhiteSpace(…

引用另一模板的宏_生信人值得拥有的编程模板Shell

前言“工欲善其事必先利其器”&#xff0c;生信工程师每天写代码、搭流程&#xff0c;而且要使用至少三门编程语言&#xff0c;没有个好集成开发环境(IDE&#xff0c;Integrated Development Environment)那怎么行&#xff1f;本人使用过vim, editplus, ultraedit, notepad, su…

avlib java_fatal error: libavutil/avconfig.h: No such file...

根据这位仁兄的记录&#xff0c;可以在android程序里调用ffmpeg的avcodec_version()函数&#xff1b;下载了最新版的ffmpeg源码(2.4.1)&#xff0c;在cygwin里用NDK编译时可能会报错&#xff0c;报错如下&#xff1b;your_nameAP-CHN-LP140129 /cygdrive/c/Workspace_my/TestAp…

python 绘制分布直方图_统计学中常见的4种抽样分布及其分布曲线(Python绘制)...

现代统计学奠基人之一、英国统计学家费希尔(Fisher)曾把抽样分布、参书估计和假设检验看作统计推断的三大中心内容。统计学中&#xff0c;需要研究统计量的性质&#xff0c;并评价一个统计推断的优良性&#xff0c;而这些取决于其抽样分布的性质&#xff0c;所以&#xff0c;抽…

js 即时上传php_php+js实现异步图片上传实例分享

Html5 Ajax 上传文件var xhr;function createXMLHttpRequest(){if(window.ActiveXObject){xhr new ActiveXObject("Microsoft.XMLHTTP");}else if(window.XMLHttpRequest){xhr new XMLHttpRequest();}}function UpladFile(){var fileObj document.getElementById(…

php 文件 不更新,php页面不刷新更新数据

php页面不刷新更新数据php页面不刷新更新数据实现起来很简单&#xff0c;我们可以使用前端的ajax技术。ajax作用&#xff1a;ajax技术的目的是让javascript发送http请求&#xff0c;与后台通信&#xff0c;获取数据和信息。实现前后端分离。ajax技术的原理是实例化xmlhttp对象&…