Python图像处理丨图像缩放、旋转、翻转与图像平移_根据用户选择的菜单实现图像的3种翻转!python-程序员宅基地

技术标签: 程序员  python  图片翻转  计算机视觉  图像处理  图片缩放  技术交流  

摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。

本文分享自华为云社区《[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移》,作者:eastmount 。

本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。全文均是基础知识,希望对您有所帮助。

一.图像缩放

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

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

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

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

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

代码示例如下所示:

#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。

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

#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)缩放倍数的方法对图像进行放大或缩小。

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

代码如下所示:

#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轴方向同时翻转。

代码如下所示:

#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)

#图像翻转
#0以X轴为对称轴翻转 >0以Y轴为对称轴翻转 <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 xrange(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]))

完整代码如下所示:

#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 xrange(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下图所示:

华为伙伴暨开发者大会2022火热来袭,重磅内容不容错过!

【精彩活动】勇往直前·做全能开发者→12场技术直播前瞻,8大技术宝典高能输出,还有代码密室、知识竞赛等多轮神秘任务等你来挑战。即刻闯关,开启终极大奖!点击踏上全能开发者晋级之路吧!

【技术专题】未来已来,2022技术探秘→华为各领域的前沿技术、重磅开源项目、创新的应用实践,站在智能世界的入口,探索未来如何照进现实,干货满满点击了解。

点击关注,第一时间了解华为云新鲜技术~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/devcloud/article/details/124985501

智能推荐

iMeta | 南农沈其荣团队发布微生物网络分析和可视化R包ggClusterNet-程序员宅基地

文章浏览阅读1k次。点击蓝字 关注我们ggClusterNet:包含多种基于模块可视化布局算法的微生物网络挖掘R包https://doi.org/10.1002/imt2.32SHORT COMMUNICATIONVolume1, Issue3●2022年6月13日,南农沈其荣团队在iMeta在线发表了题为“ggClusterNet: An R package for microbiome ..._微生物网络分析需要把所有数据都输入吗

exec用法_-exec-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏18次。 博客 学院 下载 GitChat TinyMind 论坛 APP 问答 商城 VIP 活动 招聘 ITeye 写博客 发Chat 登录注册 我的博客 消息(3) 帐号设置 反馈 帮助 退出 转一个强大的linux命令——find之exec2017年01月09日 11:23:20阅读数:7..._-exec

在单片机上利用一个定时器和二行代码轻轻松松实现多任务的运行(基于时间片)_一个定时器执行多个程序-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏14次。因为我常用的是stm32F4系列单片机,所以采用其滴答定时器作为时基定时器(如果你使用的单片机是别款,只要单片机上有个定时器都可以,另外也得有中断处理函数)(另外如果用的是stm32等单片机,片上具有滴答定时器,可以省掉1、2步骤,在HAL库下直接用HAL_GetTick()代替GetCount()即可,其他类似)1.首先初始化定时器,本人一般设置定时时间为1ms,这个可以是具体情况而定。..._一个定时器执行多个程序

python 使用matplotlib绘图时 出现Exceeded cell block limit (set ‘agg.path.chunksize‘ rcparam)_exceeded cell block limit (set 'agg.path.chunksize-程序员宅基地

文章浏览阅读5.2k次。首先,如果你的数据长度在百万级左右的,正常是不会出现这句话的。所以用不到下面两句话:matplotlib.rcParams['agg.path.chunksize'] = 10000matplotlib.rcParams.update(matplotlib.rc_params())大概率是本身数据里面存在问题,比如我经常碰到的,整个数据中有个别字符串类型的,与其他的double类型数据不一样。..._exceeded cell block limit (set 'agg.path.chunksize' rcparam)

iPhone开发之UITableView的小试牛刀 利用MVC模式从plist文件读取数据并字典转模型的格式实现_[self settingframe];-程序员宅基地

文章浏览阅读1k次。新建一个具有simple VIew的工程,并把相关图片拉进资源文件夹在Supporting files文件夹下新建work.plist文件,编辑内容如下图:在工程下新建model文件夹,并在文件夹内新建model类Hero根据文件的字典属性编辑Hero.h如下://// Hero.h// 作业整理//// Created by apple on 15/9/_[self settingframe];

数据质量最佳实践案例:如何利用数据质量来实现业务文化_数据质量工程实践-程序员宅基地

文章浏览阅读3.9k次。作者:禅与计算机程序设计艺术 《57. 数据质量最佳实践案例:如何利用数据质量来实现业务文化》引言随着数字化时代的到来,数据已经成为企业成功的基础。数据质量的保证和数据文化的建设,对于企业的业务发展和良好的数据_数据质量工程实践

随便推点

Android自定义View获取background的颜色和图片_android view 获取背景颜色-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏4次。我们自定义View的时候有时会用到background,为了调用者更好的使用,我们可以复用Android自带的background属性,而不是自定义属性.获取并修改background的内容如下(以自定义TextView为例): paint = new Paint(); paint.setAntiAlias(true); Drawable backgro_android view 获取背景颜色

org/jaxen/JaxenException-程序员宅基地

文章浏览阅读1.2k次。dom4j用到xpath的时候要用到相应的jar包jaxen.jar,没这个包就报上边的错了._ora/jaxen/jaxenexception

阿里飞冰 设置 vscode 编辑器 启动脚本_vscode插件飞冰-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏6次。文章目录检查vscode安装设置阿里飞冰 编辑器检查vscode安装win+Rcmdcode --version设置阿里飞冰 编辑器设置自定义编辑器启动脚本code ${cwd}_vscode插件飞冰

chatgpt赋能python:Python构造函数的作用_python中构造函数有什么用-程序员宅基地

文章浏览阅读68次。在Python中,构造函数是一种特殊的函数,用于创建和初始化对象。当我们创建一个新的对象时,Python将会自动调用该对象的构造函数。构造函数可用于指定对象的属性和初始状态。在Python中,构造函数的名称是__init__,它是一个方法(函数),通常是在类定义中定义的。当我们创建一个新的对象时,Python将会自动调用对象的__init__方法。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc。_python中构造函数有什么用

查看sdk版本号-程序员宅基地

文章浏览阅读145次。命令:getprop | grep rksdk。_查看sdk版本

获取项目中文件路径-程序员宅基地

文章浏览阅读4.4k次。获取项目中文件路径Class.getResource 与 ClassLoader.getResource区别方式入参返回Class.getResource()文件路径参数,绝对路径或相对路径(相对于该class类)URLClassLoader.getSystemResource()文件路径参数,相对路径(相对于项目的包的根目录来解析路径的)URL..._获取项目中文件路径