OpenCV学习笔记(五)——图片的缩放、旋转、平移、裁剪以及翻转操作
目录
图像的缩放
图像的平移
图像的旋转
图像的裁剪
图像的翻转
图像的缩放
OpenCV中使用cv2.resize()函数进行缩放,格式为:
resize_image=cv2.resize(image,(new_w,new_h),插值选项)
其中image代表的是需要缩放的对象,(new_w,new_h)表示的是缩放后的图片的大小为多少,插值选项可选择。
在OpenCV缩放的插值选项以及各自的特点有:
- cv2.INTER_NEAREST:最近邻插值,速度最快,但质量最差。
- cv2.INTER_LINEAR:双线性插值,速度较快,质量较好。
- cv2.INTER_CUBIC:双三次插值,速度较慢,质量最好。
- cv2.INTER_AREA:区域插值,适用于图像缩小。
- cv2.INTER_LANCZOS4:Lanczos插值,速度较慢,质量最好。
- cv2.INTER_LINEAR_EXACT:精确的双线性插值,速度较慢,质量最好。
- cv2.INTER_MAX:最大的插值方法编号。
- cv2.WARP_FILL_OUTLIERS:在变换过程中填充异常值。
- cv2.WARP_INVERSE_MAP:使用逆映射进行变换。
下面举个例子:
import cv2
import matplotlib.pyplot as plt
import numpy as npimg=cv2.imread(r'D:\Photo\1.jpeg')
img1=cv2.resize(img,(400,300),cv2.INTER_NEAREST)
img2=cv2.resize(img,(400,300),cv2.INTER_LINEAR)
img3=cv2.resize(img,(400,300),cv2.INTER_CUBIC)
img4=cv2.resize(img,(400,300),cv2.INTER_AREA)
img5=cv2.resize(img,(400,300),cv2.INTER_LANCZOS4)
img6=cv2.resize(img,(400,300),cv2.INTER_LINEAR_EXACT)
img7=cv2.resize(img,(400,300),cv2.INTER_MAX)
img8=cv2.resize(img,(400,300),cv2.WARP_FILL_OUTLIERS)
img9=cv2.resize(img,(400,300),cv2.WARP_INVERSE_MAP)titles=['Original Image','INTER_NEAREST','INTER_LINEAR','INTER_CUBIC','INTER_AREA','INTER_LANCZOS4','INTER_LINEAR_EXACT','INTER_MAX','WARP_FILL_OUTLIERS','WARP_INVERSE_MAP']
img=[img,img1,img2,img3,img4,img5,img6,img7,img8,img9]
for i in range(9):plt.subplot(3,3,i+1)plt.imshow(img[i])plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()
运行结果如下所示:
、
可以看到,当采用不同的插值选项的时候,有时并不明显,而有时会有细微差别。
图像的平移
图像的平移就是向任意一个方向移动一定的像素,由于图像本质上是一个矩阵,对图像的移动其实就是对矩阵的移动,在OpenCV中使用np.float()函数对图像进行平移。
比如下面这个例子:
import cv2
import matplotlib.pyplot as plt
import numpy as npimage=cv2.imread(r'D:\Photo\1.jpeg')
(h,w)=image.shape[:2]
M =np.float32([[1,0,50],[0,1,25]])
shifted_image=cv2.warpAffine(image,M,(w,h))
cv2.imshow('shifed_image',shifted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,np.float32([[1,0,50],[0,1,25]])表示向[1,0]方向移动50像素,向[0,1]方向移动25像素,运行结果如下所示:
图像的旋转
图像的旋转即以某一点为圆心,按顺/逆时针旋转多少角度。在OpenCV中使用cv2.getRotationMatrix2D()来对与图像进行选举案。我们知道,图像的本质就是矩阵,对于图像进行旋转的过程中本质就是对于矩阵进行旋转,cv2.getRotationMatrix2D()一共有三个参数,其中第一个是旋转所固定的点,第二个是旋转的角度,第三个是图片缩放的尺度。完成之后,需要对于图片进行仿射变换,使用warpAffine()来完成。例如:
import cv2
img=cv2.imread(r'D:\Photo\1.jpeg')
w,h=img.shape[:2]
center=(w//2,h//2)
rotation_matrix=cv2.getRotationMatrix2D(center,90,1.0)
rotation_image=cv2.warpAffine(img,rotation_matrix,(w,h))
type(rotation_image)
cv2.imshow('rotation_image',rotation_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
注:
cv2.warpAffine()在OpenCV中是对于图像进行仿射变化,需要输入两个参数,分别是原始图像和变换矩阵。仿射变换用于图像的平移、旋转、缩放等。
运行结果如下所示:
可以看到在运行出来的图像中,图像比原图逆时针旋转了90°。
如果将旋转的角度定为45°时,即代码为:
rotation_matrix=cv2.getRotationMatrix2D(center,45,1.0)
运行结果如下所示:
可以看到,在旋转之后的图片中,因为展示图片的大小以及角度原因,可以看到四个棱角的地方无法展示,而多余的部分使用黑色来填充。
图像的裁剪
我们知道,图像的本质就是一个矩阵,现在我们想对图像进行裁剪,即为截取矩阵的部分内容,即为new_image=image[x1:x2,y1:y2],其中x1、x2、y1、y2为指定的横坐标和纵坐标。
例如:
import cv2
import matplotlib.pyplot as plt
import numpy as np#读取图片内容
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()img=cv2.imread(r'D:\Photo\1.jpeg')
img1=img[0:300,200:400]
#截取原图像0-300行和200-400列
cv_show('image',img1)
运行效果如下所示:
可以看到,OpenCV截取指定部分的内容。
图像的翻转
图像的翻转可以分为水平方向的翻转和垂直方向的翻转,OpenCV中使用cv2.flip(),其中第一个参数是需要翻转的图片,第二个参数是如何翻转,若第二个参数为1,则表示水平翻转;若第二个参数为0,表示水平翻转,若第二个参数为-1,则表示水平加垂直翻转。
例如:
import cv2
import matplotlib.pyplot as plt
import numpy as mpimage=cv2.imread(r'D:\Photo\1.jpeg')
flipped_image1=cv2.flip(img,1)
flipped_image2=cv2.flip(img,0)
flipped_image3=cv2.flip(img,-1)
images=[image,flipped_image1,flipped_image2,flipped_image3]for i in range(4):plt.subplot(2,2,i+1)plt.imshow(images[i])plt.xticks([]),plt.yticks([])
plt.show()
运行结果如下所示:
可以看到上面四张图分别是原图、水平翻转、垂直翻转、水平垂直翻转,水平垂直翻转。
相关文章:

OpenCV学习笔记(五)——图片的缩放、旋转、平移、裁剪以及翻转操作
目录 图像的缩放 图像的平移 图像的旋转 图像的裁剪 图像的翻转 图像的缩放 OpenCV中使用cv2.resize()函数进行缩放,格式为: resize_imagecv2.resize(image,(new_w,new_h),插值选项) 其中image代表的是需要缩放的对象,(new_w,new_h)表…...

c++ 串口通信库
根据资料整理的串口通信库,封装成为了动态库,使用者只需要调用接口即可 使用实例如下: //接受数据 void CSerialPortCommonLibDemoDlg::OnReceive() { char * str NULL; str new char[256]; _port.readAllData(str); CString s…...

数据结构之单链表及其实现!
目录 编辑 1. 顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除…...

Ubuntu 22.04修改静态ip
1. 备份原网络配置文件 # 配置文件名称因机器设置有异 cd /etc/netplan cp 01-network-config.yaml 01-network-config.yaml.bak# 文件内容如下 network:version: 2renderer: NetworkManager2. 修改配置文件 使用 ipconfig 命令查看网络信息,ip addr 命令也可 我这…...

kali当中不同的python版本切换(超简单)
kali当中本身就是自带两个python版本的 配置 update-alternatives --install /usr/bin/python python /usr/bin/python2 100 update-alternatives --install /usr/bin/python python /usr/bin/python3 150 切换版本 update-alternatives --config python 0 1 2编号选择一个即可…...
MongoDB聚合运算符;$dateToString
$dateToString聚合运算符按用户指定的格式将日期对象转为字符串。 语法 { $dateToString: {date: <dateExpression>,format: <formatString>,timezone: <tzExpression>,onNull: <expression> } }字段说明: 字段是否必须描述date是<da…...

【开源】SpringBoot框架开发教学资源共享平台
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…...

python基础——条件判断和循环【if,while,for,range】
📝前言: 这篇文章主要讲解一下条件判断语句if和循环语句while,for在python中需要注意的地方。 建议已有一定了解(对语句的执行逻辑清楚)的读者观看,如果对条件判断和循环的执行逻辑不太清楚,也可…...

Pytorch 复习总结 6
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 计算机视觉。 本文先介绍了计算机视觉中两种常见的改进模型泛化性能的方法:…...

借助 Terraform 功能协调部署 CI/CD 流水线-Part 1
在当今快节奏的开发环境中,实现无缝、稳健的 CI/CD 流水线对于交付高质量软件至关重要。在本文中,我们将向您介绍使用 Bitbucket Pipeline、ArgoCD GitOps 和 AWS EKS 设置部署的步骤,所有步骤都将利用 Terraform 的强大功能进行编排。在Part…...

云原生基础知识:容器技术的历史
容器化的定义: 容器化是一种轻量级的虚拟化技术,将应用程序及其所有依赖项(包括运行时、系统工具、系统库等)打包到一个称为容器的单独单元中。容器提供了一种隔离的执行环境,使得应用程序可以在不同的环境中运行&…...

golang实现正向代理和反向代理
文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…...
grpc四种数据流
grpc四种数据流 简介 1.简单模式 这种模式最为传统,即客户端发起一次请求,服务端响应一个数据,这和大家平时熟悉的rpc没什么区别,所以不在详细介绍 2.服务端数据流模式 这种模式是客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端向服务端发…...

SpringCloud-Alibaba-Nacos教程
SpringCloud-Alibaba-Nacos教程 下载地址 https://github.com/alibaba/nacos/releases/tag/2.2.3 直接进入bin包 运行cmd命令 startup.cmd -m standalone 运行成功后 进入nacos可视化页面 账号密码默认都是nacos http://localhost:8848/nacos 微服务入驻Nacos服务注册…...

bug_java
文章目录 1.创建Maven时: idea报错为:java:错误:不支持发行版本52. Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0 1.创建Maven时: idea报错为:java:错误:不支持发行版本…...
【目标检测】旋转目标检测DOTA格式转YOLO格式标注
准备DOTA格式数据集: dota_dataset -- images |----- train |----- val -- labels |----- train |----- train_original |----- val |----- val_original 修改class_mapping和图片格式: ultralytics/data/converter.py convert_dota_to_yolo_obb() 转换标…...

运动想象 (MI) 迁移学习系列 (3) : MSFT
运动想象迁移学习系列:MSFT 0. 引言1. 主要贡献2. 数据增强方法3. 基于度量的空间滤波转换器3.1 空间过滤3.2 脑电图ViT3.2.1 变压器编码器层3.2.2 基于度量的损失函数 4. 实验结果4.1 消融实验4.2 基线任务对比4.3 跨主体 5. 总结欢迎来稿 论文地址:https://www.s…...

NeRF模型NeRF模型
参考视频:https://www.youtube.com/watch?vHfJpQCBTqZs&ab_channelVision%26GraphicsSeminaratMIT NeRF模型的输入输出: 输入: (x, y, z): 一个三维空间坐标,代表场景中的一个位置点(θ, φ): 视线方向,θ表示与y轴的夹角,φ表示与x轴的夹角,用两个角度可以…...

python爬虫(4)
#前期先说明一下为啥爬虫需要学习数组的存储和处理,只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果: 新的代码: import numpy as np im…...
递归神经网络 (RNN) 及其变体 LSTM (长短期记忆) 和 GRU (门控循环单元)
递归神经网络(RNN, Recurrent Neural Networks)是一类用于处理序列数据的神经网络,特别适合于时间序列数据、语音、文本等连续数据的处理。RNN之所以独特,是因为它们在模型内部维持一个隐藏状态,该状态理论上可以捕获到…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...