OpenCV for Python 学习第三天 :图片处理之NumPy库与OpenCV相结合

上一篇博客我们了解了图像在OpenCV中的保存方式。并且我们自己上手创建了一张灰度图像和一张彩色图像。除此之外,我们还了解到了彩色图像通道在OpenCV中和我们日常所了解的不一样,是通过BGR的顺序进行编码的。咱们一定要记清楚哦~

那么今天,我们将继续沿着昨天的方向进行探索。我们将使用更多的NumPy中的函数,生成更多的好玩的照片~

文章目录

  • NumPy中数据处理的方法
    • array() 方法
    • item() 方法
    • itemset() 方法
  • 获取感兴趣的图像位置
  • 每日总结

NumPy中数据处理的方法

array() 方法

在上一篇博客中,我们使用的是zeros()方法来生成一个全是零的数组。但是这样对于我们来说并不够,我们希望获得更加多样化的创建形式,这个时候就不得不介绍一下我们NumPy中的经典用法numpy.array()

NumPy.array()是NumPy库中的一个函数,它用于创建一个多维数组对象。它的基本用法是从一个列表或元组创建一个数组。其语法如下:

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

其中:

  • object用于构造数组的输入数据。它可以是Python的列表、元组、数组、生成器等;
  • dtype:可选参数,指定数组的数据类型。默认情况下,它会自动推断数据类型;
  • copy:可选参数,指定是否复制输入数据。默认为True,即表示复制;
  • order:可选参数,指定数组在内存中的存储顺序。默认为“K”,即表示按照元素在内存中出现的顺序存储;
  • subok:可选参数,指定返回的数组是否允许子类。默认为False;
  • ndmin:可选参数,指定返回的数组的最小维度。默认为0,表示最小维度为1。

对于我们来说,我们现在只需要了解第一个和第二个参数,就足以解决我们现在会遇到的绝大多数问题。

item() 方法

在上一篇博客我们访问像素点的时,我们使用的是最基础的Python语法直接访问。但实际上,NumPy提供了一种更加高效快速的方法,即item() 方法

我们来看下面这个实例:

NumPy中的item()函数用于获取数组中的单个元素的值或数组标量。它的语法是这样的 numpy.ndarray.item(index)

其中,index表示要获取的元素的索引。如果数组对象不是标量,该方法将引发ValueError。

该函数返回数组对象中指定索引处的值(标量)。

下面是一个简单的使用示例:

import numpy as nparr = np.array([[1, 2], [3, 4], [5, 6]])# 获取第3行第2列的元素 
# 除此之外,我们还能使用 arr.item((3,2))来实现读取
element = arr.item(5) print(element) # 6

在上面的示例中,我们通过item()函数获取了numpy数组arr中的第3行第2列的元素。由于数组是按行存储的,因此该元素的索引为5。

需要注意的是,item()函数返回的标量值是一个副本,而不是原始数组中的元素。这意味着对返回值所做的任何更改都不会影响原始数组中相应的元素。

总的来说,item()函数的主要作用是将数组中的一个标量元素返回为Python的标量值,以便于进行后续的处理。

也就是说,当我们创建好了一个数组之后,我们只需要在item()中传入它的索引值,我们就可以愉快地访问了。


我们使用昨天的随机生成灰度图片的程序来进行一个演示。那么我们这次将用numpy.item()的方法获取某一个值哦~

import numpy
import cv2
import randomimg = numpy.zeros((300,300),dtype = numpy.uint8)for x in range(0,300):for y in range(0,300):num = random.randint(0,255)img[x,y] = numx,y = random.randint(0,300),random.randint(0,300)
print(x,y)point = img.item((x,y))
print(point)cv2.imshow("NumPy Create Image",img)
cv2.waitKey(0)

在这里插入图片描述

我们成功地获取了黑白照片中任意一个像素的值。


这个时候,爱思考的小伙伴们肯定就要想了,那么我们的彩色照片是否也能用这样的方法读取呢?我们再将彩色照片的代码复制过来瞧一瞧~

在这里插入图片描述
我们得好好想一想昨天我们所了解的内容了,我们还记得昨天我们使用BGR三通道索引的事情吗?由于昨天我们创建了索引值,所以今天我们依然要按照对应的索引值来读取图像。

B对应0,G对应1,R对应2一定不要忘记哦~

