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

news/2024/7/21 4:18:30 标签: opencv, 图像处理, 计算机视觉

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.niftyadmin.cn/n/119682.html

相关文章

【LeetCode每日一题:982. 按位与为零的三元组+从递归超时到记忆化搜索】

题目描述 给你一个整数数组 nums &#xff0c;返回其中 按位与三元组 的数目。 按位与三元组 是由下标 (i, j, k) 组成的三元组&#xff0c;并满足下述全部条件&#xff1a; 0 < i < nums.length 0 < j < nums.length 0 < k < nums.length nums[i] & …

Java软件开发好学吗?学完好找工作吗?

互联网高速发展的当下&#xff0c;Java语言无处不在&#xff1a;手机APP、Java游戏、电脑应用&#xff0c;都有它的身影。作为最热门的开发语言之一&#xff0c;Java在编程圈的地位不可撼动。可是&#xff0c;听名字就很专业的样子。Java语言到底好学吗&#xff1f;刚入坑编程圈…

计算机网络的一些思考(待完善)

文章目录概念1. 缓存2. 备份&#xff08;副本&#xff09;3. 硬件和软件&#xff1a;4.端口5. 二进制协议vs文本协议6. 虚拟7.分布式8.广播域和冲突域的区别9本地地址协议1.CSMA/CD协议2.IP协议3.路由算法协议&#xff08;RIP&#xff0c;OSPF&#xff0c;BGP&#xff09;4.ARP…

【测绘程序设计】——空间直角坐标转换

测绘工程中经常遇到空间直角坐标转换——比如,北京54(或西安80)空间直角坐标转换成CGCS2000(或WGS-84)空间直角坐标,常用转换模型包括:①布尔沙模型(国家级及省级范围);②莫洛坚斯基模型(省级以下范围);③三维四参数(小于22局部区域) 等。   本文分享了基于布…

【100个 Unity实用技能】 | 脚本无需挂载到游戏对象上也可执行的方法

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

1488. 最短距离

Powered by:NEFU AB-IN Link 文章目录1488. 最短距离题意思路代码1488. 最短距离 题意 有 N个村庄&#xff0c;编号 1到 N 村庄之间有 M条无向道路&#xff0c;第 i条道路连接村庄 ai和村庄 bi&#xff0c;长度是 ci 所有村庄都是连通的 共有 K个村庄有商店&#xff0c;第 j个…

【数据结构初阶】详解“树”

目录 前言 1.树概念及结构 &#xff08;1&#xff09;树的概念 &#xff08;2&#xff09;树的名词介绍 &#xff08;3&#xff09;树的表示 ​编辑 2.二叉树概念及结构 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特殊的二叉树 &#xff08;3&#xff0…

刷题记录:牛客NC13611树

传送门:牛客 题目描述: shy有一颗树&#xff0c;树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的&#xff0c;当且仅当对于所 有相同颜色的点对(x,y)&#xff0c;x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。 输入: 4 3 1 2 2 3 2 4 输出: 39…