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*pix,y = centerM_ = 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:continueif dst[0][0]>=width or dst[0][0]<0:continueout_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(进行仿射变化)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java语言——封装

一.封装的定义 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问…

linux|将用户加入白名单

一 用root用户找到etc\sudoers文件 cd etc 二 修改etc\sudoers 文件的权限 默认是只读的 修改为可写的 chmod uw sudoers 三 打开 sudoers文件&#xff0c;在Allow root to run any commands anywhere 后面 添加一条&#xff08;把上面的一条内容复制下来 修改用户名即…

什么是程控电源?以及程控电源的工作原理与应用。

一、程控电源的简介&#xff1a; 程控电源是一种具有编程功能的电源设备&#xff0c;它可以通过外部控制来设定输出电压、电流的稳压、稳流或稳压/稳流模式&#xff0c;因此可以进行电压、电流、相位、频率、功率等参数的试验和检定。一些具体的产品特性包括微机控制、高精度、…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

电商平台数据有哪些?如何进行电商平台数据分析?(内附模板及工具)

在电商日常的贩卖工作中会产生大量的数据&#xff0c;如果你还不知道如何利用这些宝贵的数据指导未来的销售策略、增长销售额的话&#xff0c;就和我一起看下去吧&#xff01;电商数据采集API接口包含哪些数据&#xff1f; 电商平台数据可以大致分为以下几个组成部分&#xff…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

笔试狂刷--Day3

大家好,我是LvZi,今天带来笔试狂刷--Day3 一.牛牛的快递 1.题目链接:牛牛的快递 2.分析: 简单的模拟 3.代码实现: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner i…

计算机经典黑皮书分享

计算机经典黑皮书是一套计算机科学丛书&#xff0c;其中包含了多本计算机科学领域的经典教材 提供了全面的知识体系&#xff1a;黑皮书涵盖了计算机科学的多个领域&#xff0c;如计算机组成与设计、操作系统、数据库、人工智能等。它们深入浅出地介绍了相关领域的基本概念、原…

HTTP/HTTPS详解

HTTP/HTTPS详解 1. HTTP1.1 HTTP基础知识1.2 HTTP建立和断开连接 2. HTTPS 1. HTTP 1.1 HTTP基础知识 HTTP是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用 于从WWW服务器传输超文本到本…

C++学习————第八天(C/C++内存管理)

目录 1、1.C/C内存分布 2、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4.operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式&#xff1a; 若干个音&#xff0c;按照某种规则排列起来&#xff0c;就是调式&#xff0c;调式是一个非常大&#xff0c;非常抽象的概念&#xff0c;调式这两个字是一个统称&#xff0c;当明确了 若干个音 到底有几个音&#xff0c;某种规则到底是什么规则之后&#xff0c…

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…

Spring Security 入门篇(一)-- 简介

引言 Spring Security 官方文档 https://spring.io/projects/spring-security Spring Security 中文文档 &#xff1a; https://springdoc.cn/spring-security/ Spring Cloud 中文文档 https://www.springcloud.cc/spring-security.html#overall-architecture 一、简介 1. 什…

poll实现echo服务器的并发

poll实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #include <unistd.h> #…

【JAVA】实现只有一个窗口弹出的底层逻辑——单身模式

目录 背景说明 代码实现 手写笔记 背景说明 有的时候&#xff0c;当你点击一个选项时会弹出来多个窗口&#xff0c;而有的时候只会弹出一个。 实际上&#xff0c;弹出多个窗口就是创建了多个相同的对象&#xff0c;而只弹出一个就是我们今天即将分享的单身模式——一个类只产生…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

润石科技(RUNIC)汽车电子应用方案和物料选型

一、润石科技&#xff08;RUNIC&#xff09;简介 江苏润石科技有限公司是一家专注于高性能、高品质模拟/混合信号集成电路研发和销售的高科技半导体设计公司。公司主要产品线分为两类&#xff1a;信号链和电源管理&#xff0c;其中信号链包含运算放大器、比较器、模拟开关、数…