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

OpenCV计算机视觉 08 图像的旋转

图像的旋转

下面是一张小猪佩奇的照片,请进行顺时针90度,逆时针90度,180度旋转

方法一:使用了 NumPy 库的 np.rot90() 函数来实现图像的旋转

np.rot90(img, k=-1) 表示将输入的图像 img 顺时针旋转 90 度,

np.rot90(img, k=1) 表示将图像逆时针旋转 90 度。

import cv2
import numpy as np
#导入原图
img=cv2.imread('小猪佩奇.png')
​
​
# 旋转 90 度,k=-1 表示顺时针旋转 90 度
rotated_image1 = np.rot90(img, k=-1)
# 旋转 90 度,k=1 表示逆时针旋转 90 度
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()

方法二:OpenCV 库的 cv2.rotate() 函数来实现图像的旋转

cv2.rotate(image, flag)

参数说明:

image:要旋转的图像。

flag:指定旋转的方式,有以下几种取值:

cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90 度

cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90 度

cv2.ROTATE_180:旋转 180 度

然后通过 cv2.imshow() 函数分别展示顺时针旋转 90 度后的图像(名为 shun90 )、逆时针旋转 90 度后的图像(名为 ni90 )和旋转 180 度后的图像(名为 180 )。

import cv2
#导入原图
img=cv2.imread('小猪佩奇.png')
​
rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)  #顺时针90度
rotated_image1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)  #逆时针90度
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180)    #旋转180度
cv2.imshow('shun90',rotated_image)
cv2.imshow('ni90',rotated_image1)
cv2.imshow('180',rotated_image2)
cv2.waitKey(0)

这两种方法只能进行90度的整数倍的度数旋转,那要是旋转30度,60度怎么办呢

我们可以先写入下面这个函数

def rotate_image(image, angle, direction='counterclockwise'):(h, w) = image.shape[:2]  # 获取图像的高度 h 和宽度 wcenter = (w // 2, h // 2)  # 计算图像的中心坐标
​if direction == 'counterclockwise':  # 如果旋转方向是逆时针M = cv2.getRotationMatrix2D(center, angle, 1.0)  # 获取逆时针旋转的变换矩阵elif direction == 'clockwise':  # 如果旋转方向是顺时针M = cv2.getRotationMatrix2D(center, -angle, 1.0)  # 获取顺时针旋转的变换矩阵
​rotated = cv2.warpAffine(image, M, (w, h))  # 应用变换矩阵对图像进行旋转return rotated  # 返回旋转后的图像

直接调用这个函数就可以旋转任意度数了

import cv2
#导入原图
img=cv2.imread('小猪佩奇.png')
​
shun30 = rotate_image(img, 30, 'clockwise')  # 顺时针旋转 30 度
ni60= rotate_image(img, 60, 'counterclockwise')  # 逆时针旋转 60 度
​
cv2.imshow('original', img)
cv2.imshow('shun30', shun30)
cv2.imshow('ni60', ni60)
cv2.waitKey(0)

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

相关文章:

  • C++感受15-Hello STL 泛型启蒙
  • 【Java 学习】对象赋值的艺术:Java中clone方法的浅拷贝与深拷贝解析,教你如何在Java中实现完美复制
  • 基于高斯混合模型的数据分析及其延伸应用(具体代码分析)
  • 无人机+Ai应用场景!
  • 操作手册:集成钉钉审批实例消息监听配置
  • AI大模型-提示工程学习笔记4
  • Vue3.5 企业级管理系统实战(一):项目初始搭建与配置
  • 缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)
  • 杭州市有哪些大学能够出具论文检索报告?
  • SpringBootWeb 登录认证(day12)
  • 使用AOP在切面逻辑中无法获取到requesetBody
  • 生成模型:变分自编码器-VAE
  • Hive sql执行文件合并配置参数
  • 鸿蒙 ArkUI实现地图找房效果
  • 一套极简易的直流无刷电机(Deng FOC)开发套件介绍
  • Inception模型详解及代码分析
  • Springboot AOP 每个接口运行前 修改入参
  • 课题推荐——基于GPS的无人机自主着陆系统设计
  • 【深度学习】在深度学习训练过程中,数据量太少会导致模型过拟合还是欠拟合?
  • js迭代器模式
  • 测试开发基础知识2
  • PromQL基础使用和案例解析
  • 使用Python实现基于机器学习的垃圾邮件过滤
  • MySql根据经纬度查询距离
  • Aviatrix Controller 未授权命令注入漏洞复现(CVE-2024-50603)
  • 数据结构与算法之二叉树: LeetCode 109. 有序链表转换二叉搜索树 (Ts版)
  • Android NDK开发入门2之适应idm环境
  • 如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性
  • 鸿蒙的APP真机调试以及发布
  • 图像处理|膨胀操作