03- 通过OpenCV进行图像变换 (OpenCV基础) (机器视觉)

news2024/9/20 20:38:34

知识重点

  • resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])  图像的放大与缩小, 变形

  • flip(src, flipCode)  图像的翻转

  • rotate(img, rotateCode)  图像的旋转

  • warpAffine(src, M, dsize, flags, mode, value)  仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 关键就是这个矩阵.

    • getRotationMatrix2D(center, angle, scale)  仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API

  • warpPerspective(img, M, dsize,....)  透视变换就是将一种坐标系变换成另一种坐标系. 简单来说可以把一张"斜"的图变"正".


4. 图像的基本变换

4.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 cv2
import numpy as np
#导入图片
dog = cv2.imread('./dog.jpeg')
print(dog.shape)    # (360, 499, 3)

# x,y放大一倍
new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

                

4.2 图像的翻转

  • flip(src, flipCode)

    • flipCode =0 表示上下翻转

    • flipCode >0 表示左右翻转

    • flipCode <0 上下 + 左右

# flip
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')
new_dog = cv2.flip(dog, -1)
# new_dog = dog[::-1, ::-1]  # 同样的效果

cv2.imshow('dog', np.hstack((dog, new_dog)))
cv2.waitKey(0)
cv2.destroyAllWindows()

   

4.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.ROTATE_90_COUNTERCLOCKWISE)
print(dog.shape)    # (360, 499, 3)
print(new_dog.shape)   # (499, 360, 3)

