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

news2024/12/28 20:15:51

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(进行仿射变化)

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

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

相关文章

Spring 声明式事务控制

1. 编程式事务控制相关对象 1.1 PlatformTransactionManager PlatformTransactionManager 接口是 spring 的事务管理器&#xff0c;它提供了我们常用的操作事务的方法。 PlatformTransactionManager 是接口类型&#xff0c;不同的 Dao 层技术则有不同的实现类。例如:Dao层技…

Sileo安装插件报错:Depends mobilesubstrate

Sileo安装插件报错 iOS 15.8系统&#xff0c;使用palera1n越狱&#xff0c;然后使用Sileo安装插件的时候&#xff0c;有些插件会报错&#xff1a;Depends mobilesubstrate&#xff08;比如AppStore plus&#xff09; 报错的原因分析 从提示信息很容易可以看出&#xff0c;当…

upload-labs第十一十二关

第十一关 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],".")1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES[upload_fil…

MySQL-进阶篇-一条sql更新语句是如何执行的(redo log和binlog)

上一篇&#xff1a;一条sql查询语句是如何执行的 http://t.csdnimg.cn/nV3EY 摘自&#xff1a;林晓斌MySQL实战45讲——第二篇 更新语句的执行过程与上一篇查询流程相同&#xff0c;本篇简写。 但多了两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff0…

leetcode:滑动窗口----3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

利用穷举算法求一个整数数组A中的逆序对的个数(C语言)

目录 实验内容&#xff1a; 实验过程&#xff1a; 1.算法设计 2.程序清单 3.复杂度分析 4.实验结果 实验内容&#xff1a; 给定一个整数数组A&#xff08;a0,a1,…,an-1&#xff09;&#xff0c;若i<j且ai>aj&#xff0c;则<ai,aj>就为一个逆序对&#xff0c…

STM32电机控制SDK实战

一、前言 本次测试基于ST开发板NUCLEO-F302R8&#xff0c;驱动板X-NUCLEO-IHM07M1&#xff0c;使用无刷直流电机BLDC实现FOC控制&#xff1b;采样三霍尔传感器检测电机转子位置&#xff1b;基于速度环闭环控制实现电机转动&#xff1b; 二、实战环境 软件环境&#xff1a; 1…

布隆过滤器初探

1、什么是布隆过滤器 布隆过滤器是一个很长的二进制向量和一系列随机hash函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 常见的hash函数的应用hashMap、hashSet等 回顾一下hashMap的结构 hashMap由数组链表红黑树&#xff08;java1.8后&#xff0c;链表元素长度大…

Redis入门到通关之GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务&#xff0c;展示蓝牙相关API用法。实现了以下几点功能&#xff1a; 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描&#xff1a;通过BLE扫描接口实现对…

【DA-CLIP】图像复原在AutoDL上部署测试

起因&#xff1a; 虽然在本机Windows部署成功运行&#xff0c;但是由于计算资源少只有6G的GPU无法计算手机拍摄图像复原和其他一些数据集测试&#xff0c;尝试租用AutoDL的服务器部署测试 租AutoDL 租的人很多&#xff0c;刚确定运行的镜像环境就报告说这个机子已经没卡了&am…

《QT实用小工具·二十八》基于qt开发的各种曲线

1、概述 源码放在文章末尾 该项目实现了各种曲线的绘制&#xff0c;下面是项目的demo演示&#xff1a; 项目部分代码如下&#xff1a; #include "frmsmoothcurve.h" #include "ui_frmsmoothcurve.h" #include "smoothcurve.h" #include "…

中颖51芯片学习7. printf重定向到串口与自定义日志输出函数

中颖51芯片学习7. printf重定向到串口与自定义日志输出函数 一、 printf 重定向1. 概念2. 实现方式3. C51 中printf数值格式化 二、日志函数1. 实现方案分析2. 代码&#xff08;1&#xff09;log_utils.h&#xff08;2&#xff09;main.c 3. 通过预定义宏实现日志分级输出&…

偏微分方程算法之二维初边值问题(紧交替方向隐格式)

目录 一、研究对象 二、理论推导 2.1 二维紧差分格式 2.2 紧交替方向格式 2.2.1 紧Peaceman-Rachford格式 2.2.2 紧D’Yakonov格式 2.2.3 紧Douglas格式 三、算例实现 四、结论 一、研究对象 继续以二维抛物型方程初边值问题为研究对象: 为了确保连续性,公式…

OpenHarmony移植的加解密库—libsodium [GN编译]

简介 libsodium主要是易用&#xff0c;可移植的加解密库。 下载安装 直接在OpenHarmony-SIG仓中搜索libsodium并下载。 使用说明 以OpenHarmony 3.1Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libsodium 修改添加依赖的编译脚本&#xff0c;路径&#…

区间图着色问题:贪心算法设计及实现

区间图着色问题&#xff1a;贪心算法设计及实现 1. 问题定义2. 贪心算法设计2.1 活动排序2.2 分配教室2.3 算法终止 3. 伪代码4. C语言实现5. 算法分析6. 结论7. 参考文献 在本文中&#xff0c;我们将探讨如何使用贪心算法解决一个特定的资源分配问题&#xff0c;即区间图着色问…

网站备案期间怎么关闭首页显示无法访问-文章及其它页面正常访问

自从做了开发者之后才发现每个人博主的需求都是不同的&#xff0c;的的确确颠覆了我的观点&#xff0c;无论是页面布局还是SEO相关的设置&#xff0c;可能是因为站点属性不同所以需求不同&#xff0c;慢慢的就会在主题加入一些自定接口来满足不同人的需求&#xff0c;有人需要P…

什么是IIoT?

什么是IIoT? IIoT,即工业物联网(Industrial Internet of Things),是指将物联网技术应用到工业领域,通过微型低成本传感器、高带宽无线网络等技术手段,实现工业设备、系统和服务的互联互通,从而提高生产效率、降低能耗和成本,实现智能化和自动化生产。 IIoT的应用范围…

使用isort和autopep8统一代码风格

前言 今天和大家分享一篇关于python代码风格统一的方法。我自己之前有使用过&#xff0c;但都是使用公司现成的&#xff0c;没有自己动手去实操&#xff0c;所以为了一探究竟&#xff0c;今天专门花了一点时间去研究&#xff0c;这个过程还挺顺利的&#xff0c;这里我将这个过…

【最新可用】Claude国内镜像,可上传图片,可用Claude3全系模型,包括Pro版本的Opus),亲测比GPT好用

Claude对话、上传图片的超详细教程来啦&#xff01; 近期&#xff0c;Claude 3 Opus的发布引发了网络上的广泛关注与热议&#xff0c;有观点认为其性能已经凌驾于GPT-4之上。虽然网络上已经出现了大量基于这两款先进AI技术的实际应用案例&#xff0c;但仍有许多人对在国内如何…