OpenCV入门(三)快速学会OpenCV2图像处理基础

news2024/11/19 13:32:40

OpenCV入门(三)快速学会OpenCV2图像处理基础

1.颜色变换cvtColor

imgproc的模块名称是由image(图像)和process(处理)两个单词的缩写组合而成的,是重要的图像处理模块,主要包括图像滤波、几何变换、直方图、特征检测与目标检测等。

这个模块包含一系列的常用图像处理算法,相对而言,imgproc是OpenCV一个比较复杂的模块。OpenCV中的一些画图函数也属于这个模块。

颜色变换是imgproc模块中一个常用的功能。
我们生活中大多数看到的彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV、HSI等颜色制式,OpenCV提供了cvtColor()函数来实现这些功能。
这个函数用来进行颜色空间的转换,随着OpenCV版本的升级,对于颜色空间种类的支持越来越多,涉及不同颜色空间之间的转换,比如RGB和灰度的互转、RGB和HSV(六角锥体模型,这个模型中颜色的参数分别是色调H、饱和度S、明度V)的互转等。
cvtColor函数声明如下:

     cvtColor(src, code[, dst[, dstCn]])

其中,
参数src表示输入图像,即要进行颜色空间变换的原图像,可以是数组矩阵;
code表示颜色空间转换代码,即在此确定将什么制式的图片转换成什么制式的图片;dst表示输出与src相同大小和深度的图像,即进行颜色空间变换后存储图像;
dstCn表示目标图像通道数,默认取值为0,如果参数为0,则从src和代码自动获得通道的数量。
函数cvtColor的作用是将一个图像从一个颜色空间转换到另一个颜色空间,但是从RGB向其他类型转换时必须明确指出图像的颜色通道。
值得注意的是,在OpenCV中,其默认的颜色制式排列是BGR而非RGB。对于24位颜色图像来说,前8位是蓝色,中间8位是绿色,最后8位是红色。
需要注意的是,cvtColor函数不能直接将RGB图像转换为二值图像,需要借助threshold函数。
另外,如果对8-bit图像使用cvtColor()函数进行转换将会丢失一些信息。我们常用的颜色空间转换有两种:将BGR转换为Gray或HSV。

下面看一个例子,将图片转换为灰度图和HSV。

     import cv2
     #将图片转换为灰度图
     src_image = cv2.imread("test.jpg")
     gray_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2GRAY)
     #将图片转换为HSV
     hsv_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2HSV)
     cv2.imshow("src_image", src_image)
     cv2.imshow("gray_image", gray_image)
     cv2.imshow("hsv_image", hsv_image)
     cv2.waitKey(0)

首先读取工程目录下的图片test.jpg,然后调用cvtColor函数将原图转为灰度图,再调用cvtColor函数将原图转为HSV图,最后将3幅图片显示出来。

运行实例,结果如图所示。

在这里插入图片描述

2.截取图像

2.1切片和索引

现在我们把磁盘上的一幅图片文件读到内存中,比如:

     img = cv.imread("p1.jpg"); #读取一幅图片

实际上是一个NumPy包的array数组,它包含着每个像素点的数据。因此熟悉NumPy是操作图像数据的基础。NumPy是Python中用于数据分析、机器学习、科学计算的重要软件包。它极大地简化了向量和矩阵的操作及处理。Python中的不少数据处理软件包依赖于NumPy作为其基础架构的核心部分(例如scikit-learn、SciPy、Pandas和TensorFlow)

NumPy包提供了两种基本对象:ndarray(N维数组)和func(通用函数)。ndarray数组用来存放相同数据类型的多维数组,func是可以对数组进行运算处理的函数。

ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样。ndarray数组可以基于0~n的下标进行索引,切片对象可以通过内置的slice函数,并设置start、stop及step参数进行,从原数组中切割出一个新数组。比如:

     a = np.arange(10)
     s = slice(2,7,2)   #从索引2开始到索引7停止,间隔为2
     print (a[s])

输出结果为:[2 4 6]。

在以上实例中,首先通过arange()函数创建ndarray对象。然后分别设置起始、终止和步长的参数为2、7、2。我们也可以通过冒号分隔切片参数start:stop:step来进行切片操作:

     a = np.arange(10)
     b = a[2:7:2]   #从索引2开始到索引7停止,间隔为2
     print(b)

