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…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
