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

OpenCV 06(图像的基本变换)

一、图像的基本变换

1.1 图像的放大与缩小

- resize(src, dsize, dst, fx, fy, interpolation)

  - src: 要缩放的图片
  - dsize: 缩放之后的图片大小, 元组和列表表示均可.
  - dst: 可选参数, 缩放之后的输出图片
  - fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.
  - interpolation: 插值算法, 主要有以下几种:
    - INTER_NEAREST, 邻近插值, 速度快, 效果差.
    - INTER_LINEAR, 双线性插值,  使用原图中的4个点进行插值. 默认.
    - INTER_CUBIC, 三次插值, 原图中的16个点.
    - INTER_AREA, 区域插值, 效果最好, 计算时间最长.

 import cv2import numpy as np#导入图片dog = cv2.imread('./dog.jpeg')# x,y放大一倍new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)cv2.imshow('dog', new_dog)cv2.waitKey(0)cv2.destroyAllWindows()

1.2 图像的翻转

- flip(src, flipCode)
  - flipCode =0 表示上下翻转
  - flipCode >0 表示左右翻转
  - flipCode  <0 上下 + 左右

# 翻转
import cv2
import numpy as np#导入图片
dog = cv2.imread('./dog.jpeg')new_dog = cv2.flip(dog, flipCode=-1)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.3 图像的旋转

- rotate(img, rotateCode)
  - ROTATE_90_CLOCKWISE 90度顺时针
  - ROTATE_180 180度
  - ROTATE_90_COUNTERCLOCKWISE 90度逆时针

# 旋转
import cv2
import numpy as np#导入图片
dog = cv2.imread('./dog.jpeg')new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.4 仿射变换之图像平移

- 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 所以关键就是这个矩阵. 

- warpAffine(src, M, dsize, flags, mode, value)

- M:变换矩阵

- dsize: 输出图片大小

- flag: 与resize中的插值算法一致

- mode: 边界外推法标志

- value: 填充边界值

- 平移矩阵

 # 仿射变换之平移import cv2import numpy as np#导入图片dog = cv2.imread('./dog.jpeg')h, w, ch = dog.shapeM = np.float32([[1, 0, 100], [0, 1, 0]])# 注意opencv中是先宽度, 再高度new = cv2.warpAffine(dog, M, (w, h))cv2.imshow('new', new)cv2.waitKey(0)cv2.destroyAllWindows()

1.5 仿射变换之获取变换矩阵

仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API

- getRotationMatrix2D(center, angle, scale)
  - center 中心点 , 以图片的哪个点作为旋转时的中心点.
  - angle 角度: 旋转的角度, 按照逆时针旋转.
  - scale 缩放比例: 想把图片进行什么样的缩放.

# 仿射变换之平移
import cv2
import numpy as np#导入图片
dog = cv2.imread('./dog.jpeg')h, w, ch = dog.shape
# M = np.float32([[1, 0, 100], [0, 1, 0]])# 注意旋转的角度为逆时针.
# M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
# 以图像中心点旋转
M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()

- getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.

  - src原目标的三个点
  - dst对应变换后的三个点

 # 通过三个点来确定M# 仿射变换之平移import cv2import numpy as np#导入图片dog = cv2.imread('./dog.jpeg')h, w, ch = dog.shape# 一般是横向和纵向的点, 所以一定会有2个点横坐标相同, 2个点纵坐标相同src = np.float32([[200, 100], [300, 100], [200, 300]])dst = np.float32([[100, 150], [360, 200], [280, 120]])M = cv2.getAffineTransform(src, dst)# 注意opencv中是先宽度, 再高度new = cv2.warpAffine(dog, M, (w, h))cv2.imshow('new', new)cv2.waitKey(0)cv2.destroyAllWindows()

1.6 透视变换

透视变换就是将一种坐标系变换成另一种坐标系. 简单来说可以把一张"斜"的图变"正".

- warpPerspective(img, M, dsize,....)

- 对于透视变换来说, M是一个3 * 3 的矩阵.

- getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角. 

# 透视变换import cv2import numpy as np#导入图片img = cv2.imread('./123.png')print(img.shape)src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])M = cv2.getPerspectiveTransform(src, dst)new = cv2.warpPerspective(img, M, (2300, 3000))cv2.namedWindow('img', cv2.WINDOW_NORMAL)cv2.resizeWindow('img', 640, 480)cv2.namedWindow('new', cv2.WINDOW_NORMAL)cv2.resizeWindow('new', 640, 480)cv2.imshow('img', img)cv2.imshow('new', new)cv2.waitKey(0)cv2.destroyAllWindows()

相关文章:

OpenCV 06(图像的基本变换)

一、图像的基本变换 1.1 图像的放大与缩小 - resize(src, dsize, dst, fx, fy, interpolation) - src: 要缩放的图片 - dsize: 缩放之后的图片大小, 元组和列表表示均可. - dst: 可选参数, 缩放之后的输出图片 - fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比. - …...

Java 中的日期时间总结

前言 大家好&#xff0c;我是 god23bin&#xff0c;在日常开发中&#xff0c;我们经常需要处理日期和时间&#xff0c;日期和时间可以说是一定会用到的&#xff0c;现在总结下 Java 中日期与时间的基本概念与一些常用的用法。 基本概念 日期&#xff08;年月日&#xff0c;某…...

