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

OpenCV中的图像旋转方法详解

文章目录

    • 引言
    • 1. 简单的旋转:cv2.rotate()
    • 2. 任意角度旋转:cv2.getRotationMatrix2D() + cv2.warpAffine()
    • 结论

引言

在计算机视觉和图像处理领域,图像旋转是一项基础而重要的操作。OpenCV作为最流行的计算机视觉库之一,提供了多种实现图像旋转的方法。本文将详细介绍OpenCV中的各种旋转技术,帮助读者理解它们的原理、适用场景以及具体实现方法。

1. 简单的旋转:cv2.rotate()

OpenCV提供了最简单的旋转函数cv2.rotate(),它支持90度、180度和270度的顺时针旋转。

import cv2# 读取图像
img = cv2.imread('image.jpg')# 顺时针90度旋转
rotated_shun90 = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE) #顺时针旋转90度# 180度旋转
rotated_180 = cv2.rotate(img, cv2.ROTATE_180)#逆时针90度旋转
rotated_ni90 = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE) #逆时针旋转90度

我们现在使用一张可乐瓶的图片作为原图:
在这里插入图片描述
而运行结果如下:
在这里插入图片描述
这段代码也可使用numpy库中的方法来表示:

import cv2
import numpy as npimg = cv2.imread('image.jpg')# 旋转 90 度,k=-1 表示顺时针旋转 90 度
rotated_image1 = np.rot90(img,k=-1)
# 旋转 90 度,k=1 表示逆时针旋转 90 度
rotated_image2 = np.rot90(img,k=1)

这段代码与上面所表示的代码实现的功能是一样的

优点

  • 实现简单
  • 计算速度快
  • 不会引入插值伪影

缺点

  • 只能旋转特定角度
  • 不能自定义旋转中心

2. 任意角度旋转:cv2.getRotationMatrix2D() + cv2.warpAffine()

对于任意角度的旋转,OpenCV提供了更灵活的方法组合:

# 获取图像高度和宽度
(h, w) = img.shape[:2]# 定义旋转中心(图像中心)
center = (w // 2, h // 2)# 定义旋转角度(45度)和缩放因子(1.0表示不缩放)
angle = 45
scale = 1.0# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)# 应用仿射变换进行旋转
rotated = cv2.warpAffine(img, M, (w, h))

以下是运行结果:
在这里插入图片描述

参数说明

  • center: 旋转中心点坐标
  • angle: 旋转角度(正值为逆时针)
  • scale: 缩放因子

优点

  • 支持任意角度旋转
  • 可以自定义旋转中心
  • 可以同时进行缩放

缺点

  • 旋转后图像角落可能被裁剪
  • 需要插值处理,可能引入伪影

结论

OpenCV提供了丰富而强大的图像旋转功能,理解这些方法的原理和适用场景,可以帮助我们在实际应用中选择最合适的旋转策略,平衡速度和质量需求。

希望本文能帮助您更好地理解和使用OpenCV中的旋转方法。在实际应用中,建议根据具体需求选择合适的方法,并通过实验调整参数以获得最佳效果。

http://www.xdnf.cn/news/779.html

相关文章:

  • 特征选择与类不平衡处理
  • aws服务--S3介绍使用代码集成
  • Missashe考研日记-day23
  • 在Ubuntu下用Chrony做主从机时间同步
  • 栈和字符串,力扣.43.字符串相乘力扣1047.删除字符串中的所有相邻重复项力扣.844比较含退格的字符串力扣227.基本计算器II
  • 《马尼拉》桌游期望计算器
  • Ubuntu下展锐刷机工具spd_dump使用说明
  • Python3网络爬虫开发--爬虫基础
  • Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
  • 每天学一个 Linux 命令(30):cut
  • 【React】搜索时高亮被搜索选中的文案
  • 大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结
  • TensorFlow和PyTorch学习原理解析
  • 掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理
  • FreeRTos学习记录--2.内存管理
  • 华为云获取IAM用户Token的方式及适用分析
  • 潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!
  • 在线查看【免费】 dcm、drawio,dcm wps文件格式网站
  • Spring Boot集成Keycloak
  • 颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
  • 从“堆料竞赛”到“体验深耕”,X200 Ultra和X200s打响手机价值升维战
  • 【锂电池容量特征提取】NASA数据集锂电池容量特征提取(Matlab完整源码)
  • Java中 关于编译(Compilation)、类加载(Class Loading) 和 运行(Execution)的详细区别解析
  • Linux网络编程 多进程UDP聊天室:共享内存与多进程间通信实战解析
  • 四元数转旋转矩阵
  • 极狐GitLab CEO 柳钢受邀出席 2025 全球机器学习技术大会
  • Halcon应用:相机标定之应用
  • Shell脚本-变量的分类
  • 使用c++调用deepseek的api(附带源码)
  • 深度解析算法之位运算