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()

运行结果如下所示:

可以看到,当采用不同的插值选项的时候,有时并不明显,而有时会有细微差别。

同时图像也可以进行水平或者垂直方向的缩放,例如:

import cv2
import matplotlib.pyplot as plt
import numpy as np
image=cv2.imread(r'D:\Photo\1.jpeg')
res=cv2.resize(image,(0,0),fx=3,fy=1)
plt.imshow(res)

运行结果如下所示:

图像的平移

图像的平移就是向任意一个方向移动一定的像素,由于图像本质上是一个矩阵,对图像的移动其实就是对矩阵的移动,在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()

运行结果如下所示:

 可以看到上面四张图分别是原图、水平翻转、垂直翻转、水平垂直翻转,水平垂直翻转。

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

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

相关文章

mysql数据库(下)

目录 约束 约束的概念和分类 1、约束的概念: 2、约束的分类 1、主键约束 2、默认约束 3、非空约束 4、唯一约束 5、外键约束 约束 约束的概念和分类 1、约束的概念: 约束时作用于表中列上的规则,用于限制加入表的数据约束的存在保证…

苍穹外卖学习-----2024/03/010---redis,店铺营业状态设置

1.Redis入门 2.在Java中操作Redis 3.店铺营业状态设置 BUG!!! 今天在启动项目时,用到了Redis缓存数据库,但是却出现了报错信息: ERR Client sent AUTH, but no password is set。Caused by: io.lettuce.core.RedisCommandExecutionException…

Java后端八股文之java基础

文章目录 0.Java 中有 8 种基本数据类型1. 为什么浮点数运算会丢失精度?如何解决?2. 面向对象的三大特征2.1 封装2.2 继承2.3 多态 3. 深拷贝和浅拷贝的区别?什么是引用拷贝?4. equals方法与“”方法4.1 4.2 equals方法 5.hashcod…

第十一篇 - 应用于市场营销视频场景中的人工智能和机器学习技术 – Video --- 我为什么要翻译介绍美国人工智能科技巨头IAB公司(1)

IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先后为700多家媒体…

【Linux】基于Kubernetes部署最新版AWX

目录 前言一、安装1.安装K3S2.提前导入redis、PG镜像3.安装AWX4.启动web页面5.卸载干净 二、使用1.登陆密码2.中英文切换3.查看当前版本 三、总结 前言 我们都听过Ansible,它本质上是一个进行了封装的Shell,优点在于它是去中心化的工具,可以…

安泰高压放大器应用领域包括哪些方面

高压放大器是一种关键的电子器件,广泛应用于多个领域,以放大高电压信号,满足不同应用的需求。这些放大器能够处理高电压信号,同时保持信号质量和可靠性。下面安泰电子将为大家介绍高压放大器的各种应用领域,以便更好地…

Django 简介

Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 Django 是一个高级的 Python Web 框架,用于快速开发可维护和可扩展的 Web 应用程序。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

数字人基础 | 3D手部参数化模型2017-2023

楔子: 2017年年底的泰国曼谷, SIGGRAPH Asia会议上, 来自马普所的 Javier Romero, Dimitrios Tzionas(两人都是 Michael J. Black的学生)发布了事实性的手部参数化模型标准: MANO [1]。 MANO的诞生意味着 Michael J. Black团队在继人体参数化模型 SMPL后, 事实性的将能够表达人…

访问学者申请记|美国首所翻译博士点

N老师出国访学的目的一方面是开拓眼界&#xff0c;另一方面也是为完成翻译方向的博士论文创造更好的条件。最终我们获得美国纽约州立大学宾汉姆顿分校的邀请函&#xff0c;该校的“翻译研究和教学项目”&#xff08;TRIP&#xff09;是美国高校设立的第一个翻译博士学位项目&am…

JavaScript进阶3之参数按值传递、call,apply,bind和new的实现、继承的多种方式

JavaScript基础 参数按值传递按值传递共享传递 call、apply、bind和new的实现this软绑定硬绑定 call的实现第一步第二步第三步 apply的实现bind的实现返回函数的模拟实现传参的模拟实现构造函数效果的模拟实现构造函数效果的优化实现 new的实现初步实现 继承的多种方式&优缺…

(学习日记)2024.03.09:UCOSIII第十一节:就绪列表

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是&#xff0c;如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同&#xff0c;因特网的运输层为应用层提供了两种不同的运输协议&#xff0c;即面向连接的TCP和无连接的UDP 5.2…

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文&#xff0c;你可以知道&#xff1a; 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C&#xff0c;也有人用Python。 但是从经验看&#xff0c;用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

Maya为模型添加细分数

文章目录 方法1 通道盒操作注意 方法2 添加分段操作注意 方法3 平滑操作 方法1 通道盒 操作 选中物体&#xff0c;选择通道盒/输入/点一下模型的名字/细分数&#xff0c;分别为长宽高添加细分 这相当于修改模型的底层数据&#xff0c;不会平滑模型&#xff0c;只会进行细分 …

瑞熙贝通实验室物联网管理平台新升级|支持远程开门视频监控与电源控制以及环境监测

瑞熙贝通实验室智能物联网管控平台&#xff1a;利用“互联网与物联网技术”有机融合&#xff0c;对实验室的用电安全监测、实验室环境异常监测&#xff08;颗粒物监测、明火监测、可燃气体、烟雾监测、温湿度传感器、红外人体感应&#xff09;、实验室人员安全准入、万物互联等…

爬虫案例1

通过get请求直接获取电影信息 目标页面: https://spa6.scrape.center/在network中可以看到是通过Ajax发送的请求&#xff0c;这个请求在postman中也可以直接请求成功&#xff0c;这只是一个用来练习爬虫的&#xff0c;没有达到js逆向的过程&#xff0c;需要通过分析js 代码来获…

Excel判断CD两列在EF两列的列表中是否存在

需求 需要将CD两列的ID和NAME组合起来&#xff0c;查询EF两列的ID和NAME组合起来的列表中是否存在&#xff1f; 比如&#xff0c;判断第二行的“123456ABC”在EF的第二行到第四行中是否存在&#xff0c;若存在则显示Y&#xff0c;不存在则显示N 实现的计算公式 IF(ISNUMBER…

淘宝基于Nginx二次开发的Tengine服务器

最近在群里看到这样一张阿里云网关报错的截图&#xff0c;我保存下来看了下 看到下面有 Tengine提供技术支持&#xff0c;这个Tengine是什么东西呢&#xff1f;我搜索了下似乎是淘宝在nginx的基础上自己改的Web服务器 Tengine还支持OpenResty框架&#xff0c;该框架是基于Ngin…

SAR ADC学习笔记(5)

高精度比较器 一、基于开环运放的比较器 OP开环应用时不需要考虑频率特性(相位裕度那些) &#xff0c;不存在稳定性问题。 单级运放的时域响应 多级运放 二、Latch比较器 Latch比较器的速度 Latch比较器的噪声优化 三、高速高精度比较器 消除失调电压OFFSET OOS IOS