Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移

[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移

作者头像
Eastmount
发布于 2021-12-02 13:11:15
发布于 2021-12-02 13:11:15
5.8K00
代码可运行
举报
运行总次数:0
代码可运行

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。

前一篇文章介绍Python调用OpenCV实现图像融合、图像加减法、图像逻辑运算和类型转换。这篇文章将详细讲解图像缩放、图像旋转、图像翻转、图像平移。希望文章对您有所帮助,如果有不足之处,还请海涵~

  • 一.图像缩放
  • 二.图像旋转
  • 三.图像翻转
  • 四.图像平移

该系列在github所有源代码:

  • https://github.com/eastmountyxz/ ImageProcessing-Python

一.图像缩放

图像缩放主要调用resize()函数实现,具体如下:

  • result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])

其中src表示原始图像,dsize表示缩放大小,fx和fy也可以表示缩放大小倍数,他们两个(dsize或fx\fy)设置一个即可实现图像缩放。例如:

  • result = cv2.resize(src, (160,160))
  • result = cv2.resize(src, None, fx=0.5, fy=0.5)

图像缩放:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,sx、sy为缩放因子,则公式如下:

代码示例如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np  
 
#读取图片
src = cv2.imread('test.jpg')

#图像缩放
result = cv2.resize(src, (200,100))
print(result.shape)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示,图像缩小为(200,100)像素。

需要注意的是,代码中 cv2.resize(src, (200,100)) 设置的dsize是列数为200,行数为100。

同样,可以获取原始图像像素再乘以缩放系数进行图像变换,代码如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np  
 
#读取图片
src = cv2.imread('test.jpg')
rows, cols = src.shape[:2]
print(rows, cols)

#图像缩放 dsize(,)
result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

最后讲解(fx,fy)缩放倍数的方法对图像进行放大或缩小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np  
 
#读取图片
src = cv2.imread('test.jpg')
rows, cols = src.shape[:2]
print(rows, cols)

#图像缩放
result = cv2.resize(src, None, fx=0.3, fy=0.3)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

最后输出的结果如下图所示,这是按例比0.3*0.3缩小的。


二.图像旋转

图像旋转主要调用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)是旋转后图像的左上角坐标,则公式如下:

代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np  
 
#读取图片
src = cv2.imread('test.jpg')

#原图的高、宽 以及通道数
rows, cols, channel = src.shape

#绕图像的中心旋转
#参数:旋转中心 旋转度数 scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
#参数:原始图像 旋转参数 元素图像宽高
rotated = cv2.warpAffine(src, M, (cols, rows))

#显示图像
cv2.imshow("src", src)
cv2.imshow("rotated", rotated)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

如果设置-90度,则核心代码和图像如下所示。

  • M = cv2.getRotationMatrix2D( (cols/2, rows/2), -90, 1)
  • rotated = cv2.warpAffine( src, M, (cols, rows))

三.图像翻转

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

  • dst = cv2.flip(src, flipCode)

其中src表示原始图像,flipCode表示翻转方向,如果flipCode为0,则以X轴为对称轴翻转,如果fliipCode>0则以Y轴为对称轴翻转,如果flipCode<0则在X轴、Y轴同时翻转。

代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#读取图片
img = cv2.imread('test.jpg')
src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#图像翻转
#0X轴为对称轴翻转 >0Y轴为对称轴翻转 <0X轴Y轴翻转
img1 = cv2.flip(src, 0)
img2 = cv2.flip(src, 1)
img3 = cv2.flip(src, -1)

