Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转

【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转

作者头像
用户5410712
发布于 2022-06-01 11:08:28
发布于 2022-06-01 11:08:28
1.3K00
代码可运行
举报
文章被收录于专栏:居士说AI居士说AI
运行总次数:0
代码可运行

牛顿第一运动定律:物体加速度的大小跟作用力成正比,跟物体的质量成反比,且与物体质量的倒数成正比;加速度的方向跟作用力的方向相同。该定律是由艾萨克·牛顿在1687年于《自然哲学的数学原理》一书中提出的。

前言

在上期的文章(【图像篇】OpenCV图像处理(六)---图像混合VS按位运算)中,我们学习了图像混合的实际操作,其实就是图像按照不同权重的叠加,今天我们继续来学习别的图像处理知识点-图像平移VS图像旋转。

图像平移

一、图像平移简介

简单的说图像平移就是对图像像素进行操作,从而实现图像左右上下平移的功能,其实图像平移也是属于仿射变换的一种,我们接着往下看。

1.1 原始图像

1.1 代码实践

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入opencv包
import cv2
# 导入numpy包进行科学运算
import numpy as np
# opencv读取图片数据
img = cv2.imread('ys.jpg')

# 获取图像的高度和宽度 为后面的平移做准备
img_height = img.shape[0]
img_width = img.shape[1]

# 显示原始图像 与新图像进行对比
cv2.imshow("img", img)

# 定义变换矩阵 向左平移5个像素, 向上平移50个像素
# 注意这两个坐标的第一维度和第二维度不要改动
# 第三维才是要平移的参数
temp = np.float32([[1, 0, -5], [0, 1, -20]])
# 进行2D 仿射变换(平移变换)
new_image = cv2.warpAffine(img, temp, (img_width, img_height))
# 显示新图像
cv2.imshow("new_image", new_image)
#等待任意按键按下
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解读:

在上面的代码中,主要注意这个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.warpAffine(img, temp, (img_width, img_height))

有三个参数,第一个是需要平移的图像,第二个是图像平移的信息(左移,上移等等),第三个就是图像原始的宽度和高度。

1.1 效果展示

图像旋转

二、图像旋转

图像旋转顾名思义就是将图像按照一个对称点进行某个度数的旋转,可以使顺时针,也可以是逆时针,下面来看看实战吧。

2.1 原始图像

2.2 代码实践

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*- 
# 导入各种函数包
import numpy as np
import cv2
from math import cos,sin,radians
from matplotlib import pyplot as plt

# 读入图像数据
img = cv2.imread('TaM.jpg')

# 获取图像的高度和宽度 为后面的旋转做准备
img_height = img.shape[0]
img_width = img.shape[1]

# 获取图像中点, 作为旋转的中心点
# 此处 用int是因为单纯的/2得到的不是整数
# 因此也可以直接//2 就可以不用int来变换了
cx = int(img_width / 2)
cy = int(img_height / 2)

cv2.imshow("img", img)


# 确定旋转的中心点
center = (cx, cy)

image_dim = (img_width, img_height)

# 进行2D 仿射变换
# 围绕原点 逆时针旋转40M = cv2.getRotationMatrix2D(center=center,angle=40, scale=1.0)
rotated_40 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_40", rotated_40)

# 围绕原点 逆时针旋转50M = cv2.getRotationMatrix2D(center=center,angle=50, scale=1.0)
rotated_50 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_50", rotated_50)

# 围绕原点  逆时针旋转70M = cv2.getRotationMatrix2D(center=center,angle=70, scale=1.0)
rotated_70 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_70", rotated_70)

#等待任意按键按下
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解读:

在上面的代码中,我们主要关注这个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cv2.getRotationMatrix2D(center=center,angle=70, scale=1.0)

注意其参数的设置,分别是中心点,角度,规模(尺寸)设置 ,这里已经在注释中写的很明白了,大家好好看看一定没问题的。

2.代码扩展

上面的的代码是否有些冗长呢?可以看到我们coding了三个几乎同样的代码去实现不同度数的图像旋转,那么我们是否可以直接采用一个函数,只是传入的参数(角度)不同,就可以实现任意度数的图像旋转呢?答案是肯定的,我们采用带有参数的函数形式就好了,一起来看看吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*- 
# 导入各种函数包
import numpy as np
import cv2
from math import cos,sin,radians
from matplotlib import pyplot as plt

