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

使用 OpenCV 实现图像中心旋转

在图像处理中,围绕中心点旋转图像是一个常见的需求。无论是为了数据增强、视觉效果,还是图像对齐,旋转图像都是一项基础且重要的操作。本文将详细介绍如何使用 OpenCV 实现围绕图像中心旋转的功能,并深入探讨其背后的数学原理。


一、旋转图像的基本概念

图像旋转是指将图像围绕一个指定的点(通常是图像中心)旋转一定角度。旋转后的图像尺寸可能会发生变化,以确保所有原始像素都能在旋转后的图像中显示。旋转过程中,需要考虑以下几点:

  1. 旋转中心:图像旋转的轴心点,通常为图像中心。
  2. 旋转角度:旋转的角度,通常以度为单位,正角度表示逆时针旋转。
  3. 新图像尺寸:旋转后图像的新宽度和高度,确保不丢失任何像素。
  4. 插值方法:用于填充旋转后图像中空白区域的像素值。

 二、代码实现

import cv2
import numpy as np
import mathdef rotate_about_center(src, angle_degrees, scale=1.0):"""Rotate an image around its center by a specified angle.Parameters:- src: numpy.ndarrayThe input image to be rotated.- angle_degrees: floatThe rotation angle in degrees. Positive values indicate counter-clockwise rotation.- scale: float, optionalThe scaling factor. Default is 1.0 (no scaling).Returns:- numpy.ndarrayThe rotated image."""# 确保输入图像是有效的if src is None:raise ValueError("Input image is None")# 获取图像的宽度和高度image_height, image_width = src.shape[:2]# 将角度转换为弧度angle_radians = np.deg2rad(angle_degrees)# 计算旋转后的新图像尺寸new_width = (abs(np.sin(angle_radians) * image_height) + abs(np.cos(angle_radians) * image_width)) * scalenew_height = (abs(np.cos(angle_radians) * image_height) + abs(np.sin(angle_radians) * image_width)) * scale# 计算旋转矩阵# center 是旋转的中心点,位于新图像的中心rotation_center = (new_width * 0.5, new_height * 0.5)rotation_matrix = cv2.getRotationMatrix2D(rotation_center, angle_degrees, scale)# 计算从旧中心到新中心的移动translation = np.dot(rotation_matrix, np.array([(new_width - image_width) * 0.5, (new_height - image_height) * 0.5, 0]))# 更新旋转矩阵的平移部分rotation_matrix[0, 2] += translation[0]rotation_matrix[1, 2] += translation[1]# 应用旋转rotated_img = cv2.warpAffine(src, rotation_matrix, (int(math.ceil(new_width)), int(math.ceil(new_height))), borderValue=(255, 255, 255), flags=cv2.INTER_LANCZOS4)return rotated_img

三、代码说明

1. 输入检查

  • 检查输入图像是否为空,确保后续操作的有效性。

2. 获取图像尺寸

  • 从输入图像中提取高度和宽度,用于后续计算。

3. 计算新图像尺寸

  • 使用三角函数计算旋转后图像的新宽度和高度。旋转后的图像尺寸需要足够大,以容纳旋转后的所有像素。

4. 生成旋转矩阵

  • 使用 cv2.getRotationMatrix2D 计算旋转矩阵。旋转中心是新图像的中心,旋转角度为输入的角度,缩放因子为 scale

5. 计算平移量

  • 计算从旧图像中心到新图像中心的偏移量。
  • 使用 np.dot 将旋转矩阵应用到偏移量上,计算由于旋转引起的额外平移。
  • 更新旋转矩阵的平移部分,以确保旋转后的图像正确放置在新图像的中心。

6. 应用旋转

  • 使用 cv2.warpAffine 应用旋转矩阵,生成旋转后的图像。
  • 设置边界填充颜色为白色,并使用高质量的插值方法(cv2.INTER_LANCZOS4)。

7. 示例用法

  • 读取输入图像,调用 rotate_about_center 函数旋转图像,并显示和保存结果。

五、旋转结果 ,旋转45°,正数表示逆时针旋转,负数表示顺时针旋转

 


文章转载自:
http://categorial.bdypl.cn
http://chisanbop.bdypl.cn
http://bunraku.bdypl.cn
http://angelina.bdypl.cn
http://amphitheatrical.bdypl.cn
http://banister.bdypl.cn
http://bivallate.bdypl.cn
http://caper.bdypl.cn
http://bagged.bdypl.cn
http://biomathematics.bdypl.cn
http://calyces.bdypl.cn
http://brangus.bdypl.cn
http://afferent.bdypl.cn
http://angelical.bdypl.cn
http://boletus.bdypl.cn
http://aerobatics.bdypl.cn
http://amylose.bdypl.cn
http://bto.bdypl.cn
http://apostrophize.bdypl.cn
http://arisen.bdypl.cn
http://azov.bdypl.cn
http://agglutinogenic.bdypl.cn
http://audibly.bdypl.cn
http://auditress.bdypl.cn
http://callan.bdypl.cn
http://aquarii.bdypl.cn
http://astonishing.bdypl.cn
http://assail.bdypl.cn
http://atavist.bdypl.cn
http://brassart.bdypl.cn
http://www.dtcms.com/a/162976.html

相关文章:

  • Nacos源码—2.Nacos服务注册发现分析三
  • DeepSeek 联手 Word,开启办公开挂模式
  • mac word接入deepseek
  • 经典算法 最长单调递增子序列
  • 第十章:CrewAI - 面向流程的多 Agent 结构化协作
  • 【分享】音频音乐剪辑[特殊字符]人声分离伴奏提取[特殊字符]拼接合并
  • KUKA机器人快速启动设置
  • MCP 架构全解析:Host、Client 与 Server 的协同机制
  • CSRF(cross-site request forgery)跨域请求访问
  • Spark 配置 YARN 模式
  • Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
  • C++ 中自主内存管理 new/delete 与 malloc/free 完全详解
  • 如何搭建spark yarn 模式的集群集群
  • 贝叶斯优化RF预测模型
  • MYSQL三大日志、隔离级别(MVCC+锁机制实现)
  • 【深度学习与大模型基础】第14章-分类任务与经典分类算法
  • Vue2 相关知识点整理
  • 数据结构---单链表的增删查改
  • 第十六届蓝桥杯 2025 C/C++组 25之和
  • 【Bash】可以请您解释性地说明一下“2>1”这个语法吗?
  • 基于tabula对pdf中多个excel进行识别并转换成word中的优化(四)
  • 关于插值和拟合(数学建模实验课)
  • 【记】Laya2.x数字末尾导致换行异常问题
  • C# 14 field keyword:属性简化新利器
  • 基于PyTorch的Fashion-MNIST图像分类数据集处理与可视化
  • Java后端图形验证码的使用
  • [Linux网络_68] 转发 | 路由(Hop by Hop) | IP的分片和组装
  • 当OA闯入元宇宙:打卡、报销和会议的未来狂想
  • 【C++11】包装器:function与bind
  • 【BotSharp框架示例 ——实现聊天机器人,并通过 DeepSeek V3实现 function calling】