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之所以独特,是因为它们在模型内部维持一个隐藏状态,该状态理论上可以捕获到…...
Vue3 + AntV X6 实战:手把手教你从零搭建一个可拖拽、自定义连线的流程图编辑器
Vue3 AntV X6 实战:构建企业级可定制流程图编辑器 在数字化转型浪潮中,可视化流程编辑工具已成为众多业务系统的核心组件。无论是复杂的工作流引擎、数据血缘分析平台,还是智能决策系统,都需要一个能够直观呈现和编辑节点关系的界…...
别再折腾CUDA版本了!用Anaconda Navigator一键搞定TensorFlow/PyTorch的GPU环境(附版本匹配表)
告别CUDA版本地狱:Anaconda Navigator极简搭建TensorFlow/PyTorch GPU环境实战指南 刚入坑深度学习的开发者,十有八九会在环境配置阶段崩溃——CUDA版本不兼容、cuDNN找不到对应版本、Python环境冲突...这些报错信息就像一堵高墙,把无数热情挡…...
如何高效使用ComfyUI-Inpaint-CropAndStitch:智能局部修复技术完全指南
如何高效使用ComfyUI-Inpaint-CropAndStitch:智能局部修复技术完全指南 【免费下载链接】ComfyUI-Inpaint-CropAndStitch ComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting 项目地址: https://gitcode.com/gh_mir…...
IDEA2024实战:两种主流方式搭建Maven Web项目(附避坑指南)
1. 两种主流方式搭建Maven Web项目概述 在IDEA2024中创建Maven Web项目,主要有两种主流方式:使用Archetype骨架和手动配置Web模块。这两种方式各有优缺点,适用于不同的开发场景。作为一个长期使用IDEA进行Java Web开发的程序员,我…...
FanControl免费风扇控制软件:3分钟快速上手终极指南
FanControl免费风扇控制软件:3分钟快速上手终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...
PyTorch实战:手把手教你为CT重建任务封装可微分的正反投影模块(附完整代码)
PyTorch实战:构建可微分CT正反投影模块的工程化实践 医疗影像重建领域正经历着深度学习的革命性变革。传统CT重建算法如滤波反投影(FBP)虽然计算高效,但在低剂量或有限角度扫描场景下表现欠佳。本文将带你从零实现一个可直接嵌入神…...
GD32F303硬件设计避坑指南:PWM引脚REMAP的那些教训
GD32F303硬件设计避坑指南:PWM引脚REMAP的那些教训 在嵌入式硬件设计中,GD32F303系列MCU因其出色的性价比和丰富的外设资源,成为许多工程师的首选。然而,在实际项目开发中,PWM引脚的配置和REMAP功能的使用往往成为硬件…...
Phi-4-mini-reasoning 3.8B 3分钟快速调用演示:一行代码启动推理服务
Phi-4-mini-reasoning 3.8B 3分钟快速调用演示:一行代码启动推理服务 1. 开箱即用的推理体验 如果你正在寻找一个既轻量又强大的语言模型,Phi-4-mini-reasoning 3.8B可能会让你眼前一亮。这个3.8B参数的模型在保持小巧体积的同时,展现出了令…...
MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战
1. MacOS下VScode安装PlatformIO Core卡死问题全解析 第一次在MacOS上用VScode装PlatformIO插件时,我就被卡在"Installing PlatformIO Core"这个界面整整半小时。进度条像蜗牛爬,最后直接报错退出。后来发现这是Mac用户常见问题,主…...
Xournal++ 终极指南:如何让手写笔记在高分辨率屏幕上清晰如纸 ✨
Xournal 终极指南:如何让手写笔记在高分辨率屏幕上清晰如纸 ✨ 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and …...