def image_Rotation(image, rotation):
    # 读入图像数据
    img = cv2.imread(image)
        # 获取图像的高度和宽度 为后面的旋转做准备
    img_height = img.shape[0]
    img_width = img.shape[1]

    # 获取图像中点, 作为旋转的中心点
    # 此处 用int是因为单纯的/2得到的不是整数
    # 因此也可以直接//2 就可以不用int来变换了
    cx = int(img_width / 2)
    cy = int(img_height / 2)

    cv2.imshow("img", img)


    # 确定旋转的中心点
    center = (cx, cy)

    image_dim = (img_width, img_height)

    # 进行2D 仿射变换
    M = cv2.getRotationMatrix2D(center=center,angle=rotation, scale=1.0)
    rotated_img = cv2.warpAffine(img, M, image_dim)
    cv2.imshow("rotated_img_{}".format(rotation), rotated_img)
    # #等待任意按键按下
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    # 给出image参数值:图像路径
    image = './TaM.jpg'
    # 给出rotation参数值:旋转度数
    rotation = 60
    image_Rotation(image, rotation)
    print("finished")

3.扩展代码后的效果演示

2.3 效果展示

结语

今天的分享结束了,代码量不是很多,理解还是要花点时间的,图像平移和旋转都是类似的像素空间操作,大家自行体会哦,另外,大家可以发现,小编的文章在数学知识上讲的比较少,一方面是小编的时间有限,更重要的方面是图像的数学知识涉及到微积分,矩阵等知识,有时候讲了,大家可能不太好理解,因此小编就讲的比较少,后面可能多讲一点,如果大家有不懂的涉及图像的数学知识,请私聊小编,我们一起来解决,好了,我们下期再见!

