当前位置: 首页 > news >正文

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

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.shapesrc = np.copy(src)for i in range(h//2):# cur = np.copy(src[i])# src[i] = src[h-i-1]# src[h-i-1] = cursrc[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.shapesrc = 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.shapesrc = 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.shapesrc = np.copy(src)for i in range(h//2):# cur = np.copy(src[i])# src[i] = src[h-i-1]# src[h-i-1] = cursrc[i],src[h-i-1] = src[h-i-1],np.copy(src[i])return src# 左右翻转
def flip_lr(src):h,w,c = src.shapesrc = 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.shapesrc = 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 srcdef 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 srcdef 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. 自己使用循环阵列的方法实现水平、垂直、对角线翻转,但是相比原生方法,计算很慢,需要进行优化!!!

相关文章:

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

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

CRM系统能帮外贸行业解决哪些问题

国内的外贸行业经历了四个发展阶段,从发展期到繁荣期,CRM客户管理系统逐步走到幕前,成为外贸企业必不可少的主打工具。那么外贸行业整面临哪些问题?该如何解决?下面我们就来说说适合外贸行业的CRM解决方案。 外贸行业…...

掌握lombok简化Java编码完成后端提效

Lombok安装 –>添加依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope> </dependency>scopeprovided&#xff0c;说…...

【蓝桥集训】第七天——并查集

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.亲戚2.合并集合3.连通块中点的数量有关并查集的知识学习可以移步至—— 【算法】——并查集1.亲戚 或许你并不知道&#…...

该来的总会来,继岳云鹏走红之后,孔云龙也和主流相声界打成一片

说起德云社的岳云鹏&#xff0c;都知道他是农民的孩子&#xff0c;初中没有毕业就外出打工&#xff0c;一路辛酸才走到了今天。当年岳云鹏在北京打工&#xff0c;炸酱面馆里面他和孔云龙最好&#xff0c;两个人又经过老先生介绍&#xff0c;一起投奔郭德纲学说相声。 进入德云社…...

索引的创建与设计原则

1.索引的声明与使用 1.1索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。按照 物理实现方式&#xff0c;索引可以分…...

day51【代码随想录】动态规划之回文子串、最长回文子序列

文章目录前言一、回文子串&#xff08;力扣647&#xff09;二、最长回文子序列&#xff08;力扣516&#xff09;前言 1、回文子串 2、最长回文子序列 一、回文子串&#xff08;力扣647&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目…...

拟凸函数,拟凹函数,单峰函数

拟凸&#xff08;quasi-convex&#xff09;函数很早就听说过&#xff0c;但是标准定义一直不太了解&#xff0c;现在总结一下。 一个定义在凸集上的实数函数 fff 是拟凸函数&#xff1a;若对于其定义域内的任意两个点 xxx 和 yyy&#xff0c;以及任意常数 λ∈[0,1]\lambda\in…...

数据处理(伪)代码:卡尔曼滤波 vs. 卡尔曼平滑

步骤一、导入csv或txt格式的试验数据 最简洁也是据说读取速度最快的方法是&#xff1a; pPath C:\data_org\9#-1.txt % 数据文件 data importdata(pPath); % 读取 pPath 的结果到 一个数据结构变量 data 中。 pData data.data; % 提取有效数据数组data 的数据结构如下&a…...

华为OD机试题,用 Java 解【比赛评分】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...

【基础算法】哈希表(开放寻址法)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

优化算法(寻优问题)

前言 群智能算法&#xff08;全局最优&#xff09;&#xff1a;模拟退火算法&#xff08;Simulated annealing&#xff0c;SA&#xff09;&#xff0c;遗传算法&#xff08;Genetic Algorithm, GA&#xff09;&#xff0c;粒子群算法&#xff08;Particle Swarm Optimization&…...

基于视频流⽔线的Opencv缺陷检测项⽬

代码链接见文末 1.数据与任务概述 输入为视频数据,我们需要从视频中检测出缺陷,并对缺陷进行分类。 2.整体流程 (1)视频数据读取和轮廓检测 首先,我们需要使用opencv读取视频数据,将彩色图转为灰度图后进行图像阈值处理。阈值处理是为了让前景和背景更明显的区分处理。…...

百万数据excel导出功能如何实现?

最近我做过一个MySQL百万级别数据的excel导出功能&#xff0c;已经正常上线使用了。 这个功能挺有意思的&#xff0c;里面需要注意的细节还真不少&#xff0c;现在拿出来跟大家分享一下&#xff0c;希望对你会有所帮助。 原始需求&#xff1a;用户在UI界面上点击全部导出按钮…...

华为OD机试题,用 Java 解【合规数组】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...

SAP ABAP中的数据类型 Data Types

简单来说分两种&#xff1a; 数据字典里定义的在ABAP程序里定义的 文章目录1. ABAP数据字典里的1.1 数字型的1.2 字符型1.3 字节型1.4 特殊类型2. 预定义的ABAP数据类型2.1 预定义数字型2.2 预定义字符型2.3 预定义字节型1. ABAP数据字典里的 1.1 数字型的 用在数学计算里的…...

HashMap~

HashMap&#xff1a; HashMap是面试中经常被问到的一个内容&#xff0c;以下两个经常被问到的问题&#xff0c; Question1&#xff1a;底层数据结构&#xff0c;1.7和1.8有何不同&#xff1f; 答&#xff1a;1.7数组&#xff0b;链表&#xff0c;1.8数组&#xff0b;(链表|红…...

EasyNLP集成K-Global Pointer算法,支持中文信息抽取

作者&#xff1a;周纪咏、汪诚愚、严俊冰、黄俊 导读 信息抽取的三大任务是命名实体识别、关系抽取、事件抽取。命名实体识别是指识别文本中具有特定意义的实体&#xff0c;包括人名、地名、机构名、专有名词等&#xff1b;关系抽取是指识别文本中实体之间的关系&#xff1b;…...

mysql lesson3

DQL查找语句续集.............................. 分组函数&#xff08;也叫多行处理函数&#xff09; 1&#xff1a; select sum(sal) from emp;select min(sal)from emp;select max(sal)from emp;select avg(sal)from emp;select count(ename)from emp;2&#xff1a;分组函…...

python源码保护

文章目录代码混淆打包exe编译为字节码源码加密项目发布部署时&#xff0c;为防止python源码泄漏&#xff0c;可以通过几种方式进行处理代码混淆 修改函数、变量名 打包exe 通过pyinstaller 将项目打包为exe可执行程序&#xff0c;不过容易被反编译。 编译为字节码 py_comp…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...