创建10个线程并发执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun(int arg) {cout << "one STL thread " << arg << " !" << endl; }int main(void) {int thread_count 1…...

三、创建各个展示模块组件

简介 在文件 components 中创建轮播模块组件,引入App.vue展示。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:First.vue、Second.vue、Third.vue、Fourth.vue、Fifth.vue、App.vue、vite-env.d.ts、assets 一、修改vite-env.d.ts文件 /// <reference type…...

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…...

无涯教程-JavaScript - IMCSC函数

描述 IMCSC函数以x yi或x yj文本格式返回复数的余割。 复数的余割定义为正弦的倒数。即 余割(z) 1 /正弦(z) 语法 IMCSC (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the cosecant.Required Notes Excel中的复数只是简单…...

Ubuntu22.04 LTS 显卡相关命令

第一部分查看驱显卡信息 一、查看显卡型号 # -i表示不区分大小写 lspci | grep -i nvidia # 必须安装好nvidia驱动 nvidia-smi -L 二、查看显卡驱动版本 cat /proc/driver/nvidia/version 三、查看CUDA、cuDNN版本 # 或者 nvcc -V&#xff08;两个显示的版本一致&#xf…...

《TCP/IP网络编程》阅读笔记--基于 TCP 的半关闭

目录 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 1-2--shutdown()函数 1-3--半关闭的必要性 2--基于半关闭的文件传输程序 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 Linux 系统中的 close 函数会将 TCP Socket 的连接完全断开&#xff0c;这意味着不能收…...

Rust的模块化

Rust的模块化要从Rust的入口文件谈起。 Rust的程序的入口文件有两个 如果程序类型是可执行应用&#xff0c;入口文件是main.rs&#xff1b;如果程序类型是库&#xff0c;入口文件是lib.rs&#xff1b; 入口文件中&#xff0c;必须声明本地模块&#xff0c;否则编译器在编译过…...

vmware设置桥接模式后ip设置

网络连接方式设置 找到虚拟机里机器的网络设置 左边是宿主机&#xff0c;右边是虚拟机&#xff0c;按照这个设置就可以上网了(IP指定一个没有占用的值&#xff0c;子网掩码和网关设置成一样的)就可以联网了。 over~~...

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题&#xff0c;参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议&#xff0c;因此题目的本质是判断是否存在重叠区间 将区…...

目标检测评估指标mAP:从Precision,Recall,到AP50-95

1. TP, FP, FN, TN True Positive 满足以下三个条件被看做是TP 1. 置信度大于阈值&#xff08;类别有阈值&#xff0c;IoU判断这个bouding box是否合适也有阈值&#xff09; 2. 预测类型与标签类型相匹配&#xff08;类别预测对了&#xff09; 3. 预测的Bouding Box和Ground …...

七大排序算法

目录 直接插入排序 希尔排序 直接选择排序 堆排序 冒泡排序 快速排序 快速排序优化 非递归实现快速排序 归并排序 非递归的归并排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 常见的排序算法有插入排序(直接插入…...

GitHub two-factor authentication

1. 介绍 登录 GitHub 官网&#xff0c;会提示要开启双因子认证。 但推荐的 APP 都是国外了&#xff0c;国内用不了。 可以使用 “腾讯身份验证器” 微信小程序。 2. 操作 开启双因子认证&#xff1a; 打开 “腾讯身份验证器” 微信小程序&#xff0c;扫描 GitHub 那个二维…...

un-app-手机号授权登录-授权框弹不出情况

前言 手机号授权是获取用户信息api停用之后&#xff0c;经常使用的api。但是此api也是有很多坑 手机号授权会出现调用不起来的情况&#xff0c;这是因为小程序后台没有进行微信认证导致的 手机号授权调用不起来-没有微信认证 来到小程序后台-设置-基本设置-下拉找到微信认证…...

手写Spring:第14章-自动扫描Bean对象注册

文章目录 一、目标&#xff1a;自动扫描Bean对象注册二、设计&#xff1a;自动扫描Bean对象注册三、实现&#xff1a;自动扫描Bean对象注册3.0 引入依赖3.1 工程结构3.2 Bean生命周期中自动加载包扫描注册Bean对象和设置占位符属性类图3.3 主力占位符配置3.4 定义拦截注解3.4.1…...

redux中间件的简单讲解

redux中间件 中间件的作用&#xff1a; 就是在 源数据 到 目标数据 中间做各种处理&#xff0c;有利于程序的可拓展性&#xff0c;通常情况下&#xff0c;一个中间件就是一个函数&#xff0c;且一个中间件最好只做一件事情 数据源 --------> 中间件 --------> 中间件 -…...

嵌入式开发-绪论

目录 一.什么是嵌入式 1.1硬件系统 1.2软件系统 二.嵌入式应用场景 2.1消费电子 2.1.1智能家居 2.1.2影音 2.1.3家用电器 2.1.4玩具游戏机 2.2通信领域 2.2.1对讲机 2.2.2手机 2.2.3卫星 2.2.4雷达 2.3控制领域 2.3.1机器人 2.3.2采集器PLC 2.4金融 2.4.1POS…...

大数据知识合集之预处理方法

数据预处理方法主要有&#xff1a; 数据清洗、数据集成、数据规约和数据变换。 1、数据清洗 数据清洗(data cleaning) &#xff1a;是通过填补缺失值、光滑噪声数据&#xff0c;平滑或删除离群点&#xff0c;纠正数据的不一致来达到清洗的目的。 缺失值处理 实际开发获取信…...

mysql(九)mysql主从复制

目录 前言概述提出问题主从复制的用途工作流程 主从复制的配置创建复制账号配置主库和从库启动主从复制从另一个服务器开始主从复制主从复制时推荐的配置sync_binloginnodb_flush_logs_at_trx_commitinnodb_support_xa1innodb_safe_binlog 主从复制的原理基于语句复制优点&…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...