OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)
1. 学习目标
- 学习 OpenCV 图像的翻转函数 cv.flip;
- 学习 NumPy 矩阵的反转函数 np.flip;
- 自己实现矩阵反转的函数。
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 实现阵列上下反转
- 获取阵列的宽高值;
- 复制一份改阵列,防止反转的时候影响了原阵列;
- 上下翻转只需要循环阵列的行,将第一行和最后一行互换,将第二行和倒数第二行互换!!!
- 注意:由于 range 是从 0 开始,所以最后一行需要先减 1!!!
- 注意:解构赋值直接将两个值进行互换,但是换的第一个值需要复制一份互换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 实现阵列左右反转
- 对比上下反转,左右反转需要循环列一层的互换!!!
# 左右翻转
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 的方法实现对角线反转
- 图像左上角和右下角翻转;
- 右上角和左下角翻转;
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. 总结
- 注意: 阵列的反转 和 OpenCV 的翻转 对比,少了对角线翻转,但是使用【上下反转+左右反转】能够实现相同的效果;
- 自己使用循环阵列的方法实现水平、垂直、对角线翻转,但是相比原生方法,计算很慢,需要进行优化!!!
相关文章:

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,说…...

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

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

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

day51【代码随想录】动态规划之回文子串、最长回文子序列
文章目录前言一、回文子串(力扣647)二、最长回文子序列(力扣516)前言 1、回文子串 2、最长回文子序列 一、回文子串(力扣647) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目…...

拟凸函数,拟凹函数,单峰函数
拟凸(quasi-convex)函数很早就听说过,但是标准定义一直不太了解,现在总结一下。 一个定义在凸集上的实数函数 fff 是拟凸函数:若对于其定义域内的任意两个点 xxx 和 yyy,以及任意常数 λ∈[0,1]\lambda\in…...
数据处理(伪)代码:卡尔曼滤波 vs. 卡尔曼平滑
步骤一、导入csv或txt格式的试验数据 最简洁也是据说读取速度最快的方法是: 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机试 - 组成最大数…...

【基础算法】哈希表(开放寻址法)
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

优化算法(寻优问题)
前言 群智能算法(全局最优):模拟退火算法(Simulated annealing,SA),遗传算法(Genetic Algorithm, GA),粒子群算法(Particle Swarm Optimization&…...
基于视频流⽔线的Opencv缺陷检测项⽬
代码链接见文末 1.数据与任务概述 输入为视频数据,我们需要从视频中检测出缺陷,并对缺陷进行分类。 2.整体流程 (1)视频数据读取和轮廓检测 首先,我们需要使用opencv读取视频数据,将彩色图转为灰度图后进行图像阈值处理。阈值处理是为了让前景和背景更明显的区分处理。…...

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

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

SAP ABAP中的数据类型 Data Types
简单来说分两种: 数据字典里定义的在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: HashMap是面试中经常被问到的一个内容,以下两个经常被问到的问题, Question1:底层数据结构,1.7和1.8有何不同? 答:1.7数组+链表,1.8数组+(链表|红…...

EasyNLP集成K-Global Pointer算法,支持中文信息抽取
作者:周纪咏、汪诚愚、严俊冰、黄俊 导读 信息抽取的三大任务是命名实体识别、关系抽取、事件抽取。命名实体识别是指识别文本中具有特定意义的实体,包括人名、地名、机构名、专有名词等;关系抽取是指识别文本中实体之间的关系;…...
mysql lesson3
DQL查找语句续集.............................. 分组函数(也叫多行处理函数) 1: 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:分组函…...

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

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...