OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

2023-11-09

1. 学习目标

  1. 学习 OpenCV 图像的翻转函数 cv.flip;
  2. 学习 NumPy 矩阵的反转函数 np.flip;
  3. 自己实现矩阵反转的函数。

2. OpenCV 翻转

翻转也称镜像,是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转,垂直镜像是将图像沿水平中轴线进行上下翻转,水平垂直镜像是水平镜像和垂直镜像的叠加。

2.1 cv.flip() 函数说明
cv.flip(src, flipCode[, dst]) -> dst
2.2 参数说明
参数 说明
src 表示输入图像。
flipCode 表示翻转轴线的控制参数,整型(int)。
dst 表示变换操作的输出图像,可选项。
2.3 flipCode 值说明
说明
0 表示水平翻转。
1 表示垂直翻转。
-1 表示对角线翻转。

3. 翻转实例

3.1 实例代码
import cv2 as cv
import numpy as np

# 图像翻转
def image_flip():
  img = cv.imread("./images/lena.jpg")
  cv.imshow("original", img)
  # 水平翻转
  horizontally_img = cv.flip(img,0)
  cv.imshow("horizontally_img", horizontally_img)
  # 垂直翻转
  vertically_img = cv.flip(img,1)
  cv.imshow("vertically_img", vertically_img)
  # 对角线翻转
  horizontally_vertically_img = cv.flip(img,-1)
  cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
  cv.waitKey(0)
  cv.destroyAllWindows()
if __name__ == "__main__":
  image_flip()
3.2 翻转效果

输入图片说明

4. 矩阵反转

4.1 np.flip() 函数说明
numpy.flip(array, axis) → dst_array
4.2 参数说明
参数 说明
array 表示输入的数组。
axis 表示[integer]轴,阵列沿此轴反转。
4.3 axis 值说明
说明
0 表示上下反转。
1 表示左右反转。

5. 反转实例

5.1 实例代码
import cv2 as cv
import numpy as np

# 阵列反转
def image_np_flip():
  img = cv.imread("./images/lena_small.jpg")
  cv.imshow("original", img)
  # 水平翻转
  horizontally_img = np.flip(img,0)
  cv.imshow("horizontally_img", horizontally_img)
  # 垂直翻转
  vertically_img = np.flip(img,1)
  cv.imshow("vertically_img", vertically_img)
  # 对角线翻转
  horizontally_vertically_img0 = np.flip(img,0)
  horizontally_vertically_img = np.flip(horizontally_vertically_img0,1)
  cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
  cv.waitKey(0)
  cv.destroyAllWindows()
if __name__ == "__main__":
  image_np_flip()
5.2 反转效果

输入图片说明

6. 实现阵列反转

6.1 实现阵列上下反转
  1. 获取阵列的宽高值;
  2. 复制一份改阵列,防止反转的时候影响了原阵列;
  3. 上下翻转只需要循环阵列的行,将第一行和最后一行互换,将第二行和倒数第二行互换!!!
  4. 注意:由于 range 是从 0 开始,所以最后一行需要先减 1!!!
  5. 注意:解构赋值直接将两个值进行互换,但是换的第一个值需要复制一份互换np.copy(src[i])!!!
