OpenCV 图像旋转

一、OpenCV 图像旋转介绍

在计算机视觉和图像处理领域,图像旋转是指将图像围绕某个中心点按照一定的角度进行转动。旋转操作会改变图像中像素的位置,从而得到新的图像布局。这一操作在很多场景中都有重要应用,比如文档矫正、目标检测时对图像进行预处理、图像增强等。

二、OpenCV 中图像旋转的原理

三、代码实现

1. 导入必要的库

import cv2
import numpy as np

2. 读取图像

img = cv2.imread('kele.png')

3. 使用 np.rot90 进行图像旋转

# 旋转 90 度,k=-1 表示顺时针旋转 90 度
rotated_image1 = np.rot90(img, k=-1)
rotated_image2 = np.rot90(img, k=1)

np.rot90 是 NumPy 提供的函数,用于将数组(这里是图像数据)逆时针旋转 90 度的倍数。
k 参数指定旋转的次数。k = -1 表示顺时针旋转 90 度(相当于逆时针旋转 -90 度),将旋转后的图像存储在 rotated_image1 中。
k = 1 表示逆时针旋转 90 度,旋转后的图像存储在 rotated_image2 中。

4. 显示原始图像和使用 np.rot90 旋转后的图像

cv2.imshow('yuantu', img)
cv2.imshow('rotated_image1', rotated_image1)
cv2.imshow('rotated_image2', rotated_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imshow 函数用于在窗口中显示图像。分别显示原始图像 img 和两次旋转后的图像 rotated_image1、rotated_image2,窗口标题分别为 yuantu、rotated_image1 和 rotated_image2。
cv2.waitKey(0) 用于等待用户按键。参数 0 表示无限等待,直到用户按下任意键。
cv2.destroyAllWindows 函数用于关闭所有由 OpenCV 打开的窗口。

5. 使用 cv2.rotate 进行图像旋转

rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
rotated_image1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180)

cv2.rotate 是 OpenCV 提供的专门用于图像旋转的函数。
cv2.ROTATE_90_CLOCKWISE 表示顺时针旋转 90 度,将旋转后的图像存储在 rotated_image 中。
cv2.ROTATE_90_COUNTERCLOCKWISE 表示逆时针旋转 90 度,旋转后的图像存储在 rotated_image1 中。
cv2.ROTATE_180 表示旋转 180 度,旋转后的图像存储在 rotated_image2 中。

6. 显示使用 cv2.rotate 旋转后的图像

cv2.imshow('shun90', rotated_image)
cv2.imshow('ni90', rotated_image1)
cv2.imshow('180', rotated_image2)
cv2.waitKey(0)

再次使用 cv2.imshow 函数显示三次旋转后的图像,窗口标题分别为 shun90(顺时针 90 度)、ni90(逆时针 90 度)和 180(旋转 180 度)。
最后使用 cv2.waitKey(0) 等待用户按键,但代码中缺少关闭窗口的操作,建议添加 cv2.destroyAllWindows() 以确保程序结束时关闭所有窗口。

完整代码:

import cv2
import numpy as npimg = cv2.imread('kele.png')
# 旋转 90 度,k=-1 表示顺时针旋转 90 度
rotated_image1 = np.rot90(img, k=-1)
rotated_image2 = np.rot90(img, k=1)
cv2.imshow('yuantu', img)
cv2.imshow('rotated_image1', rotated_image1)
cv2.imshow('rotated_image2', rotated_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
rotated_image1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180)
cv2.imshow('shun90', rotated_image)
cv2.imshow('ni90', rotated_image1)
cv2.imshow('180', rotated_image2)
cv2.waitKey(0)

结果显示:

四、总结
OpenCV 提供了方便快捷的方法来实现图像旋转,通过 cv2.getRotationMatrix2D 和 cv2.warpAffine 函数,我们可以轻松完成图像的旋转操作。同时,针对旋转后图像可能出现的裁剪问题,我们也可以通过调整旋转矩阵和输出图像大小来解决。图像旋转在多个领域都有广泛的应用,对于提高图像处理和分析的效果具有重要意义。

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

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

相关文章

<C#>在 .NET 开发中,依赖注入, 注册一个接口的多个实现

在 .NET 开发里,有时一个接口会有多个实现类,此时就需要向依赖注入容器注册多个实现。下面会详细介绍不同场景下如何注册多个实现,以及怎样从容器中解析这些实现。 1. 注册多个实现 在 .NET 中,依赖注入容器可以通过不同方式注册…

idea 保存格式化 但是不格式化 Xml

xml- 其他 - 保持空格勾选上 https://blog.csdn.net/m0_65724734/article/details/128378290?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-128378290-blog-135147277.235%5Ev43%5Epc_blog_bo…

如何在C++中优雅地绘制图表