import numpy
import cv2
import randomimg = numpy.zeros((300,300,3),dtype = numpy.uint8)for x in range(0,300):for y in range(0,300):num_1 = random.randint(0,255)num_2 = random.randint(0,255)num_3 = random.randint(0,255)img[x,y] = [num_1,num_2,num_3]x,y,z = random.randint(0,300),random.randint(0,300),random.randint(0,2)
print(x,y,z)point = img.item((x,y,z))
print(point)cv2.imshow("NumPy Create Image",img)
cv2.waitKey(0)

在这里插入图片描述

itemset() 方法

了解了访问某一像素点的高效方法之后,我们再来了解一下修改像素点的方法。这个方法同样也是非常好玩的哦~

itemset() 是 NumPy 数组的一个方法,它允许您更改指定位置的元素值。它与 item() 一起使用,item()允许您获取指定位置的元素。

itemset() 方法接受三个参数:行、列和值。如果您在使用一维数组,则只需要提供一个参数,即索引。

下面是 itemset() 的使用示例:

import numpy as nparr = np.array([1, 2, 3, 4, 5])
# 使用 itemset 更改第三个元素的值 arr.itemset(2, 100)
print(arr) # 输出结果: [  1   2 100   4   5] 

在上面的示例中,我们创建了一个包含 5 个元素的一维 NumPy 数组 arr。我们使用 itemset()

方法将数组中第三个元素的值更改为 100,并使用 print() 方法查看更改后的数组。

如果您想在二维数组中使用 itemset() 方法,则需要指定行和列索引:

# 创建一个 3x3 的二维数组 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用 itemset 更改第三行第二列的元素值 arr.itemset((2, 1), 100)
print(arr) 
# 输出结果: 
# [[  1   2   3]
#  [  4   5   6]
#  [  7 100   9]]

在上面的示例中,我们使用 (2, 1) 表示要更改第三行第二列的元素值,并将值更改为 100。

为了演示的完美性,我们找出一张彩色图片,这样对比更加明显哦~

import cv2
import numpyimg = cv2.imread("GrayScale_LFS.jpg")
print(img)for x in range(10,200):for y in range(10,200):img.itemset((x,y,0),255)cv2.imshow("Change Image",img)
cv2.waitKey(0)

当我们将Blue通道调成255的时候,我们可以看到被我们选中的这块区域直接是开始有了蓝光的哈,非常明显,我们也可以调整其他通道看一下~

在这里插入图片描述

当我们调整绿色通道的时候,页面就会显示绿色哦~

在这里插入图片描述

获取感兴趣的图像位置

我们在使用PS进行图像处理的时候,可能都会对照片的某些部分进行精修,这样能让我们的照片变得更加漂亮。在OpenCV中,这样的区域叫做ROI。

ROI 是英文“Region of Interest”的缩写,中文翻译为“感兴趣区域”。在计算机视觉、图像处理、机器学习等领域,ROI通常指的是一张图片中用户关心、需要处理的区域。

通常情况下,一张图片中不是所有的区域都是我们需要关注和处理的,有些区域可能对我们的任务没有意义,有些区域则可能干扰了我们的处理。因此,我们会选择感兴趣区域,对这部分区域进行特殊的处理或者忽略掉其他区域。

例如在图像分类任务中,我们需要对一张图片进行分类,但是只有图片中的某个区域包含有效信息,其他区域的信息都是无效的。因此,我们需要利用 ROI 技术,将无效信息过滤掉,只保留感兴趣的区域,这样就可以更好地进行分类。

在计算机视觉领域,ROI还可以指代一种技术,即感兴趣区域检测。该技术的目的是从一张图片中自动检测出所有的感兴趣区域,并进行标记或者剪切,以便后续的处理。

那么我们应该如何找到我们感兴趣的区域呢?一个比较简单的办法是使用[x1:x2,y1:y2]的方式来框选我们所要选择的区域,这样我们就能够成功定位我们的ROI区域了~

import cv2
import numpyimg = cv2.imread("GrayScale_LFS.jpg")
interst = img[150:260,120:410]cv2.imshow("Image",img)
cv2.imshow("REGION OF INTERST",interst)
cv2.waitKey(0)

在这里插入图片描述

学会了这个操作后,我们以后打码也不用愁了~

每日总结