编辑:玥怡居士|审核:小圈圈居士

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT进阶之旅 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
华人学者彭泱获顶会最佳论文奖:如何最快求解“诺亚方舟上的鸡兔同笼问题”?靠“猜”
但是,近日,来自佐治亚理工学院的华人学者彭泱(Richard Peng)却凭借“迭代猜测”策略,提出了一种能够更快求解线性方程组的方法,并因此获得 2021 年算法顶会 ACM-SIAM 的最佳论文奖!
AI科技评论
2021/03/11
8390
日拱一卒,麻省理工的线性代数课,人工智能的梦想从这里起航
相信只要是计算机专业出身的小伙伴,应该都上过线性代数。不知道大家大一在上这门课的时候,是否有怀疑过它的用途?至少当时老师和我说它在搜索引擎等许多黑科技当中广泛使用的时候,我是毫无概念的。学的时候也只是当做纯理论来学习,也没有太过深入的思考和理解。
TechFlow-承志
2022/09/21
6020
日拱一卒,麻省理工的线性代数课,人工智能的梦想从这里起航
从几何角度理解矩阵
矩阵变换是线性代数中的主要内容,如何理解它?本文以几何角度,理解线性变换中的矩阵,能帮助学习者对其建立直观音箱。
老齐
2021/10/21
1.3K0
凸优化(9)——近端牛顿方法;矩阵论/数值线性代数基础:浮点数运算
这一节我们会接着上一节,介绍完近端牛顿方法(Proximal Newton Method),剩下的时间会拿来介绍一些基本的矩阵论和数值计算的知识,用于对之后介绍高阶方法的铺垫~
学弱猹
2021/08/09
8510
「Deep Learning」读书系列分享第二章:线性代数 | 分享总结
「Deep Learning」这本书是机器学习领域的重磅书籍,三位作者分别是机器学习界名人、GAN 的提出者、谷歌大脑研究科学家 Ian Goodfellow,神经网络领域创始三位创始人之一的蒙特利尔大学教授 Yoshua Bengio(也是 Ian Goodfellow 的老师)、同在蒙特利尔大学的神经网络与数据挖掘教授 Aaron Courville。只看作者阵容就知道这本书肯定能够从深度学习的基础知识和原理一直讲到最新的方法,而且在技术的应用方面也有许多具体介绍。这本书面向的对象也不仅是学习相关专业的
AI研习社
2018/03/19
1.1K0
「Deep Learning」读书系列分享第二章:线性代数 | 分享总结
人工智能中的线性代数:如何理解并更好地应用它
看起来就让人头大?你的脑海随即会浮现出两个问题:它们都是从哪儿来的?为什么需要这些运算?
机器之心
2019/11/05
1K0
人工智能中的线性代数:如何理解并更好地应用它
利用 Numpy 进行矩阵相关运算
NumPy 是Python数据分析必不可少的第三方库,NumPy 的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型。如今,NumPy 被Python其它科学计算包作为基础包,已成为 Python 数据分析的基础,可以说 NumPy 就是SciPy、Pandas等数据处理或科学计算库最基本的函数功能库。
fireWang
2019/04/24
1.3K0
利用 Numpy 进行矩阵相关运算
日拱一卒,麻省理工的线性代数课,矩阵乘法和逆矩阵
这几天一直在成都办事,每天回来都倒头就睡,实在是没有时间,所以耽误了几天更新。之后会逐渐回到正轨~
TechFlow-承志
2022/09/21
6830
日拱一卒,麻省理工的线性代数课,矩阵乘法和逆矩阵
日拱一卒,麻省理工的线性代数课,列空间和零空间
今天我们继续MIT的线性代数课程,这一节课的内容关于列空间和零空间。这两个概念同样在线性代数当中非常重要,并且是国内教材相对比较欠缺的,对于我们系统性地理解和掌握这门课程非常有帮助。
TechFlow-承志
2022/09/21
5150
日拱一卒,麻省理工的线性代数课,列空间和零空间
利用 Numpy 进行矩阵相关运算
NumPy 是Python数据分析必不可少的第三方库,NumPy 的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型。如今,NumPy 被Python其它科学计算包作为基础包,已成为 Python 数据分析的基础,可以说 NumPy 就是SciPy、Pandas等数据处理或科学计算库最基本的函数功能库。
fireWang
2019/03/13
2.3K0
鸡兔同笼终于可以靠「猜」了!佐治亚理工学者求解新方法获顶会最佳论文奖
这是《孙子算经》中鸡兔同笼问题的经典描述。我们知道,二元一次方程组可以解决这个问题。求解线性系统有矩阵乘法等多种方法,但或许你不知道,靠「猜」也是可以的。
机器之心
2021/03/15
6900
鸡兔同笼终于可以靠「猜」了!佐治亚理工学者求解新方法获顶会最佳论文奖
矩阵可逆-我们能不能回到当初第一次见面的模样
标题的意思就是,能不能回到我送你进矩阵之前的模样,要是还能回去那就是可逆,可逆其实讲的是“原料”。有没有那么一个矩阵,可以把变换过的原料再变回去。
云深无际
2024/10/12
2070
矩阵可逆-我们能不能回到当初第一次见面的模样
日拱一卒,麻省理工的线性代数课,消元法解线性方程
我们今天继续麻省理工的线性代数,昨天有同学给我留言问我,为什么不选最新版的视频,要选05版的。这里简单解释一下,主要有这么几个原因。
TechFlow-承志
2022/09/21
7120
万字长文带你复习线性代数!
课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_LA16.html
石晓文
2018/12/25
1.6K0
万字长文带你复习线性代数!
五分钟了解这几个numpy的重要函数
数据挖掘的理论背后,几乎离不开线性代数的计算,如矩阵乘法、矩阵分解、行列式求解等。本文将基于numpy模块实现常规线性代数的求解问题,需要注意的是,有一些线性代数的运算并不是直接调用numpy模块,而是调用numpy的子模块linalg(线性代数的缩写)。该子模块涵盖了线性代数所需的很多功能,本文将挑几个重要的例子加以说明。
1480
2019/07/15
6670
五分钟了解这几个numpy的重要函数
精通Excel数组公式020:MMULT数组函数
MMULT表示矩阵乘法(matrix multiplication)。学习过前面文章的朋友,可能已经意识到乘法矩阵在Excel公式中有很多应用。
fanjy
2021/03/12
2.4K0
呆在家无聊?何不抓住这个机会好好学习!
本公众号一向坚持的理念是数据分析工具要从基础开始学习,按部就班,才能深入理解并准确利用这些工具。鼠年第一篇原创推送比较长,将从基础的线性代数开始。线性代数大家都学过,但可能因为联系不到实用情况,都还给了曾经的老师。线性代数是数理统计尤其是各种排序分析的基础,今天我将以全新的角度基于R语言介绍线性代数,并手动完成PCA分析,从而强化关于线性代数和实际数据分析的联系。
SYSU星空
2022/05/05
7910
呆在家无聊?何不抓住这个机会好好学习!
高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵。 高斯消元法的原理是: 若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程
Angel_Kitty
2018/04/09
20.3K0
高斯消元法(Gauss Elimination)【超详解&模板】
Python实现所有算法-矩阵的LU分解
大家不要愁,数值算法很快就会写完,之后会写一些有趣的算法。前面的文章里面写了一些常见的数值算法,但是却没有写LU分解,哎呦不得了哦!主要的应用是:用来解线性方程、求反矩阵或计算行列式。
云深无际
2022/08/05
8510
Python实现所有算法-矩阵的LU分解
LinearAlgebra_1
方程组的几何解释 linear equation row picture column picture 矩阵计算的两种方法 some questions 需要思考的其他问题 矩阵消元 回顾 主题 消元
用户1147754
2018/01/02
1K0
推荐阅读
相关推荐
华人学者彭泱获顶会最佳论文奖:如何最快求解“诺亚方舟上的鸡兔同笼问题”?靠“猜”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验