opencv-基本操作

本篇文章,我们将聊一聊利用opencv进行的一些基本操作,以便后续我们利用opencv进行更加复杂的处理。

1、图像的读取、显示与保存

opencv中利用cv2.imread读取RGB图像,利用cv2.imshow() 进行图像的显示。

# 注意: cv2.imread读取RGB图像时, 返回的图像格式的通道为(b, g, r)

# 默认为cv2.IMREAD_COLOR
img = cv2.imread("disney.jpg"

# 彩图
img1 = cv2.imread('disney.jpg', cv2.IMREAD_COLOR)  

# 读取灰度图
img2 = cv2.imread('disney.jpg', cv2.IMREAD_GRAYSCALE)  

# 第一个参数为显示窗口名称,第二个参数为需要显示的图像
cv2.imshow('image', img) 

# 等待时间,毫秒级,0表示任意键终止,没有的话显示的图像会一闪而逝
cv2.waitKey(0

#销毁我们创建的所有窗口。如果要销毁任何特定窗口,请使用函数cv2.destroyWindow(),其中传递确切的窗口名称作为参数
cv2.destroyAllWindows() 

最终显示的图像如下所示:

若我们需要保存图像,可以使用下面的函数:

# 第一个参数为图像保存的路径,第二个参数为需要保存的图像
cv2.imshow(save_path, img) 

2、通道的拆分与合并

有些时候当我们需要对图像的通道进行单独的操作,这个时候就需要进行通道拆分,此时我们用到cv2.split() 函数。

b,g,r=cv2.split(img) # 拆分通道,顺序为b,g,r

# 此时若显示则为灰度图
array([[162216, ..., 112515],
       [192618, ..., 192219],
       [ 51518, ..., 162019],
       ...,
       [243032, ...,  2,  610],
       [272728, ..., 1010,  7],
       [262932, ...,  9,  4,  2]], dtype=uint8)

当我们需要把独立的通道合并成一张图像的时候,可以用cv2.merge() 函数。

img1 = cv2.merge((r,g,b)) #合并通道,这里我们按照PIL的读取方式将通道顺序变成r,g,b

若我们只想保留红波段的值,不必先拆分再赋值。你可以直接使用 Numpy 索引。

# 只保留 R通道
img_Rband = img1.copy()
img_Rband[:,:,1] = 0
img_Rband[:,:,2] = 0

这里我们看下img_Rband与原图像的区别:

plt.figure(figsize=(10,5)) 
plt.subplot(121), plt.title('image')
plt.imshow(img1), plt.axis('off')
plt.subplot(122), plt.title('image_r')
plt.imshow(img_Rband), plt.axis('off')
plt.savefig("disney01.jpg")
plt.show()

3、调整图像大小与裁剪图像

当我们需要改变图像大小时,可以使用cv2.resize() 函数。

# 第一个参数为需要resize的图像,第二个参数为改变后的图像大小(width,height)
img_resize = cv2.resize(img1,(800,600)) 

img.shape, img_resize.shape
# ((3023,4086,3),(600,800,3))

# 也可以不指定输出大小,而是利用fx,fy来使图像沿x轴或y轴缩放
img_resize1 = cv2.resize(img1,(0,0),fx = 3,fy=1
plt.imshow(img_resize1), plt.axis('off')

有时我们需要对一幅图像的特定区域进行操作。此时也是可以使用 Numpy 索引来获得的。

img_crop = img_resize[200:400,200:400]
plt.imshow(img_crop), plt.axis('off')

4、图像边界填充

如果需要在图像周围创建一个边框,此时可以使用cv2.copyMakeBorder() 函数。

img = cv2.imread(r"E:\01_Qython\source\image_processing\tangyue.jpg")
img = cv2.resize(img,(800,600))
#这里为了展示方便,先对通道进行拆分重组成rgb顺序
b,g,r = cv2.split(img)
img = cv2.merge((r,g,b))
top_size,bottom_size,left_size,right_size =(200,200,200,200)

# 复制法,复制最边缘的像素
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size,right_size, borderType=cv2.BORDER_REPLICATE) 

# 反射法,对感兴趣的图像中的像素在两边进行复制,例如 dcba|abcdefgh|hgfe
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size,right_size, borderType=cv2.BORDER_REFLECT) 

# 反射法,以最边缘像素为轴,对称,edcb|abcdefgh|gfed
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size,right_size, borderType=cv2.BORDER_REFLECT_101)