#显示图形
titles = ['Source', 'Image1', 'Image2', 'Image3']  
images = [src, img1, img2, img3]  
for i in range(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下图所示:


四.图像平移

图像平移:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,dx、dy为偏移量,则公式如下:

图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下:

  • M = np.float32([[1, 0, x], [0, 1, y]])
  • shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

完整代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#encoding:utf-8
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#读取图片
img = cv2.imread('test.jpg')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#图像平移 下、上、右、左平移
M = np.float32([[1, 0, 0], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#显示图形
titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  
images = [img1, img2, img3, img4]  
for i in range(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下图所示:


五.总结

本文主要讲解Python和OpenCV的图像基础处理,具体内容包括:

  • 一.图像缩放
  • 二.图像旋转
  • 三.图像翻转
  • 四.图像平移

源代码下载地址,记得帮忙点star和关注喔!

  • https://github.com/eastmountyxz/ ImageProcessing-Python

参考文献,在此感谢这些大佬,共勉!

  • [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社, 2013.
  • [2] 毛星云, 冷雪飞. OpenCV3编程入门[M]. 电子工业出版社, 2015.
  • [3] https://blog.csdn.net/Eastmount
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CVE-2019-12384漏洞分析及复现
近期关于Jackson的RCE漏洞CVE-2019-12384爆出,漏洞的复现以及依赖,这里已经给出,我这里就使用虚拟机里的java的环境重新复现了一下,权当向各位大佬学习。
洛米唯熊
2019/07/30
2.3K0
CVE-2019-12384漏洞分析及复现
CVE-2020-9548:Jackson-databind RCE
2020年3月,jackson-databind在github上更新了一个新的反序列化利用类br.com.anteros.dbcp.AnterosDBCPConfig,该类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成RCE。
Al1ex
2022/09/07
7240
CVE-2020-9548:Jackson-databind RCE
JavaEE开发使用Maven管理的SpringMVC工程
前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC。SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来也是比较顺手的。低耦合,高内聚,利用一些注解以及Java配置类就能很好的实现解耦。今天我们就来看一下如何使用Maven来配置SpringMVC, 然后在我们的Web工程中进行使用。 本篇博客是上一篇博客的续写,在上篇博客中我们详细的讲了Java环境的配置,Java EE版本的Eclipse的安装、Maven的安装与配置,Tomcat的安装与配置。并且
lizelu
2018/01/11
8610
JavaEE开发使用Maven管理的SpringMVC工程
MessagePack Java Jackson Dataformat - 安装
本页面中的所有示例程序,请到代码库 https://github.com/cwiki-us-demo/serialize-deserialize-demo-java 中下载进行测试。
HoneyMoose
2019/08/09
4260
1. 初识Jackson -- 世界上最好的JSON库
各位小伙伴大家好,我是A哥。上篇文章 【Fastjson到了说再见的时候了】 A哥跟Fastjson说了拜拜,从本系列开始,我们将一起进入Jackson库的学习。当然喽说它是世界上最好的JSON库并非一家之言,是官网上它自己说的,我免责申明哈。
YourBatman
2020/11/24
1.5K0
1. 初识Jackson -- 世界上最好的JSON库
Jackson 中使用 Optional
在本文中,我们会对 Optional 类进行一些说明,并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。
HoneyMoose
2024/05/06
1610
Jackson 中使用 Optional
CVE-2020-36189:Jackson-databind SSRF&RCE
com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成SSRF&RCE。
Al1ex
2021/04/01
1.3K0
CVE-2020-36189:Jackson-databind SSRF&RCE
使用Protostuff实现序列化与反序列化
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
全栈程序员站长
2022/08/20
7010
CVE-2020-36186:jackson-databind RCE
org.apache.tomcat.dbcp.dbcp.datasources.PerUserPoolDataSource类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成RCE。
Al1ex
2021/07/21
8210
CVE-2020-36186:jackson-databind RCE
【安全研究】Jackson 学习笔记
Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的Java Json解析器",目前Jackson主要有1.x和2.x两个分支版本,其中1.x的类库中包命名以org.codehaus.jackson.xxx开头,2.x类库中包命令com.fastxml.jackson.xxx开头,Jackson框架包含以下3个核心库:
Al1ex
2023/03/29
1.9K0
【安全研究】Jackson 学习笔记
CVE-2020-36179/80/81/82:Jackson-databind SSRF&RCE
以下类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成SSRF&RCE:
Al1ex
2022/09/07
4760
CVE-2020-36179/80/81/82:Jackson-databind SSRF&RCE
CVE-2020-24750:Jackson-databind RCE
com.pastdev.httpcomponents.configuration.JndiConfiguration类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成RCE。
Al1ex
2021/07/21
1.2K0
CVE-2020-24750:Jackson-databind RCE
【Java对象转换】003- Java 对象与 Yaml 互转
可参考本人其他文章:《【Spring Boot】003-yaml语法》 https://blog.csdn.net/qq_29689343/article/details/108545693 二、yaml语法
訾博ZiBo
2025/01/06
790
CVE-2019-12086:jackson 反序列化读取文件
在开启DefaultTyping的情况下,jackson在反序列化json时,可以指定反序列化类,且可以指定一个基础类型的值作为这个类的构造函数的参数的值。
Al1ex
2022/09/07
1.3K0
CVE-2019-12086:jackson 反序列化读取文件
RabbitMQ 消息转换器
SpringAMQP中消息队列传递Object对象,是通过JDK将Object对象的进行序列化,但JDK默认性能较差,同时AMQP协议封装数据是字节流,将来在RabbitMQ客户端看起来是一长串,我们通过修改底层默认MessageConverter处理。可以实现Json形式传递,短小精悍,性能也更好一些!
收心
2022/08/24
1.5K0
Spring 4 Spring MVC 4 REST + Jackson @JsonView集成实例详解
分享一个使用SpringMVC4 Rest 和Jackson的@JsonView注解集成的实例。@JsonView用来过滤JSON响应。Spring4.1开始直接支持@JsonView注解。要使用@JsonView,首先我们需要定义视图,我们可以定义多个视图。一个视图定义可以继承其他视图定义。我们的POJO使用@JsonView注解属性传递已经定义的视图。在Spring的Controller我们可以使用Jackson的@JsonView注解我们的方法。序列化Http响应体的时候,JSON响应将在配置视图的基础上进行过滤。我们也可以在Spring REST Client使用@JsonView注解。Spring提供了MappingJacksonValue 包装POJO和序列化视图设置,在发送到web服务器短的时候,我们可以使用RestTemplate来过滤JSON。现在一步一步呈现完整的示例。
青山师
2023/05/04
9370
Spring 4 Spring MVC 4 REST + Jackson @JsonView集成实例详解
Java进阶|Springboot切换fastjson序列化实战
在SpringBoot中,默认情况下使用的是Jackson作为JSON的序列化和反序列化库。但有时候,我们可能需要切换到其他的JSON库,比如Fastjson。Fastjson是阿里巴巴的一个开源项目,它提供了高性能的JSON序列化和反序列化功能。
六月暴雪飞梨花
2024/01/28
1.7K1
Java进阶|Springboot切换fastjson序列化实战
1. 初识Jackson -- 世界上最好的JSON库
各位小伙伴大家好,我是A哥。上篇文章 【Fastjson到了说再见的时候了】 A哥跟Fastjson说了拜拜,从本系列开始,我们将一起进入Jackson库的学习。当然喽说它是世界上最好的JSON库并非一家之言,是官网上它自己说的,我免责申明哈。
YourBatman
2020/07/07
1.2K0
1. 初识Jackson -- 世界上最好的JSON库
Jackson JDOM XSLTransformer Gadget浅析
最近看的一个Jackson反序列化深入利用+XXE攻击的漏洞,觉得比较新奇,所以简单分析一下~
Al1ex
2021/07/21
1K0
Jackson JDOM XSLTransformer Gadget浅析
放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)
在上篇《经过多方调研,最终还是决定禁用FastJson!》中,讲了FastJson的基本使用以及存在的不确定性问题,所以最终决定在项目中放弃使用,进而选择市面上比较主流,Spring Boot默认绑定的JSON类库:Jackson。
程序新视界
2021/03/02
3.8K0
相关推荐
CVE-2019-12384漏洞分析及复现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验