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

news2025/7/26 19:47:58

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. 自己使用循环阵列的方法实现水平、垂直、对角线翻转,但是相比原生方法,计算很慢,需要进行优化!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

写出高质量的前端代码之降低耦合提升正交性

耦合与正交性 什么是耦合 在百度百科中,对耦合的解释 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 我曾经买过一个遥控飞机玩具,当我推前进杆的时候,飞机除了前进,还会往左或者往…

字符串匹配--strstr函数的模拟实现思路和代码

一,strstr函数 原型: const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); strstr是一个字符串匹配函数,在str1中去寻找str2,如果找到,返回str2在…

科研快讯 | 14篇论文被信号处理领域顶级国际会议ICASSP录用

ICASSP 2023 近日,2023年IEEE声学、语音与信号处理国际会议(2023 IEEE International Conference on Acoustics, Speech, and Signal Processing,ICASSP 2023)发布录用通知,清华大学人机语音交互实验室(TH…

【LSTM】2 多因素单步骤预测

基于时间序列的预测,一定要明白它的原理,不是工作原理,而是工程落地原因。 基于时间序列,以已知回归未知----这两句话是分量很重的。 多因素单步单输出组合 时间序列:t1 是 特征 1,2,3 预测t2 的回归值41 多因素单步多…

当科普展会和VR全景碰撞,会擦出什么样的火花?

你知道科普的重要性吗?一些大城市学生从小到大经历过很多科普展会,帮助青少年从小就树立正确的科学价值观和人生观,那么当科普展会和VR全景碰撞会擦出什么样的火花呢? 在这个信息时代,什么信息都可以在网上搜到&#x…

Java岗面试题--Java并发 计算机网络(日积月累,每日三题)

目录1. 面试题一:在 Java 程序中怎么保证多线程的运行安全?1.1 追问一:Java 线程同步的几种方法?2. 面试题二:JMM3. 面试题三:计算机网络的各层协议及作用?1. 面试题一:在 Java 程序…

大数据导论与Linux基础

目录标题什么是数据数据分析方向数据分析步骤分布式与集群操作系统虚拟机ssh协议Linux常用操作什么是数据 数据:指对官方事件进行记录并可以鉴别的符号 数据如何产生:对客观事物的计量和记录产生数据 数据分析方向 数据分析在企业日常分析中三大方向&…

taobao.top.oaid.client.decrypt( 端侧OAID解密 )

¥开放平台免费API不需用户授权 解码OAID(Open Addressee ID),返回收件人信息。该接口用于客户端直接查看订单隐私数据,解密数据不经过ISV服务器,且包含风控等安全检测。 公共参数 请求地址: HTTP地址:http://gw.api.ta…

async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道

学习关键语句 : async , await 用法 await 怎么使用 同步任务和异步任务 微任务和宏任务 js中代码执行顺序 写在前面 虽然说 async 和 await 是 Promise 的语法糖 , 但是用惯了Promise 的人(我) , 还真不能超快速使用上这个语法糖 , 所以赶紧写一篇文章出来让各位了解了解这个…

【金三银四系列】Spring面试题-下(2023版)

Spring面试专题 1.介绍下Spring的初始化过程 Spring的初始化过程中会走refresh方法,这是个模板模式的实现,包含有如下的14个方法 每个方法的相关作用 把每个方法的作用按照这个图介绍下就可以了 2.配置文件的加载解析 Spring初始化的时候在obtainFresh…

内存管理框架---页(一)

文章目录物理内存的模型非一致内存访问--NUMA一致内存访问模型--UMA内存管理架构页页框管理页描述符页描述符字段flags字段详解gfp_mask 标志获得页alloc_pages__get_free_pages获得填充为0的页释放页kmallocvmalloc参考资料你用心写的每一篇文章,可能会带别人和自己…

【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

特征向量中心度(eigenvector centrality)算法原理与源码解析

前言 随着图谱应用的普及,图深度学习技术也逐渐被越来越多的数据挖掘团队所青睐。传统机器学习主要是对独立同分布个体的统计学习,而图深度学习则是在此基础上扩展到了非欧式空间的图数据之上,通过借鉴NLP和CV方向的模型思想,衍生…

供应商关系有哪些类型?如何优化管理?

供应商关系有两种主要类型。识别你与供应商的关系类型将有助于你有效地管理期望和调整目标。 1、垂直供应商关系 在垂直供应商关系中,供应链以卖方和买方之间的传统方式联系起来。各方都把重点放在确保个人和供应链目标的实现上。垂直供应商关系的例子包括分销商…

JVM面试总结

文章目录栈帧中存放的信息:对象的创建过程对象的内存布局?对象的访问定位方式?如何判断对象已死?可以作为GC Root的点:谈一下引用对象再被回收时如何逃脱?回收方法区如何判断常量是否废弃?垃圾回…

IMX Yocto SDK 拉取报错误fatal: Could not read from remote repository

IMX 平台Yocto SDK拉取步骤拉取步骤可以在NXP官方yocto指导文档里查看,这里再贴一次,然后针对的讲可能遇到的问题。1,首先下载repo。repo是谷歌开发的一款python小程序。是基于GIT工作的,可以批量拉取,合并多个代码仓库…

Springboot 使用thymeleaf 服务器无法加载resources中的静态资源异常处理

目录一、异常错误二、原因三、解决方法方法1. 将无法编译的静态资源放入可编译目录下方法2. 重新编译项目加载资源方法3. 修改pom.xml资源配置文件方法4. 不连接远程数据库启动,使用本地数据库一、异常错误 Springboot使用thymeleaf,并连接远程数据库启…

Vue3电商项目实战-商品详情模块5【14-商品详情-数量选择组件、15-商品详情-按钮组件、16-商品详情-同类推荐组件】

文章目录14-商品详情-数量选择组件15-商品详情-按钮组件16-商品详情-同类推荐组件14-商品详情-数量选择组件 目的:封装一个通用的数量选中组件。 大致功能分析: 默认值为1可限制最大最小值点击-就是减1 点击就是加1需要完成v-model得实现存在无label情况…

如何构建以应用为核心的运维体系

在微服务的架构模式下,我们的运维视角一定转到应用这个核心概念上来,一切要从应用的角度来分析和看待问题。 微服务架构一般都是从单体架构或分层架构演进过来的。软件架构服务化的过程,就是我们根据业务模型进行细化的过程,在这…

并发编程学习篇并发线程池底层原理详解与源码分析

一、线程池与线程对比 package bat.ke.qq.com.threadpool;import java.util.ArrayList; import java.util.List; import java.util.Random;/**** 使用线程的方式去执行程序*/ public class ThreadTest {public static void main(String[] args) throws InterruptedException {…