输出结果为:[2 4 6]。

其中,有关冒号的解释是:如果只放置一个参数,如[2],就将返回与该索引相对应的单个元素;如果为[2:],就表示从该索引开始以后的所有项都将被提取;如果使用了两个参数,如[2:7],那么提取两个索引(不包括停止索引)之间的项。

比如:

     a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
     b = a[5]
     print(b)

输出结果为5。

比如:

     a = np.arange(10)
     print(a[2:])

输出结果为:[2 3 4 5 6 7 8 9]。

再比如:

     a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
     print(a[2:5])

输出结果为:[2 3 4]。

多维数组同样适用上述索引提取方法:

     a = np.array([[1,2,3],[3,4,5],[4,5,6]])
     print(a)
     #从某个索引处开始切割
     print('从数组索引 a[1:] 处开始切割')
     print(a[1:])

输出结果为:

     [[1 2 3]
      [3 4 5]
      [4 5 6]]
     从数组索引 a[1:] 处开始切割
     [[3 4 5]
      [4 5 6]]

由于图像是数组形式所以我们可以用切片进行截取图像,代码如下:

import cv2

#将图片转换成灰度图
src_image = cv2.imread("test.jpg")
print(src_image)
img=src_image[20:100,20:250]
cv2.imshow("cut",img)
cv2.waitKey(0)
cv2.destoryAllWindos()

输出结果:

在这里插入图片描述

3.获取颜色通道

cv2.split可以帮助我们获取不同颜色通道。

声明如下:

cv2.split(img)

实例代码:

# 获取颜色通道
img = cv2.imread("picture.jpg")  # 读取图片
b, g, r = cv2.split(img)  # 分割颜色通道
print(r.shape, g.shape, b.shape)  # 调试输出

输出结果:

(1263, 1920) (1263, 1920) (1263, 1920)

4.单通道显示

实例代码:

import cv2
src_image = cv2.imread("test.jpg")
cur_img=src_image.copy()#深拷贝
cur_img[:, :, 0] = 0  # B通道设置为0
cur_img[:, :, 1] = 0  # G通道设置为0
cv2.imshow("B channel", cur_img)  # 图片展示
cv2.waitKey(0)
cv2.destoryAllWindos()

输出结果:

在这里插入图片描述

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

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

相关文章

VSCode问题记录

20230304 - 0. 引言 这几年的编程方式还真是各种变化,从一开始直接VIM,到后面使用jupyter进行机器学习相关,然后再过渡到vim的形式并加以tmux批量化,最后去年使用了vscode作为IDE。随着工具的变化,那么很多习惯也都随…

PyQGIS自定义应用程序打包

路径准备ps:打包时需要根据自己的安装路径进行相应修改QGIS3.22.16的安装路径:D:\QGIS3.22.16QGIS3.22.16中python-qgis.bat的路径:D:\QGIS3.22.16\bin\python-qgis-ltr.bat准备打包的工程所在目录:E:\Crater_DamageEstimation0303安装pyinst…

Python基础—文件操作

Python基础—文件操作 文件操作 文件是指为了重复使用或长期使用的目的,以文本或二进制形式存放于外部存储器(硬盘、U盘、光盘等)中的数据保存形式,文件是信息交换的重要途径,也是利用程序解决实际问题的重要媒介。 …

网络编程面试相关内容

1.什么是网络编程网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数…

RPC框架笔记

文章目录RPC概述一次RPC的完整过程RPC的优缺点分层设计编解码层——数据格式协议层——概念网络通信层——网络库RPC框架的关键指标稳定性易用性扩展性观测性高性能Kitex框架解读整体框架自研网络库——Netpoll扩展性设计性能优化——网络库优化性能优化——编解码优化合并部署…

【Flutter入门到进阶】Flutter基础篇---组件生命周期与状态

1 Android界面渲染流程UI树与FlutterUI树的设计思路对比 1.1 android渲染流程中的树的组织 1.1.1 XML加载与解析 1.1.2 ViewRootImpl组织树结构 1.1.3 编舞者掌控调用时机 1.1.4 View负责UI渲染 1.1.5 底层surfacefiling负责沟通硬件 1.2 flutter组件设计思路&#xff0c…

