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

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> } }字段说明&#xff1a; 字段是否必须描述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】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下条件判断语句if和循环语句while&#xff0c;for在python中需要注意的地方。 建议已有一定了解&#xff08;对语句的执行逻辑清楚&#xff09;的读者观看&#xff0c;如果对条件判断和循环的执行逻辑不太清楚&#xff0c;也可…...

Pytorch 复习总结 6

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

借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

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

云原生基础知识:容器技术的历史

容器化的定义&#xff1a; 容器化是一种轻量级的虚拟化技术&#xff0c;将应用程序及其所有依赖项&#xff08;包括运行时、系统工具、系统库等&#xff09;打包到一个称为容器的单独单元中。容器提供了一种隔离的执行环境&#xff0c;使得应用程序可以在不同的环境中运行&…...

golang实现正向代理和反向代理

文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…...

grpc四种数据流

grpc四种数据流 简介 1.简单模式 这种模式最为传统,即客户端发起一次请求,服务端响应一个数据,这和大家平时熟悉的rpc没什么区别,所以不在详细介绍 2.服务端数据流模式 这种模式是客户端发起一次请求&#xff0c;服务端返回一段连续的数据流。典型的例子是客户端向服务端发…...

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时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本52. Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本…...

【目标检测】旋转目标检测DOTA格式转YOLO格式标注

准备DOTA格式数据集&#xff1a; dota_dataset -- images |----- train |----- val -- labels |----- train |----- train_original |----- val |----- val_original 修改class_mapping和图片格式&#xff1a; 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. 总结欢迎来稿 论文地址&#xff1a;https://www.s…...

NeRF模型NeRF模型

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

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理&#xff0c;只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果&#xff1a; 新的代码&#xff1a; import numpy as np im…...

递归神经网络 (RNN) 及其变体 LSTM (长短期记忆) 和 GRU (门控循环单元)

递归神经网络&#xff08;RNN, Recurrent Neural Networks&#xff09;是一类用于处理序列数据的神经网络&#xff0c;特别适合于时间序列数据、语音、文本等连续数据的处理。RNN之所以独特&#xff0c;是因为它们在模型内部维持一个隐藏状态&#xff0c;该状态理论上可以捕获到…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...