如何在C项目中优雅地绘制图表 matplotlibpreparematplotlibcpp.hpython3vs configuretest Gnuplotpreparegnuplotgnuplot-iostream.hboostvs configuretest MathGL 在C项目中,在进行一些数据分析时往往不够直观,若能借助图表进行分析可以达到事半功倍的效…

vue3使用keep-alive缓存组件与踩坑日记

目录 一.了解一下KeepAlive 二.使用keep-alive标签缓存组件 1.声明Home页面名称 三.在路由出口使用keep-alive标签 四.踩坑点1:可能需要配置路由(第三点完成后有效可忽略) 五.踩坑点2:没有找到正确的路由出口 一.了解一下Kee…

ros通信机制学习——latched持久化机制

点云的地图的发送逻辑中,我发现每次使用rostopic echo 时只会打印一次,然后就不会再打印了。并且rviz中也是始终都会显示的,这里面其实就是用到了latched持久话机制,可以接受这最后一次发布的消息。 我们通过一个具体的项目来学习…

力扣每日打卡 1922. 统计好数字的数目 (中等)

力扣 1922. 统计好数字的数目 中等 前言一、题目内容二、解题方法1. 暴力解法(会超时,此法不通)2. 快速幂运算3. 组合计数的思维逻辑分析组合计数的推导例子分析思维小结论 4.官方题解4.1 方法一:快速幂 三、快速幂运算快速幂运算…

如何使用通义灵码玩转Docker - AI助手提升开发效率

一、引言 Docker 作为一种流行的虚拟化技术,能够帮助开发者快速搭建所需的运行环境。然而,对于初学者来说,掌握 Docker 的基本概念和使用方法可能会遇到一些挑战。本文将介绍如何利用通义灵码这一智能编码助手,帮助你更高效地学习…

从一到无穷大 #45:InfluxDB MCP Server 构建:从工程实践到价值重构

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 工程实践遇到的问题MCP Host选择开发流程 结果展现可能性展望工作生活带来的变化 MCP…

JAVA SDK通过proxy对接google: GCS/FCM

前言:因为国内调用google相关api需要通过代理访问(不想设置全局代理),所以在代理这里经常遇到问题,先说一下结论 GCS 需要设置全局代理或自定义代理选择器, FCM sdk admin 在初始化firebaseApp时是支持设置的。 GCS: 开始时尝试在…

【NLP】24. spaCy 教程:自然语言处理核心操作指南(进阶)

spaCy 中文教程:自然语言处理核心操作指南(进阶) 1. 识别文本中带有“百分号”的数字 import spacy# 创建一个空的英文语言模型 nlp spacy.blank("en")# 处理输入文本 doc nlp("In 1990, more than 60% of people in East…

关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android

我下载了它资料中的开源Android13 系统SDK, 这个SDK连个git 都没有,把这种代码释放能称为开源吗?? 并且也就是说你买了这个板子,里面是没有任何关于RK3588的开发文档,如果你没玩过其他RK平台,估…

WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点

文章目录 适合场景基本语法示例:Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal?TypeScript 中 Portal 类型定义? 适合场景 React Portal 是 React 提供的一种机制,让你可以将子组件渲染到 DOM 的指定…

数据结构---跳表

目录 一、跳表的概念 为什么要使用随机值来确定层高 二、跳表的分析 (1)查找过程 (2)性能分析 三、跳表的实现 四、与红黑树哈希表的对比 skiplist本质上也是一种查找结构,用于解决算法中的查找问题&#xff0c…

PCDN通过个人路由器,用更靠近用户的节点来分发内容,从而达到更快地网络反应速度

PCDN(P2P CDN)的核心思想正是利用个人路由器、家庭宽带设备等分布式边缘节点,通过就近分发内容来降低延迟、提升网络响应速度,同时降低传统CDN的带宽成本。以下是其技术原理和优势的详细分析: 1. 为什么PCDN能更快&…

用excel做九乘九乘法表

公式: IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日,备受瞩目的QCon开发者技术峰会盛大举行,本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题,汇聚了众多鸿蒙生态的领军人物与技术专家,共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 详解 1. HttpServletRequest(HTTP 请求对象) HttpServletRequest 是 Java Servlet API 提供的接口,用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest,并增加了 HTTP 协议相…

HAL TIM PWM产生 蓝桥杯

目录 0.原理 0.1 CNT和CCR关系 0.2 PWM模式1模式2 1. cubemx配置 需求(将PA1输出1Khz的 50%占空比的方波) 1.0 PWM的频率计算: 2.代码 0.原理 0.1 CNT和CCR关系 CNT计数器和CCR比较器进行比较,如果是向上计数,CNT逐渐增加,CCR是虚线位置,也是用户自定义的…

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是,你可以在命令行中从任何位置直…

CMD命令行笔记

CMD命令行笔记,涵盖常用命令及实用技巧,适合快速查阅: 一、基础操作 打开CMD Win R → 输入 cmd → 回车管理员模式:右键开始菜单 → 选择“命令提示符(管理员)” 常用命令 help:查看所有命令…