cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现

  • 1、图像旋转opencv实现
  • 2、cv2.getRotationMatrix2D函数解释
  • 3、数学原理推导旋转矩阵M
  • 4、手动计算旋转矩阵M
  • 5、旋转矩阵M的使用
  • 6、使用旋转矩阵M手动实现旋转功能

1、图像旋转opencv实现

图像旋转在对数据集数据增强(主要是随机以任意角度进行旋转)方面用途很广,是仿射变换的一种。

import numpy as np
import matplotlib.pyplot as plt
import cv2
path = "5a1672eb1027c.jpg"
img = cv2.imread(path)
def show_img(img):
    plt.figure(figsize=(10, 10))
    plt.imshow(img[:,:,::-1])
    plt.axis('off')
    plt.show()
# 获得旋转变换矩阵
M = cv2.getRotationMatrix2D((int(width/2), int(height/2)), 10, 1.0)
# 旋转变换
out_img = cv2.warpAffine(img, M, (width,height))
show_img(out_img)
print(M)

在这里插入图片描述
变换矩阵M的值
在这里插入图片描述

2、cv2.getRotationMatrix2D函数解释

接受三个参数 (x, y), angle, scale
第一个参数旋转中心,第二个参数旋转角度(正数表示逆时针),第三个参数:缩放比例

3、数学原理推导旋转矩阵M

推导过程
不改变坐标原点的位置和单位长度,只改变坐标轴方向的坐标系的变换,叫做坐标轴的旋转.
在这里插入图片描述
设点M在原坐标系中的坐标为(x,y),对应向量的模为r,幅角为α.将坐标轴绕坐标原点,按照逆时针方向旋转角θ形成新坐标系,点M在新坐标系中的坐标为(如图2-4),则
在这里插入图片描述
对于图像中的点
在这里插入图片描述
可以列出一下等式
在这里插入图片描述
可得矩阵M
在这里插入图片描述
在opencv中,负数表示的是逆时针。

也可以是以下形式,注意旋转方向与正负的关系即可。
在这里插入图片描述

4、手动计算旋转矩阵M

from math import *
def M_manual(center,a):
    a = a/180*pi
    x,y = center
    M_ = np.array(
        [[cos(a),sin(a),(1-cos(a))*x-sin(a)*y],
        [-sin(a),cos(a),(1-cos(a))*y+sin(a)*x]])
    return M_
mat_trans = M_manual((int(width/2), int(height/2)),10)
mat_trans

在这里插入图片描述
输出结果与opencv一致。

5、旋转矩阵M的使用

目标点坐标可以根据M矩阵计算得出。公式如下
在这里插入图片描述
在这里插入图片描述

6、使用旋转矩阵M手动实现旋转功能

out_img = np.zeros(img.shape,dtype=np.uint8)
# print(height,width,out_img.shape)
# mat_trans@np.array([[height],[width],[1]])
for i in range(width):
    for j in range(height):
        # print(imgs[i,j,:])
        ori = np.array([[i],[j],[1]])
        dst = np.dot(mat_trans,ori).astype(int)
        if dst[1][0]>=height or dst[1][0]<0:
            continue
        if dst[0][0]>=width or dst[0][0]<0:
            continue
        out_img[dst[1][0],dst[0][0],:] = img[j,i,:]
imgs = np.hstack([out_img,img])  
show_img(out_img)

在这里插入图片描述
与opencv结果一致,说明实现正确。
粗浅理解,如有问题,请批评指正。
感谢参考文献的作者。
参考:
图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress自动记录404死链方法+实用代码

WordPress自动记录404死链方法实用代码 WordPress自动将404死链记录到TXT文档中 在网站根目录新建文件&#xff1a; 404.txt&#xff0c;并设置权限为&#xff1a;755 将以下代码粘贴到你的 WordPress 主题中的 404.php $error_url https://.$_SERVER[HTTP_HOST].$_SERVER[…

python爬虫小案例——汽车之家

本篇文章是使用bs4中的BeautifulSoup和requests解析网页和获取数据&#x1f451;&#x1f31f; 文章目录 &#x1f31f;前言一、&#x1f349;bs4中的BeautifulSoup二、&#x1f349;bs4的语法三、&#x1f349;内容实践1. 确定想要爬取的内容2. 分析网页3. 获取数据分析 &…

