摘要:本篇文章主要讲解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技术探秘→华为各领域的前沿技术、重磅开源项目、创新的应用实践,站在智能世界的入口,探索未来如何照进现实,干货满满点击了解

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

Python图像处理丨图像缩放、旋转、翻转与图像平移的更多相关文章

  1. 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算

    摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...

  2. Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

    摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...

  3. Python图像处理丨认识图像锐化和边缘提取的4个算子

    摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础. 本文分享自华为云社区<[Python图像处理] 十七.图像锐化与边缘检测之Rober ...

  4. Python图像处理丨图像腐蚀与图像膨胀

    摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...

  5. Python图像处理丨三种实现图像形态学转化运算模式

    摘要:本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算.图像闭运算和梯度运算 本文分享自华为云社区<[Python图像处理] 九.形态学之图像开运算.闭运算.梯度运 ...

  6. 跟我学Python图像处理丨何为图像的灰度非线性变换

    摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...

  7. Python图像处理丨带你认识图像量化处理及局部马赛克特效

    摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...

  8. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

    摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...

  9. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...

  10. 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...

随机推荐

  1. 虹科干货| 虹科Redis企业版数据库:告别游戏卡顿,让快乐加速!

    "卡顿一分钟,玩家两行泪" 游戏已成为年轻人最主要的消遣娱乐方式之一,游戏卡顿给玩家带来糟糕游戏体验背后的原因是什么?数据存储与查询速度不够快!   游戏开发领域,不仅拥有海量的数 ...

  2. SpringBoot 项目优雅实现读写分离

    一.读写分离介绍 当使用Spring Boot开发数据库应用时,读写分离是一种常见的优化策略.读写分离将读操作和写操作分别分配给不同的数据库实例,以提高系统的吞吐量和性能. 读写分离实现主要是通过动态 ...

  3. 生成伪随机数 rand;srand函数

    1 相关内容来自鱼c论坛https://fishc.com.cn/forum.php?mod=viewthread&tid=84363&extra=page%3D1%26filter% ...

  4. Python9*9乘法表

    for i in range(1, 10): for j in range(1, i+1): n = i*j print('%s*%s=%s' % (i, j, n), end=' ') if i = ...

  5. offline RL | BCQ:学习 offline dataset 的 π(a|s),直接使用 (s, π(s)) 作为 Q learning 训练数据

    题目: Off-Policy Deep Reinforcement Learning without Exploration,ICLR 2019 pdf 版本:https://arxiv.org/pd ...

  6. mysql可视化工具有哪些?优点是什么?

    MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),由于其开放源代码和高度可定制化的优势,广受开发者欢迎.为了更加高效地管理 MySQL 数据库,我们通常需要使用 MySQL 可视化工具. ...

  7. win32 API 文件夹操作函数整理

    常用操作文件目录的函数 1. CreateDirectory 创建文件夹 原型: BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIB ...

  8. DFT与ATE IP TEST

    IP的DFT设计测试与ATE IP TEST是一个设计,测试活动吗? 不是. 这两个设计对于前端工农村很容易搞混,认为是同一个人负责,同一个活动.实际情不是. DFT主要空DSC控制器对IP进行扫描, ...

  9. [ABC264Ex] Perfect Binary Tree

    Problem Statement We have a rooted tree with $N$ vertices numbered $1,2,\dots,N$. The tree is rooted ...

  10. [ABC266G] Yet Another RGB Sequence

    Problem Statement You are given integers $R$, $G$, $B$, and $K$. How many strings $S$ consisting of ...