# 外包装法,efgh|abcdefgh|abcd
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size,right_size, borderType=cv2.BORDER_WRAP)

# 常量法,常数值填充,这里我们指定为0,显示为黑色
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size,right_size, borderType=cv2.BORDER_CONSTANT,value = 0)


plt.figure(figsize=(10,5))
plt.subplot(231),plt.imshow(img),plt.title("ORIGINAL"), plt.axis('off')
plt.subplot(232),plt.imshow(replicate),plt.title("REPLICATE"), plt.axis('off')
plt.subplot(233),plt.imshow(reflect),plt.title("REFLECT"), plt.axis('off')
plt.subplot(234),plt.imshow(reflect101),plt.title("REFLECT_101"), plt.axis('off')
plt.subplot(235),plt.imshow(wrap),plt.title("WRAP"), plt.axis('off')
plt.subplot(236),plt.imshow(constant),plt.title("CONSTANT"), plt.axis('off')
plt.show()

总结

本篇文章,我们利用opencv进行的一些图像基本操作,学会了读取、保存图像,通道的拆分与合并,图像的大小改变与裁剪以及怎么实现图像的边缘填充。下一篇文章我们将利用opencv进行一些更为深入的学习。

本文由 mdnice 多平台发布

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

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

相关文章

在 Windows 系统上安装 TeamViewer 13

在 Windows 系统上安装 TeamViewer 13 References 默认安装到所有用户 同意协议 安装目录 勾选内容 打开文件位置 打开 rClientID.exe Extras -> Options -> Advanced Show advanced options -> Display language 重新启动TeamViewer 语言可修改为中文简体 …

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件,每个都是系统功能必不可少的一部分。具体来说,MongoDB 用于持久化存储;Redis 用作缓存;Kafka 用于消息队列;Zookeeper 用于服务发现;Minio 用于对象存储。这些组件的众多可能会…

C++14之std::exchange的使用和原理分析

目录 1.概述 2.使用 2.1.交换操作 2.2.移动语义 3.原理 4.综合示例 5.总结 1.概述 std::exchange 是 C 标准库中的一个实用函数,它的主要作用是替换一个对象的值,并返回该对象的旧值。这个函数在 C14 中引入,主要用于简化和优化代码。…

OpenCV如何在图像中寻找轮廓

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何模板匹配 下一篇 :OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::findContour…

第二弹:走进CSS世界,学习记录

目录 1.1. 了解CSS 1.2. 放置CSS的几种方式 1.3. CSS选择器 1.3.1. 基本选择器 1.3.2. 层级选择器 1.3.3. 属性选择器 1.3.4. 结构性伪类选择器 1.3.5. 状态伪类选择器 1.3.6. 选择器优先级 1.3.7. 文本属性 1.3.8. 背景属性 1.3.9. 尺寸属性 1.3.10. 列表属性 1…

K8s(二十三):Pod的生命周期详解

🔴 K8s(二十三):Pod的生命周期详解 1、Pod的生命周期1.1、Pod的创建1.2、Pod的调度1.3、Pod的初始化1.4、Pod的运行及钩子函数1.4.1 k8s中的3种钩子函数1.4.2 k8s中的3种探测类型1.5、Pod的终止1.6、Pod的重启2、Pod的生命周期的五种状态(相位)💖The Begin💖点点关注…

55.基于SpringBoot + Vue实现的前后端分离-旅游管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的旅游管理系统设计与实现管理工作系统…

ChatGPT: 人工智能对话的革命

介绍: 在人工智能领域,ChatGPT被视为创新的典范,重新定义了我们与技术交互的方式。从回答查询到生成创意内容,ChatGPT利用语言的力量促进了无缝沟通。在这篇全面指南中,我们深入探讨ChatGPT的复杂性,探索其功能、应用…

Java调用GDAL实现postgresql数据生成shp和dxf