【微服务】spring读取配置文件多种方式深入详解

目录 一、前言 二、java配置文件介绍 2.1 java配置文件产生原因 2.2 项目使用配置文件好处 2.3 springboot项目配置文件的必要性 2.4 微服务架构下配置文件使用场景 三、java读取配置文件常用方法 3.1 使用Properties类读取配置文件 3.1.1 使用getResourceAsStream读取…

【C语言】操作符相关编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目一&#xff1a; 题目&#xff1a;不创建临时变量&#xff0c;交换两个数…

代码托管基础操作

在待上传代码文件夹中右键&#xff0c;打开Git Bash Here依次输入以下命令&#xff1a; git init(在本地初始化一个代码仓库&#xff0c;具体表现为会在你的文件夹里出现一个隐藏的.git文件夹) git add .&#xff08;先把代码放到本地的一个缓冲区&#xff09;添加当前目录下的…

Windows使用freeSSHd搭建sftp服务器

一、安装 1、运行freeSSHd.exe&#xff08;最好以管理员方式运行&#xff09; 2、选择安装位置 3、选择全部安装 4、是否创建开始启动栏快捷入口 5、是否创建桌面快捷方式 6、安装 7、安装完成&#xff0c;点击close 8、安装私钥 9、是否要安装为服务 10、全部安装完成 二、配…

查找输入整数的二进制中1的个数

方法1&#xff1a;简单做法&#xff0c;直接用库函数 #include<bitset> #include<iostream> using namespace std; int main(){int n;while(cin>>n){bitset<32> b(n);cout<<b.count()<<endl;} }补充bitset //注意&#xff1a;直接输出 b…

EasyExcel导出图片并实现动态表头、自动合并单元格、给指定单元格设置值

概要描述 最近工作中涉及到使用Excel导出图片的需求,下面对使用Excel导出图片遇到的一些问题进行记录说明。需求通过 EasyExcel中提供的转换器(Converter)和拦截器(Handler)实现。EasyExcel 官网地址 实现效果 实现过程 EasyExcel 支持导出 ByteArray、File、String、In…

软件缺陷和测试用例

软件缺陷 软件缺陷概念 Bug有时也被泛指因软件产品内部的缺陷引起的软件产品最终运行时和预期属性的偏离。 产生原因 1.需求不明确2.软件结构复杂3.编码问题4.项目期限短5.使用新技术 类型 错误、遗漏、额外实现 准则 Correct&#xff08;准确&#xff09;&#xff1a;…

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙&#xff0c;开启了大模型时代&#xff0c;国内也有不错的产品&#xff0c;比如百度的文心一言&#xff0c;从3.5到4.0看得见的成长&#xff0c;现在的文心一言是我们工作中不可缺少的好帮手&am…

基于单片机的智能病床呼叫系统设计与仿真

摘 要 本文设计的病床呼叫系统采用单片机作为控制器。该系统具有远程控制、病人的身体情况检测、报警呼叫、显示和执行器运动的功能。远程控制由红外线传感器和矩阵键盘组成&#xff0c;检测电路由温湿度传感器DH22、心率传感器Pulse Sensor、压力传感器MPX4115组成&#x…

uniapp 如何区分目前运行环境(app、web、mp-weixin)

platform 区分 iOS、Android uniplatform 区分 app、web、mp-weixin ....

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

学习笔记<2024.4.15-2024.4.21>:Attention Is All You Need

Transformer中Self-Attention以及Multi-Head Attention详解 (https://www.bilibili.com/video/BV15v411W78M/?spm_id_from333.337.search-card.all.click&vd_sourcef32decb03075b4a1833fe5c47c11ba94)

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状&#xff0c;比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

windows驱动开发-WDM框架(一)

在前面的文章中解释过&#xff0c;NT5.0之后windows确定了新的架构Windows Driver Model (WDM)&#xff0c;在Vista之后又推出了Windows Driver Framework(WDF)&#xff0c;这两个都属于驱动程序框架&#xff0c;那么它们的之间的关系是怎样的&#xff1f; WDF是对WDM进行的封…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…