Canal实时监控案例

Canal实时监控案例 文章目录Canal实时监控案例0. 写在前面1. TCP 模式测试1.1 IDEA创建项目canal-module1.2 通用监视类——CanalClient1.2.1 Canal 封装的数据结构1.2.2 在 canal-module 模块下创建 cn.canal 包,并在该包下创建 CanalClient.java文件2. Kafka 模式…

前后端身份验证

1、web 开发模式 【】基于服务端渲染的传统 Web 开发模式 【】基于前后端分离的新型 Web 开发模式:依赖于 Ajax 技术的广泛应用。后端只负责提供 API 接口,前端使用 Ajax 调用接口的开发模式 2、身份认证 【】服务端渲染推荐使用 Session 认证机制 【】…

《堆的应用》TOP-K问题

TOP-K问题:即求数据中前k个最大的元素或者最小的元素,一般情况下,这些数据量是非常大的。 比如:专业前10名、世界500强、世界富豪榜、游戏中前100名等这些排名都是TOP-K问题。 来源于《财富》世界500强排行榜。 对于TOP-k问题,能想到的最简…

【XXL-JOB】XXL-JOB定时处理视频转码

【XXL-JOB】XXL-JOB定时处理视频转码 文章目录【XXL-JOB】XXL-JOB定时处理视频转码1. 准备工作1.1 高级配置1.2 分片广播2. 需求分析2.1 作业分片方案2.2 保证任务不重复执行2.2.1 保证幂等性3. 视频处理业务流程3.1 添加待处理任务3.2 查询待处理任务3.3 更新任务状态3.4 工具…

考研还是工作?两战失败老道有话说

老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好!在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室,在实验室焊板子、画板子、培训、打比赛外加摸鱼;参加过…

Swagger扩展 - 同一个接口生成多份Swagger API文档

为同一个ApiOperation生成多份不同Swagger API文档。 0. 目录1. 背景2. 效果展示3. 实现3.1 关键逻辑 - 让接口自解释3.2 关键逻辑 - 如何生成相应的ApiDescription3.3 关键逻辑 - 如何为生成的ApiDescription 赋值3.4 关键逻辑 - 如何动态生成Docket4. 继续优化5. 参考1. 背景…

【Spark分布式内存计算框架——Structured Streaming】3. Structured Streaming —— 入门案例:WordCount

1.3 入门案例:WordCount 入门案例与SparkStreaming的入门案例基本一致:实时从TCP Socket读取数据(采用nc)实时进行词频统计WordCount,并将结果输出到控制台Console。 文档:http://spark.apache.org/docs/2…

一个Bug让人类科技倒退几十年?

大家好,我是良许。 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。 所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。 1. 全世界的恐慌 一个Bug会让人类…

Java中的自动类型提升与强制类型转换

一、自动类型提升 自动类型提升是指在程序运行时因为某种情况需要,JVM将较小的数据类型自动转换为较大的数据类型,以保证精度和正确性。在Java中,需要进行类型提升的情况有以下几种: 1. byte、short和char提升为int类型 当运算…

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库,除此之外,它还支持其它类型的数据源查询,具体的到源码中看一下: 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…

【Python】RPA批量生成word文件/重命名及批量删除

批量生成word文件 场景:需要新建多个类似文件名 比如:今天的事例是新建12个文件名为: ​ 保安员考试试卷1及答案.docx ​ 保安员考试试卷2及答案.docx ​ … ​ 保安员考试试卷12及答案.docx 痛点: ​ 手动操作重复性高&a…

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

文章目录L-norm Loss 系列L1 LossL2 LossSmooth L1 LossIOU系列IOU (2016)GIOU (2019)DIOU (2020)CIOU (2020)EIOU (2022)αIOU (2021)SIOU (2022…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务,想要调用,怎么找到对应的服务呢? 这里有组件的讲解 → SpringCloud组件…

深圳大学《计算机论题》作业:大数据与人工智能技术对人类生活的影响

说明 本作业为小组作业,要求基于一场报告完成(即观后感)。共分4个小题,讨论人工智能时代的伦理思考。由于版权原因,不提供报告的具体内容,只展示答题内容。 第一题 (1) 你如何看待…