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

OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

前言

        仅供个人学习用,如果对各位朋友有参考价值,给个赞或者收藏吧 ^_^

一. cv2.getRotationMatrix2D(center, angle, scale)

1.1 参数说明 

parameters

center:旋转中心坐标,是一个元组参数(col, row)

angle:旋转角度,旋转方向,负号为逆时针,正号为顺时针

scale:旋转后图像相比原来的缩放比例,1为等比例缩放

returns返回一个2*3的旋转(变换)矩阵,因为变换矩阵第三行形式固定,所以忽略。

returns:返回下面的2*3行列式,注:α=cosθ,β=sinθ

还是不太懂的话参考:cv2.getRotationMatrix2D的旋转矩阵的正确形式-CSDN博客

二、cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) 

2.1 参数说明 

parameters

src:原始图像。
dst:输出图像。
M:变换矩阵,这里是由getRotationMatrix2D生成的旋转矩阵。
dsize:输出图像的大小。
flags:插值方法,通常使用INTER_LINEAR(线性插值)。
borderMode:边界像素模式。
borderValue:边界填充值,用于边界外的像素。

returns返回旋转后的图像

2.2 flags 值说明 

三、举例

 3.1 demo

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltimg = cv.imread('E:/Desktop/jianli/lenna.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
(h, w) = img.shape[:2]
print('原图像的高和宽', h, w)
(cX, cY) = (w // 2, h // 2)
M = cv.getRotationMatrix2D((cX, cY), -45, 1.0)
print('旋转矩阵:\n', M)
rotate0 = cv.warpAffine(src=img, M=M, dsize=(h, w))
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
nH = int((h*cos) + (w*sin))
nW = int((h*sin) + (w*cos))
print('新图像的高和宽', nH, nW)
rotate1 = cv.warpAffine(img, M, (nW, nH))
# 调整旋转矩阵的中心以平移到中心显示全图
M[0, 2] += (nW/2) - cX
M[1, 2] += (nH/2) - cY
rotate2 = cv.warpAffine(img, M, (nW, nH))
print('中心点平移后的旋转矩阵:\n', M)
# 显示图像
plt.subplot(1, 3, 1), plt.imshow(rotate0, 'gray'), plt.title('rotate0')
plt.subplot(1, 3, 2), plt.imshow(rotate1, 'gray'), plt.title('rotate1')
plt.subplot(1, 3, 3), plt.imshow(rotate2, 'gray'), plt.title('rotate2')
plt.show()

3.1.1  新图像的高和宽计算

计算经过仿射变换或旋转后新图像的宽度和高度,尤其是在旋转图像时保持图像的完整性而不裁剪任何部分,需要一些几何计算。

看了以下图就能知道为啥子这么计算啦

nH = int((h*cos) + (w*sin))
nW = int((h*sin) + (w*cos))

3.2 output

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 分布式I/O从站的认知
  • 昇思25天打卡营-mindspore-ML- Day22-应用实践-自然语言处理-LSTM+CRF序列标注
  • Font Awesome 文本图标
  • 【大模型LLM面试合集】大语言模型架构_attention
  • 【密码学】大整数分解问题和离散对数问题
  • 【鸿蒙学习笔记】元服务
  • 钉钉扫码登录第三方
  • 暑假自律日记十
  • 用SmartSql从数据库表中导出文档
  • unsupported_country_region_territory
  • winform开发中的几个坐标
  • 顶顶通呼叫中心中间件实现随时启动和停止质检(mod_cti基于FreeSWITCH)
  • 【Spring Boot】关系映射开发(二):一对多映射
  • 【git命令大全】
  • Vue 3 与 TypeScript:最佳实践详解
  • ----------
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2017届校招提前批面试回顾
  • ES2017异步函数现已正式可用
  • exports和module.exports
  • JavaWeb(学习笔记二)
  • js学习笔记
  • Less 日常用法
  • oschina
  • SpringBoot几种定时任务的实现方式
  • Terraform入门 - 1. 安装Terraform
  • 多线程 start 和 run 方法到底有什么区别?
  • 将 Measurements 和 Units 应用到物理学
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用common-codec进行md5加密
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • #ifdef 的技巧用法
  • #pragma pack(1)
  • (1)Jupyter Notebook 下载及安装
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读40-45)图像描述1
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (循环依赖问题)学习spring的第九天
  • (一) storm的集群安装与配置
  • (一)SpringBoot3---尚硅谷总结
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net Memory Profiler的使用举例
  • .NET MVC第三章、三种传值方式
  • .Net 代码性能 - (1)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET中的Exception处理(C#)
  • .NET中两种OCR方式对比
  • @RequestBody与@ModelAttribute