opencv-基本操作

news/2024/5/8 17:18:14

本篇文章,我们将聊一聊利用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.mrgr.cn/p/50100181

相关文章

考研数学|张宇《1000题》正常用多久刷完?

考研数学1000题的刷题时间因人而异,主要取决于以下几个因素。 首先是个人基础,如果你的数学基础较好,对考研数学的知识点已经比较熟悉,刷题速度可能会更快。 其次是每天投入时间:你每天能够投入多少时间来刷题也会影…

Hadoop伪分布式平台搭建

搭建Hadoop伪分布式环境是在单台机器上模拟完整的Hadoop分布式系统,使得所有的Hadoop守护进程(如NameNode、DataNode、ResourceManager、NodeManager等)都在同一台机器上运行。这样可以在一台机器上体验Hadoop的分布式特性,适合学…

python使用opencv对图像的基本操作(2)

13.对多个像素点进行操作,使用数组切片方式访问 img[i,:] img[j,:] #将第j行的数值赋值给第i行 img[-2,:]或img[-2] #倒数第二行 img[:,-1] #最后一列 img[50:100,50:100] #50-100行,50-100列(不包括第100行和第100列) img[:100…

防盗链在nginx中如何配置,简单演示403forbidden的效果

一、使用场景: 资源被其他网站无端盗用 服务器压力无端增加 二、实现方法 1.valid_referers指令可以检测被访问资源从哪个地址来 2.通过referer头字段判断 3.若为空,报403错误 nginx的准备工作: 可以看 虚拟机中使用LNMP模拟跨域并结合…

北京车展“第一枪”:长安汽车发布全球首款量产可变新汽车

4月25日,万众瞩目的2024北京国际汽车展览会在中国国际展览中心如期而至。作为中国乃至全球汽车行业的盛宴,本次车展也吸引了无数业内人士的高度关注。 此次北京车展以“新时代 新汽车”为主题,汇聚了1500余家主流车企及零部件制造商&#xff…

数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题 1、除了向上调整建堆,我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走,可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍,全部在jdk8环境下运行的; jps ☆☆☆☆☆ 查看当前运行的进程号; jmap ☆☆☆ jmap命令可以查看jvm的内存信息,class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

微信小程序关于主包大小不能超过1.5MB的问题

常规的解决办法有以下几种 1、把资源文件改成远程服务器的,比如png这些 2、进入如图的分析页面,能明确知道你哪个插件包太大,我这里之前echart的包就1mb,现在给他缩减到了500kb的样子 3、解决vant等npm包太大的问题&#xff0c…

Linux——NFS网络文件系统

在生产环境中共享宿主目录可以用于集中管理账户 一、存储设备 DAS 是直连存储相当于移动硬盘 NAS 是网络文件系统,挂载后可以直接访问 SAN 存储区域网络 IPSAN 网线连接 共享的是设备,需要挂载后分区使用 FCSAN 光纤连接 二、服务的管理 1、安…

【C++杂货铺】多态

目录 🌈前言🌈 📁多态的概念 📁 多态的定义及实现 📂 多态的构成条件 📂 虚函数 📂 虚函数重写 📂 C11 override 和 final 📂 重载,覆盖(重写…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置

知识点 常用用途: 软件仓库镜像及提供下载服务: 配置步骤 删除网站主目录中的文件(本实验机目录为/home/source ip为192.168.12.137 端口为81) cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

redis常用数据结构

redis常用数据结构 Redis 底层在实现下面数据结构的时候,会进行特定的优化,来达到节省时间/空间的效果。 内部结构 String raw(最基本的字符串),int(实现计数功能,当value为整数的时候会用整…

python基础——正则表达式

📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…

TreeSet 和 TreeMap 和 HashSet 和 HashMap

一、二叉搜索树 1、概念 (1)二叉搜索树 要么是一棵空树,要么就得满足左子树上所有结点的值都小于根结点的值,右子树上所有结点的值都大于根结点的值,即左边比我小,右边比我大。二叉树的左右子树也分别都是…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

玩转nginx的配置文件3

1. limit_req_zone配置限流 limit_req_zone $binary_remote_addr zonemylimit:10m rate10r/s;upstream myweb {server 10.0.105.196:80 weight1 max_fails1 fail_timeout1;}server {listen 80;server_name localhost;location /login {limit_req zonemylimit;proxy_pass http:…

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容:创建应用成功 创建接口成功 配置Swagger实现接口注释和版本控制 本文章主要内容为: 配置Swagger支持token传值测试接口快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebApplication\xiaojinWebApplication\Program.cs// S…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

万业企业发布23年年报、24年一季报,集成电路业务同比大增近七成 转型成效显著

4月26日晚间&#xff0c;万业企业&#xff08;600641&#xff09;发布2023年年度报告及2024年一季度报告。2023年&#xff0c;公司实现营业收入9.65亿元&#xff0c;归母净利润1.51亿元。其中&#xff0c;公司集成电路设备制造业务收入较上年同期大幅增长67.53%&#xff0c;公司…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…