需求 由于shp数据存储到postgresql数据库中,前端调用数据库实现数据的渲染,最近有一个新的需求,前端圈选数据,实现数据的下载,数据可以是shp、dxf、excel格式,这里主要记录在后端通过调用gdal来实现这个需…

使用STM32CubeMX对STM32F4进行串口配置

目录 1. 配置1.1 Pin脚1.2 RCC开启外部晶振1.3 时钟1.4 串口配置 2. 代码2.1 默认生成代码2.1 开启串口中断函数2.3 接收中断2.4 接收回调函数2.5 增加Printf 的使用 1. 配置 1.1 Pin脚 1.2 RCC开启外部晶振 1.3 时钟 外部使用8MHz晶振 开启内部16MHz晶振 使用锁相环 开启最高…

ROS2 学习笔记(二)常用小工具

1. rqt_console #启动 ros2 run rqt_console rqt_console日志级别&#xff1a;Fatal --> Error --> Warn --> Info --> Debug #修改允许发布的日志级别 ros2 run <package_name> <executable_name> --ros-args --log-level WARN2. launch文件 ROS2中…

Outlook大附件插件 有效解决附件大小限制问题

很多企业都是使用Outlook来进行邮件的收发&#xff0c;可是由于附件大小有限&#xff0c;导致很多大文件发不出去&#xff0c;就会产生Outlook大附件插件这种业务需求。 邮件系统在发送大文件时面临的限制问题主要如下&#xff1a; 1、附件大小限制&#xff1a;大多数邮件服务…

【MySQL】如何在MySQL中编写循环

是谁的心啊 孤单地留下 他还好吗 我多想爱他 那永恒的泪 凝固那一句话 也许可能蒸发 是谁的爱啊 比泪水坚强 轻声呼唤 就让我融化 每一滴雨水 演化成我翅膀 向着我爱的人 追吧 &#x1f3b5; 飞儿乐团《月牙湾》 MySQL中的循环通常在存储过程中使用&#…

基于Pytorch深度学习——Softmax回归

本文章来源于对李沐动手深度学习代码以及原理的理解&#xff0c;并且由于李沐老师的代码能力很强&#xff0c;以及视频中讲解代码的部分较少&#xff0c;所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉&#xff0c;所以我们会采用逐行解释小…

深度学习基础之《TensorFlow框架(16)—神经网络案例》

一、mnist手写数字识别 1、数据集介绍 mnist数据集是一个经典的数据集&#xff0c;其中包括70000个样本&#xff0c;包括60000个训练样本和10000个测试样本 2、下载地址&#xff1a;http://yann.lecun.com/exdb/mnist/ 3、文件说明 train-images-idx3-ubyte.gz: training s…

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

【Redis 开发】Lua语言

Lua Lua语法 Lua语法 Lua是一种小巧的脚本语言&#xff0c;底层用C语言实现&#xff0c;为了嵌入式应用程序中 官网&#xff1a;https://www.lua.org/ 创建lua文件 touch hello.lua 运行lua文件 lua hello.lua 输出语句 print("Hello World!")数据类型 可以通过t…

一篇易懂的SPI通讯指南

SPI概念 SPI&#xff08;Serial Peripheral interface, 串行外设接口&#xff09;是微处理控制单元(MCU)和外围IC&#xff08;如传感器、ADC、DAC、驱动芯片和外部存储设备等&#xff09;之间进行通信的同步串行端口&#xff0c;其通信速率一般可以从几千bps到几百Mbps甚至更高…

QT httpServer多线程后台服务器的例子实现

1.需求 1.1 用户需要其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;获取想要的数据并实时显示在网页里&#xff0c;比如实时的温湿度&#xff0c;用户数据等 1.2 用户需要在其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;下发数据…

kettle从入门到精通 第五十五课 ETL之kettle Excel输入

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群&#xff0c;一起学习&#xff0c;共同进步。 1、 Excel输入&#xff0c;Microsoft Excel输入步骤的作用是从Microsoft Excel中读取数据&#xff0c;如下图所示&#xff1a; 1&#xff09;Excel输入步骤从文件D:\data\测试数…