# 上下翻转
def flip_ud(src):
  h,w,c = src.shape
  src = np.copy(src)
  for i in range(h//2):
    # cur = np.copy(src[i])
    # src[i] = src[h-i-1]
    # src[h-i-1] = cur
    src[i],src[h-i-1] = src[h-i-1],np.copy(src[i])
  return src
6.2 实现阵列左右反转
  1. 对比上下反转,左右反转需要循环列一层的互换!!!
# 左右翻转
def flip_lr(src):
  h,w,c = src.shape
  src = np.copy(src)
  for i in range(h):
    for j in range(w//2):
      src[i][j],src[i][w-j-1] = src[i][w-j-1],np.copy(src[i][j])
  return src
6.3 实现阵列左上角和右下角反转
# 图像左上角和右下角翻转
def flip_lu_rd(src):
  h,w,c = src.shape
  src = np.copy(src)
  # 左上角和右下角翻转
  for i in range(h//2):
    for j in range(w//2):
      src[i][j],src[h-i-1][w-j-1] = src[h-i-1][w-j-1],np.copy(src[i][j])
  return src
6.4 使用 6.3 的方法实现对角线反转
  1. 图像左上角和右下角翻转;
  2. 右上角和左下角翻转;
    2.1 左右翻转;
    2.2 图像左上角和右下角翻转;
    2.3 左右翻转图像还原。
def flip_ud_lr(src):
  # 图像左上角和右下角翻转
  src = flip_lu_rd(src)
  # 右上角和左下角翻转
  # 1. 左右翻转
  src = flip_lr(src)
  # 2. 图像左上角和右下角翻转
  src = flip_lu_rd(src)
  # 3. 左右翻转图像还原
  src = flip_lr(src)
  return src
6.5 直接使用 6.1 和 6.2 实现对角线反转
def flip_ud_lr(src):
  # 上下翻转
  src = flip_ud(src)
  # 左右翻转
  src = flip_lr(src)
  return src

7. 实现图像翻转实例

7.1 翻转实例代码
# 上下翻转
def flip_ud(src):
  h,w,c = src.shape
  src = np.copy(src)
  for i in range(h//2):
    # cur = np.copy(src[i])
    # src[i] = src[h-i-1]
    # src[h-i-1] = cur
    src[i],src[h-i-1] = src[h-i-1],np.copy(src[i])
  return src

# 左右翻转
def flip_lr(src):
  h,w,c = src.shape
  src = np.copy(src)
  for i in range(h):
    for j in range(w//2):
      src[i][j],src[i][w-j-1] = src[i][w-j-1],np.copy(src[i][j])
  return src

# 图像左上角和右下角翻转
def flip_lu_rd(src):
  h,w,c = src.shape
  src = np.copy(src)
  # 左上角和右下角翻转
  for i in range(h//2):
    for j in range(w//2):
      src[i][j],src[h-i-1][w-j-1] = src[h-i-1][w-j-1],np.copy(src[i][j])
  return src

def flip_ud_lr(src):
  # 图像左上角和右下角翻转
  src = flip_lu_rd(src)
  # 右上角和左下角翻转
  # 1. 左右翻转
  src = flip_lr(src)
  # 2. 图像左上角和右下角翻转
  src = flip_lu_rd(src)
  # 3. 左右翻转图像还原
  src = flip_lr(src)
  return src

def image_self_flip():
  img = cv.imread("./images/lena_small.jpg")
  # cv.imshow("original", img)
  # 水平翻转
  horizontally_img = flip_ud(img)
  cv.imshow("horizontally_img", horizontally_img)
  # 垂直翻转
  vertically_img = flip_lr(img)
  cv.imshow("vertically_img", vertically_img)
  # 对角线翻转
  horizontally_vertically_img = flip_ud_lr(img)
  cv.imshow("horizontally_vertically_img", horizontally_vertically_img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  image_self_flip()
实现效果

输入图片说明

8. 总结

  1. 注意: 阵列的反转OpenCV 的翻转 对比,少了对角线翻转,但是使用【上下反转+左右反转】能够实现相同的效果;
  2. 自己使用循环阵列的方法实现水平、垂直、对角线翻转,但是相比原生方法,计算很慢,需要进行优化!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip) 的相关文章

  • 根据 pandas 中的条件交换列值

    我想按条件重新定位列 如果国家 地区是 日本 我需要将姓氏和名字反向重新定位 df pd DataFrame France Kylian Mbappe Japan Hiroyuki Tajima Japan Shiji Kagawa Eng
  • 为什么方法无法访问类变量?

    我试图理解Python中的变量作用域 除了我不明白为什么类变量不能从其方法访问的部分之外 大多数事情对我来说都很清楚 在下面的例子中mydef1 无法访问a 但如果a可以在全局范围 类定义之外 声明 class MyClass1 a 25
  • 如何用spaCy获取依赖树?

    我一直在尝试寻找如何使用 spaCy 获取依赖树 但我找不到任何有关如何获取树的信息 只能在如何导航树 https spacy io usage examples subtrees 如果有人想轻松查看 spacy 生成的依赖关系树 一种解决
  • Pytest:如何使用从夹具返回的列表来参数化测试?

    我想使用由固定装置动态创建的列表来参数化测试 如下所示 pytest fixture def my list returning fixture depends on other fixtures return a dynamically
  • 对打开文件的脚本进行单元测试

    我编写了一个脚本 它打开一个文件 读取内容并进行一些操作和计算 并将它们存储在集合和字典中 我该如何为这样的事情编写单元测试 我的问题具体是 我会测试文件是否打开 文件很大 这是unix字典文件 我如何对计算进行单元测试 我真的必须手动计算
  • 如何在“python setup.py test”中运行 py.test 和 linter

    我有一个项目setup py文件 我用pytest作为测试框架 我还在我的代码上运行各种 linter pep8 pylint pydocstyle pyflakes ETC 我用tox在多个 Python 版本中运行它们 并使用以下命令构
  • 无法安装时间模块

    我试过了pip install time and sudo H pip install time 但我不断收到错误 找不到满足要求时间的版本 从 版本 未找到时间匹配的发行版 我正在 PyCharm 中工作 但真正没有意义的是我可以在 Py
  • 远程控制或脚本打开 Office 从 Python 编辑 Word 文档

    我想 最好在 Windows 上 在特定文档上启动 Open Office 搜索固定字符串并将其替换为我的程序选择的另一个字符串 我该如何从外部 Python 程序中做到这一点 OLE 什么 原生 Python 脚本解决方案 The doc
  • pandas 两个数据框交叉连接[重复]

    这个问题在这里已经有答案了 我找不到有关交叉联接的任何内容 包括合并 联接或其他一些内容 我需要使用 my function 作为 myfunc 处理两个数据帧 相当于 for itemA in df1 iterrows for itemB
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 如何在 Keras 中使用部分输入进行训练,其余部分用于损失函数

    我是 Keras 新手 正在尝试实现神经网络机器学习模型 输入张量看起来像 X1 X2 和输出 Y 注意 X1 和 X2 是相关的 在模型中 只有 X1 将用于训练 但 X1 和 X2 都将传递给损失函数 该损失函数是 X1 X2 y pr
  • 如何使用注释和聚合在 Django 的 ORM 中执行此 GROUP BY 查询

    我真的不知道如何翻译GROUP BY and HAVING到姜戈的QuerySet annotate and QuerySet aggregate 我正在尝试将这个 SQL 查询转换为 ORM 语言 SELECT EXTRACT year
  • 如何在python中递归复制目录并覆盖全部?

    我正在尝试复制 home myUser dir1 及其所有内容 及其内容等 home myuser dir2 在Python中 此外 我希望副本覆盖中的所有内容dir2 It looks like distutils dir util co
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • 如何将reportlab与Google应用程序引擎一起使用

    我无法在谷歌应用程序引擎下正确导入reportlab 根据以下guide http blog notdot net 2010 04 Generating PDFs on App Engine Python and introducing M
  • 与函数复合 UniqueConstraint

    一个快速的 SQLAlchemy 问题 我有一个 文档 类 其属性为 数字 和 日期 我需要确保没有重复的号码同年 是 有没有办法对 数字 年份 日期 进行UniqueConstraint 我应该使用唯一索引吗 我如何声明功能部分 SQLA
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • 在 python 查询参数中使用 %20 而不是 + 作为空格

    我使用 python requests 编写了以下 python 脚本 http requests readthedocs org en latest http requests readthedocs org en latest impo

随机推荐

  • JVM的核心内容

    1 JVM对于java程序员的重要性可以用一下两句话来概述 1 1 关于任何java的技术问题都可以追溯到java虚拟机里面去 1 2 一个Java程序员水平的高低就看你对Java虚拟机这个东西有多了解 2 了解JVM需要先理解jdk与jr
  • 华为某高管工资曝光:每月高达27万,众网友表示长了见识

    如果说一个人工资每个月好几万 估计很多网友都会认为很高了 能拿到这么高薪资的人肯定是非常优秀和有能力的人 近日 一名在某企业从事招聘工作的网友在网上曝光了一条内容 其称在招聘简历中 无意发现了一份华为高管的简历 其级别是21级 月工资高达2
  • 利用Fiddler 解SSL加密 数据包

    在开发互联网应用的过程中 常常会设立或利用网络接口 为了调试对网络接口的使用 往往需要查看流入和流出网络接口的网络流量或数据包 抓包工具 就是一类用于记录通过网络接口的数据的工具 我们知道 网络协议是分层设计的 OSI模型将网络协议分为了7
  • 字符串之KMP详解

    昨晚梳理了一下KMP的过程 感觉印象深刻了不少 在此写下博客加深印象 同时也希望能和大家交流 KMP这个名字来源于其三个创始人名字首字母 主要用于解决字符串的匹配问题 字符串的匹配问题 假设有两个字符串S和T 问串T是否出现在串S中 串T在
  • Linux 链路聚合之bond和team

    交换机可以配置链路聚合 提供线路的冗余的同时提高带宽吞吐 服务器也可以通过bond team技术做网口硬件层面的冗余 防止单个网口应用的单点故障以及提高带吞吐量 bond模式最多可以添加两块网卡 team模式最多可以添加八块网卡 一 bon
  • vmware详细安装教程

    1 打开下载好的VMware安装文件 点击下一步 2 勾选 我接受许可协议中的条款 点击下一步 3 勾选 自动安装Windows Hypervisor Platform WHP 点击下一步 4 以下两个选项都勾选 5 选择安装路径 更改默认
  • TCP/IP协议三次握手与四次挥手

    一 标志位和序号 seq序号 发送方随机生成的 ack确认序号 ack seq 1 标志位ACK 1时确认序号有效 SYN标志位 发起一个新连接 ACK标志位 确认序号有效 FIN标志位 断开连接 二 三次握手 三次握手是客户端与服务端建立
  • 搭建 Github Pages 个人博客网站

    文章出自个人博客https knightyun github io 2018 04 01 github pages blog 1 1 转载请申明 目录 引言 关于博客 关于Github 创建Github账号 创建仓库 填充仓库 配置Gith
  • Linux sed 命令

    简介 sed Stream Editor文本流编辑 sed是一个 非交互式的 面向字符流的编辑器 能同时处理多个文件多行的内容 可以不对原文件改动 把整个文件输入到屏幕 可以把只匹配到模式的内容输入到屏幕上 还可以对原文件改动 但是不会再屏
  • 【WSL】[01] windows subsytem linux 安装、尤其(Ubuntu) 以及GUI的详细安装方法 - 升级APT到APT-FAST,加快8倍安装速度

    第 1 章前言 AI的训练和设计似乎ubuntu是必要的 而且 GPU的配置似乎也是要在Ubuntu下 某些模式版本才能兼容 单独搞一个编译服务器是个思路 但是 如果资金不够 也许要考虑在Windwos和Linux的系统共生下做点文章 Wi
  • liunux ubuntu 14.04/16 更换源为国内源--阿里云源/网易源/搜狐源

    转自 http www chenxm cc article 89 html 命令 sudo cp etc apt sources list etc apt sources list bak 备份 sudo vim etc apt sourc
  • Jenkins基础篇--linux安装Jenkins

    Jenkins简介 Jenkins是一个用Java编写的开源的持续集成工具 可用于自动化各种任务 如构建 测试和部署软件 持续集成是强调开发人员提交了新代码之后 立刻进行构建 单元 测试 根据测试结果 我们可以确定新代码和原有代码能否正确地
  • python中\t,\n,\n\t三者之间的区别

    ython中经常看到使用 t n n t 那么它们有什么区别之处呢 t 表示空4个字符 类似于文档中的缩进功能 相当于按一个Tab键 n 表示换行 相当于按一个 回车键 n t 表示换行的同时空4个字符 我们用例子来说明它们的区别 codi
  • qtdesigner设计表格_Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例...

    QT表格控件QTableView简介 表格视图控件QTableView 需要和QStandardItemModel 配套使用 这套框架是基于MVC设计模式设计的 M Model 是QStandardItemModel数据模型 不能单独显示出
  • SQL-labs的第30关——有防火墙 布尔盲注(Get)

    1 判断闭合方式 输入语句 id 1 返回页面如下 我们发现没有报错信息 所以不适合使用报错注入 我们输入语句 id 1 and 1 2 返回页面如下 输入语句 id 1 and 1 1 返回页面如下 闭合方式是双引号 2 选择注入方式 我
  • 推荐几个网盘搜索工具,大大提高你的找资源效率

    前言 网盘已经成了我们存储文件 分享文件必不可少的工具 常用的比如百度云盘 网上绝大部分的资源都是在通过百度云传播 但是它并没有提供一个搜索接口供我们找资源 下面推荐几个我常用的网盘搜索网站 相信可以大大提升你的资源寻找效率 如风搜 htt
  • DeepWalk+word2vec的百科词条图嵌入可视化实战分析

    视频讲解 DeepWalk word2vec的百科词条图嵌入可视化实战分析 哔哩哔哩 bilibili 结果演示 完整代码数据 import networkx as nx 图数据挖掘 import gensim from gensim mo
  • 如何正确打开华为手机的 USB 调试和 完整 log 功能?

    华为手机 荣耀6 不能开启USB调试 借了一台华为荣耀手机 估计被重置过系统 电脑都连接不上 在关于里面开启开发者模式 并开启 USB 调试模式 但是刚打开 再次进来就变成不可选择的状态 并且不能调试 需要如下操作才能正常使用 USB 调试
  • 关于梯度下降的学习笔记

    什么是梯度下降 梯度下降可拆分为梯度 下降 在一阶函数中 某一点的梯度表示函数在该点处的导数 导数的正负号表示函数上升的方向 梯度下降是基于微积分中导数的概念 大部分的机器学习模型都有直接或间接地运用梯度下降的算法 1 梯度下降的目的 在机
  • OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

    1 学习目标 学习 OpenCV 图像的翻转函数 cv flip 学习 NumPy 矩阵的反转函数 np flip 自己实现矩阵反转的函数 2 OpenCV 翻转 翻转也称镜像 是指将图像沿轴线进行轴对称变换 水平镜像是将图像沿垂直中轴线进