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

python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像

【1】引言

前序已经学习了如何平移图像,相关文章链接为:

python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像-CSDN博客

在此基础上,我们尝试旋转图像的同时缩放图像。

【2】核心代码

前序学习进程中,已经知晓平移图像的核心代码是设置M矩阵,使其按照两行三列的形式,通过改变第三列的值来移动图像:

此时的M矩阵有两个可选变量x和y:

M=[[1,0,x],

      [0,1,y]],

当x>0,图像向右移动x大小的位置;当y>0,图像向右下移动y大小的位置;当x和y取负值时图像分别向左和向上运动。

当我们想旋转图像使,需要调用一个cv2.getRotationMatrix2D()函数来实现旋转。

这个函数的名字也很简单,拆开来就是cv.get Rotation Matrix2D(),直译就是对二维矩阵进行旋转的意思。

点击下方链接,直达cv2.getRotationMatrix2D()函数的官网学习教程:

OpenCV: Geometric Image Transformations

在这里,会看到:

图1

函数有三个参数:

Mat cv::getRotationMatrix2D     (     Point2f     center, #旋转中心,需要提前定义好
        double     angle, #旋转角度
        double     scale ) #缩放倍数

【3】代码测试

在这里,需要提前定义旋转中心:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片
src = cv.imread('src.png')
rows=len(src) #读取图像行数
cols=len(src[0]) #读取图像列数
center=(rows/2,cols/2) #旋转中心

然后就是调用cv2.getRotationMatrix2D()函数设置旋转和缩放属性:旋转60度,缩小为原来的0.8倍。

M=cv.getRotationMatrix2D(center,60,0.8) #旋转并缩放图像

然后依然要使用cv.warpAffine()函数来生成输出图像:

dst=cv.warpAffine(src,M,(cols,rows)) #输出图像

最后屏幕输出和保存:

cv.imshow('src-pingyi', dst)  # 在屏幕展示绘制圆形的效果
cv.imwrite('src-pingyi0.png', dst)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

此处使用的原图依然是: src.png

图1 src.png

代码运行后的输出为:

图2 旋转60度,缩小为原来的0.8倍

【4】细节说明

约定旋转中心的时候,如果是以原图的中心为依据,应该以(rows/2,cols/2)为旋转中心。

【5】结论

掌握了python+opencv实现图像旋转+缩放的操作技巧。

http://www.lryc.cn/news/520558.html

相关文章:

  • 2025-微服务—SpringCloud-1~3
  • UnityXR Interaction Toolkit 如何检测HandGestures
  • 使用 Multer 上传图片到阿里云 OSS
  • 2008-2020年各省社会消费品零售总额数据
  • 【大模型入门指南 07】量化技术浅析
  • java 查询树结构数据,无限层级树结构通用方法
  • FreeCAD集成gmsh源码分析
  • K8s 集群 IP 地址管理指南(K8s Cluster IP Address Management Guide)
  • Debye-Einstein-模型拟合比热容Python脚本
  • OpenCV的图像分割
  • 【源码+文档+调试讲解】农产品研究报告管理系统
  • 【STM32-学习笔记-7-】USART串口通信
  • 高可用虚拟IP-keepalived
  • AI多模态技术介绍:视觉语言模型(VLMs)指南
  • 高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图
  • uniApp通过xgplayer(西瓜播放器)接入视频实时监控
  • ws 配置 IngressRoute 和 http一样
  • IMX6ULL的IOMUXC寄存器和SNVS复用寄存器似乎都是对引脚指定复用功能的,那二者有何区别?
  • LabVIEW实现动态水球图的方法
  • 【江协STM32】11-2/3 W25Q64简介、软件SPI读写W25Q64
  • 《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识
  • 算法日记2:洛谷p3853路标设置(二分答案)
  • 浅谈云计算06 | 云管理系统架构
  • Blender常规设置
  • c++ 中的容器 vector、deque 和 list 的区别
  • 【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程
  • 数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
  • VUE3 自定义指令的介绍
  • HTML学习笔记记录---速预CSS(2) 复合属性、盒子模型、边框线、浮动、定位
  • 二 RK3568 固件中打开 ADB 调试