cv2.imshow('dog', dog)
cv2.imshow('new_dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

        

4.4 仿射变换之图像平移

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

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

    • M:变换矩阵

    • dsize: 输出图片大小

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

    • mode: 边界外推法标志

    • value: 填充边界值

  • 平移矩阵

    • 矩阵中的每个像素由(x,y)组成,(x, y)表示这个像素的坐标. 假设沿x轴平移​​​​​​​​\small t_x, 沿y轴平移\small t_y​​​​​​​, 那么最后得到的坐标为\small (\hat x, \hat y) = (x + t_x, y + t_y)​​​​, 用矩阵表示就是:

                 \small \left(\begin{matrix}\hat x \\\hat y \\1\end{matrix}\right) = \left(\begin{matrix}1 & 0 & t_x\\0 & 1 & t_y\\0 & 0 & 1\end{matrix}\right)\left(\begin{matrix}x \\y \\1\end{matrix}\right)

import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
print(h, w, ch)   # 360 499 3
# 变换矩阵,最少是float32位
M = np.float32([[1, -0.5, 50], [0, 1, -50]])
# 平移操作
# 注意opencv中是先宽度, 后高度.
new_dog = cv2.warpAffine(dog, M, dsize=(w, h))

cv2.imshow('dog', dog)
cv2.imshow('new_dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

        

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

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

  • getRotationMatrix2D(center, angle, scale)

    • center 中心点 , 以图片的哪个点作为旋转时的中心点.

    • angle 角度: 旋转的角度, 按照逆时针旋转.

    • scale 缩放比例: 想把图片进行什么样的缩放.

# 在进行旋转操作的时候, 不方便手动计算变换矩阵, 
# opencv提供了获取变换矩阵的API.
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
# 获取变换矩阵
# 规定按照逆时针转动图片
M = cv2.getRotationMatrix2D((w/2, h/2), 45, 1)
new_dog = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new_dog', np.hstack((dog, new_dog)))
cv2.waitKey(0)
cv2.destroyAllWindows()

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

    • dst 对应变换后的三个点

# 通过三个点来确定变换矩阵
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
src = np.float32([[100, 100], [200, 100], [200, 300]])
dst = np.float32([[100, 150], [360, 200], [280, 120]])
# 需要原始图片的三个点坐标, 和变换之后的三个对应的坐标
M = cv2.getAffineTransform(src, dst)
new_dog = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new_dog', np.hstack((dog, new_dog)))
cv2.waitKey(0)
cv2.destroyAllWindows()

       

4.6 透视变换

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

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

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

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

import cv2
import numpy as np

img = cv2.imread('./123.png')
print(img.shape)
# 获取变换矩阵
# src是原图的4个坐标
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_img = cv2.warpPerspective(img, M, (2300, 3000))
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
cv2.imshow('img', img)

cv2.namedWindow('new_img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_img', 640, 480)
cv2.imshow('new_img', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept)学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键课程表&#xff1a;Course (Cno, Cname)课程号&#xff0c;课程名 Cno为主键学生选课表&#xff1a;SC (Sno, Cno, Score)学号&…

九龙证券|豪掷超6000万,10转3派6元,今年第二只高送转股出炉!

新瀚新材高送转发布计划&#xff0c;股价年初以来大涨超50%。航运板块6股自2022年低点股价翻倍。 2月17日晚间&#xff0c;凯瑞德、新瀚新材2家公司发布了2022年年报&#xff1b;一起&#xff0c;新瀚新材高送转计划同步出炉。 报告显现&#xff0c;2022年度新瀚新材营业总收入…

软件测试简单面试

文章目录软件程序数据(库)文档服务 程序&#xff1a;完成预定功能、性能的可执行的指令操作信息的数据结构描述程序的操作和使用的文档 软件测试&#xff1a;使用技术手段来验证软件是否满足需求 软件质量&#xff1a; 满足软件需求&#xff0c;软件需求是度量软件质量的基础不…

尚医通 (十九)用户认证

目录一、对象存储OSS1、开通“对象存储OSS”服务2、创建Bucket3、上传默认头像4、创建RAM用户5、使用SDK二、后端集成OSS1、新建云存储微服务2、实现文件上传接口三、用户认证功能1、用户认证需求分析2、开发用户认证接口3、用户认证前端一、对象存储OSS 用户认证需要上传证件…

django项目实战二(django+bootstrap实现增删改查)进阶查询

目录 一、用例管理模块实现 1、创建表和数据 2、创建用例列表 1&#xff09;注册url&#xff08;用例列表&#xff09; 2)修改views.py新增case_list方法 3&#xff09;layout.html导航条新增一个用例管理 4&#xff09;新增case_list.html页面 3、新增用例页面开发 1&…

2023年TS4 入门笔记【慕课网imooc】【Vue3+React18 + TS4考勤系统】

目录 安装ts 基础 类型声明和变量声明 类型注解和类型判断 类型分类与联合类型与交叉类型​编辑 never类型与any类型与unknown类型 类型断言与非空断言 数组类型和元祖类型 对象类型与索引签名 函数类型与void类型 函数重载与可调用注解 枚举类型与const枚举 进阶…

机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

问题 1.无法外接显示器 最大的问题就是目前无法外接显示器&#xff0c;因为机械革命大多数型号笔记本电脑的HDMI、DP接口都是直接物理接在独显上的&#xff0c;内屏用核显外接显示器接独显&#xff0c;英伟达独显也是黑苹果无法驱动的&#xff0c;而且发现机械革命tpyec接口还…

k8s的基础概念

目录 一、k8s概念 1、k8s是什么 2、为什么要用k8s 3、k8s的特性 二、kubernetes集群架构与组件 1、Master组件 1.1、Kube-apiserver 1.2、Kube-controller-manager 1.3、Kube-scheduler 2、配置储存中心 3、Node组件 3.1、Kubelet 3.2、Kube-Proxy 3.3、docker 或…

SAP S/4 HANA 现金流量表

S4 HANA中的现金流量表 引言&#xff1a;在传统SAP ECC中我们实现现金流量表的方式通常是定义一系列和现金流变动相关的原因代码&#xff08;Reason Code&#xff09;&#xff0c;然后在过账凭证里指定对应的Code&#xff0c;最后通过ABAP代码抓取这些数据产生现金流量表。此方…

力扣(LeetCode)417. 太平洋大西洋水流问题(2023.02.19)

有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; heights[r][c]…

【pm2】pm2的安装与基本命令:

文章目录一、安装&#xff1a;二、基本命令&#xff1a;【1】启动命令&#xff1a;pm2 start app.js【2】命令行参数&#xff1a;pm2 start app.js --watch -i max【3】 查看有哪些进程&#xff1a;pm2 list【4】停止命令&#xff1a; pm2 stop app_name | app_id &#xff08;…

el-table 复杂表头行内增删改代码示例

效果如图 <template><div class"app-container"><el-card class"box-card item"><div slot"header" class"clearfix" click"showCondition !showCondition"><span><i class"el-ic…

外籍在读博士|赴新西兰奥克兰大学双院士导师麾下联合培养

N同学来自阿拉伯国家&#xff0c;但本硕博都是在我国某省属高校就读&#xff0c;现为材料学专业一年级博士生。联合培养首选澳洲国家&#xff0c;包括澳大利亚和新西兰&#xff0c;其次是美国&#xff0c;希望在2023年初出国&#xff0c;以完成整个学年的学习计划。在我们的帮助…

Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误

前言想必大家曾经被各种Native Crash折磨过&#xff0c;本地测试没啥问题&#xff0c;一到线上或者自动化测试就出现各种SIGSEGV、SIGABRT、SIGILL、SIGBUS、SIGFPE异常&#xff0c;而且堆栈还是崩溃到libc.so这种&#xff0c;看起来跟我们的代码没啥关系&#xff0c;关键还不好…

Spark3每个job之间任务间隔过长

公司的跑批引擎从impala改成Spark3已经有一个多月了。 不得不说&#xff0c;跑批稳定了好多。资源控制有相对稳定了很多。Spark3比CDH的hive on spark2.4.0要快不少。AQE和CBO真的挺强的。但是使用中发现了一个很奇怪的事情。这个问题在网上搜过&#xff0c;并没有实际解决。 当…

【机器学习】决策树-ID3算法

1.ID3算法 ID3算法利用信息增益进行特征的选择进行树的构建。信息熵的取值范围为0~1&#xff0c;值越大&#xff0c;越不纯&#xff0c;相反值越小&#xff0c;代表集合纯度越高。信息增益反映的是给定条件后不确定性减少的程度。每一次对决策树进行分叉选取属性的时候&#x…

CANopen概念总结、心得体会

NMT网络管理报文&#xff1a; NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文。常见报文说明&#xff1a; 0101---------------网络报文发送Nmt_Start_Node&#xff0c;让电机进入OP模式(此时还不会发送同步信号) setState(d, Operational)------------------开启…

拳打DALL-E 2脚踢Imagen,谷歌最新Muse模型刷新文本图像合成排行榜

原文链接&#xff1a;https://www.techbeat.net/article-info?id4501 作者&#xff1a;seven_ 论文链接&#xff1a; https://arxiv.org/abs/2301.00704 项目主页&#xff1a; https://muse-model.github.io/ 近期火爆AI社区的文本图像合成模型家族又添新成员了&#xff0c;之…

网络计划--时间参数的计算和优化

根据网络图的基本概念和原则绘制出网络图之后&#xff0c;我们可以计算网络图中有关的时间参数&#xff0c;主要目的是找出关键路线&#xff0c;为网络计划的优化、调整和执行提供明确的时间概念。如下图中从始点①到终点⑧共有4条路线&#xff0c;可以分别计算出每条路线所需的…

基于Hive的河北新冠确诊人数分析系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…