今天我们了解了查看和修改像素更快捷的方式,item()和itemset(),同时我们还了解了ROI兴趣位置,并懂得了如何获取这一段位置的方法。这一技术类似于PS中的复制,我们可以将我们获得的ROI值放到任意的图片上~

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

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

相关文章

基于单片机心率脉搏心率血压体温血氧检测系统的设计与实现

功能介绍 本次设计通过32系列单片机STM32进行数据处理,配置引脚和JFC103传感器以及温度传感器进行数据通信。采用防水DS18B20进行腋下温度采集,通过单总线方式进行数据传输。心率血氧血压模块通过串口通信方式把采集到的数据发送给单片机,所有…

【前端知识】JavaScript——var 与 let 的区别

【前端知识】JavaScript——var 与 let 的区别 var声明的变量会自动提升到函数作用域顶部,而let不会。 在解析代码时,JavaScript 引擎会注意出现在块后面的 let 声明,只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行…

MySQL-DQL-案例

案例 案例1 根据需求完成员工管理的条件分页查询 具体代码 -- 案例1:按需求完成员工管理的条件分页查询 - 根据输入条件,查询第一页数据,每页展示10条记录 -- 输入条件: -- 姓名:张 -- 性别:男 -- 入职时间…

NAT 地址转换路由器配置命令(华为路由器)

#AR1路由器配置 # acl 2000 rule permit source any # interface GigabitEthernet0/0/1 nat outbound 2000 ip address 1.1.1.1 24 # interface GigabitEthernet0/0/0 ip address 172.16.1.1 255.255.255.0 # ip route-static 0.0.0.0 0.0.0.0 1.1.1.2 ip route-static …

怎么进行流程图制作?分享几种绘制方法

怎么进行流程图制作?流程图是一种图形化表示流程的图表,通常用于描述业务、计划或工作流程。它可以帮助人们更好地理解复杂的流程,并且提供了一种清晰的方法来记录和共享流程信息。下面介绍一些绘制流程图的方法,可以帮助我们快速…

Authing 入选长城战略咨询《2023 中国潜在独角兽企业》报告

2023 年 6 月 20 日,长城战略咨询(GEI)发布《2023 中国潜在独角兽企业研究》报告。Authing 作为国内首家身份云(IDaaS)厂商入选中国潜在独角兽企业榜单。独角兽企业指具有发展速度快、数量稀少、备受投资者青睐等属性的…

react 初学(1)

1.安装环境 需要Node.js 自行下载安装 然后全局安装create-react-app npm install -g create-react-app 如果出现报错请参考 create-react-app -V 报错无法将“create-react-app”项识别为 cmdlet、函数、脚本文件或可运行程序的名称_Java-请多指教的博客-CSDN博客 2.创建…

HTTP1.1、HTTPS、HTTP2.0 、HTTP3.0

HTTP1.1 优点: 整体方面:简单、灵活和易于扩展、应用广泛和跨平台 性能方面:长连接、管道网络传输解决请求队头阻塞(没有使用) 缺点: 安全方面:无状态、明文窃听、伪装、篡改 性能方面&am…

【NLP】多头注意力概念(02)

接上文: 【NLP】多头注意力概念(01) 五、计算注意力 将 Q、K 和 V 拆分为它们的头部后,现在可以计算 Q 和 K 的缩放点积。上面的等式表明,第一步是执行张量乘法。但是,必须先转置 K。 展望未来,每个张量的seq_length形状将通过其各自的张量来识别,以确保清晰…

抽象工厂模式

在开发一款游戏时,我们需要开发按钮Button及展板Board等组件,我们有多种风格Ligth或Dark,不同风格下组件的颜色、形状也不相同。如果按照工厂方法模式,则设计如下: 图 工厂方法模式实现上述需求 以上方法存在两个问题…

自动化测试工具比传统测试工具的优势体现在哪里?

随着软件行业的快速发展和扩张,自动化测试工具在提高测试效率和质量方面起到了不可或缺的作用,那你知道自动化测试工具比传统测试工具的优势体现在哪里吗? 首先,自动化测试工具能够大大缩短测试周期。相比于传统手动测试&#xff…

学习系统编程No.31【多线程互斥与同步】

引言: 北京时间:2023/7/16/14:32,摆烂至今,在耍这方面,谁能比我行,哈哈哈,乐观!欠了一堆课要补,等我们把线程相关知识学完,对于系统编程方面我们搞定的就差不…