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

news2024/10/7 6:40:18

上一篇博客我们了解了图像在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 np

arr = 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 random

img = 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] = num

x,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 random

img = 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 np

arr = 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 numpy

img = 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 numpy

img = 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.coloradmin.cn/o/766779.html

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

相关文章

STL好难(8):map和set

目录 1.一些概念的理解 🍉关联式容器和序列式容器 🍉key模型、key/value模型 🍉树形结构关联式容器 2.set的介绍 🍉set文档 🍉set的使用 🍒set的模板参数列表 🍒set的构造 &#x1f3…

【TiDB理论知识 05】TiKV-Raft协议

目录 一 概念 二 raft共识算法对于TiKV的几个重要功能 1 Raft日志复制 1 Raft日志复制流程 2 名词解释 分层次理解TIKV 2 Raft Leader选举 集群初始状态时Leader选举流程 数据正在复制时Leader选举流程 初始化时的特殊情况 raft 参数与Tidb 参数对应关系 一 概念 le…

SpringCloud系列(十六)[分布式搜索引擎篇] - DSL 查询及相关性算分的学习 (部分)

在SpringCloud系列(十五)[分布式搜索引擎篇] - 结合实际应用场景学习并使用 RestClient 客户端 API这篇文章中我们已经对 RestClient 有了初步的了解, 并且已经将一些数据进行了存储, 但是这并不是我们学习 ElasticSearch 的目的, ElasticSearch 最擅长的…

Java8之Stream流

目录 简介 特点 Stream操作步骤 创建 中间操作 筛选与切片 filter(Predicate p) distinct() limit(long maxSize) skip(long n) 映射 map(Function f) flatMap(Function f) 排序 自然排序 定制排序 终止操作 匹配与查找 归约 收集 好处 不足 简介 在编写…

css基本样式的使用

1、高度和宽度 .c1{height: 300px;width: 500px; }注意事项: 宽度,支持百分比行内标签,默认无效块级标签,默认有效(即使右侧空白,也不给你占用) 块级和行内标签 css样式 标签: di…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼,每次没有清空数组导致叠加数据,约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

【SpringBoot】SpringBoot的创建和运行

1.什么是SpringBoot? Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发 的。 Spring Boot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发…

洗鞋小程序开发

上门洗鞋小程序为用户提供了便捷、高效的鞋子洗护服务。通过手机即可预约上门取送鞋子,省时省力,让鞋子焕然一新。下面我们来看看这个小程序的具体功能介绍。 1. 预约取送服务:用户可以在上门洗鞋小程序中选择合适的时间和地点,预…

访问学者面试申请如何应对?

作为一个学者面试申请者,面对这一重要机会,我们需要认真准备并采取适当的应对策略。下面知识人网小编将提供一些建议,帮助你在面试中取得良好的表现。 首先,在准备阶段,你应该研究并了解申请机构的背景和研究方向。了解…

阻止冒泡 大盒子套小盒子 点击大盒子跳转页面 小盒子不跳转

比如论坛点赞功能 点击这篇帖子跳到论坛详情页面,但是点赞不跳转 <view click.stop"onSmallBoxClick"><!-- 点赞 --> </view>methods: {onSmallBoxClick() {// 点赞逻辑 } } 大盒子 帖子div <view click"g…

pdf合并一页怎么合并?这几种合并方法看看

pdf合并一页怎么合并&#xff1f;PDF文件是一种非常常见的文件格式&#xff0c;它可以在不同的操作系统和设备之间方便地进行共享。有时候&#xff0c;我们需要将多个PDF文件合并成一个文件。例如&#xff0c;当我们需要将多个文档合并成一个大文档时&#xff0c;或者我们需要将…

Redis数据类型与常用命令

文章目录 前言一、Redis数据类型1. Redis数据类型简介2. Redis数据类型特点 二、Redis常用命令1. 字符串string 操作命令2. 哈希hash 操作命令3. 列表list 操作命令4. 集合set操作命令5. 有序集合 sorted set 操作命令6. 通用命令 总结 前言 为了巩固所学的知识&#xff0c;作…

TRT3-trt-basic - 6 Int8的量化

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有&#xff1a;y kx b&#xff0c;此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有&#xff1a;y tofp32(toint8(k) * toint8(x)) b&#xff0c;其中int8 * int8结果为in…

win7,win10下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\报错

在调试虚拟网卡驱动时&#xff0c;由于修改错误&#xff0c;导致枚举顺序错乱&#xff0c;因此通过删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\WINTUN下的所有项&#xff0c;即可&#xff0c;win10可用。 1、下载PStools&#xff1a; http://technet.microsoft.c…

130、仿真-基于51单片机智能窗户温湿度电机控制仿真设计(Proteus仿真+程序+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

算法(1):斐波那契数列模型

目录 &#x1f981;三步问题 &#x1f349;题目解析 &#x1f349;算法原理 &#x1f352;状态表示 &#x1f352;状态转移方程 &#x1f352;初始化 &#x1f352;填表顺序、返回值 &#x1f349;代码编写 &#x1f981;使用最小花费爬楼梯 &#x1f349;题目解析 …

为什么选择STM32才是明智之选?

在电子工程领域&#xff0c;我们强调适用性&#xff0c;性能并非最重要&#xff0c;甚至不是首要考虑因素。选择合适的微控制器&#xff08;MCU&#xff09;根据设计需求而异&#xff0c;常规做法是在保证功能满足的前提下&#xff0c;选择稳定可靠且经济实惠的器件。而对于那些…

前端转换bigInt,axios拦截器失效

前端转换bigInt&#xff0c;axios拦截器失效 关于bigInt的使用切换雪花ID解决精度丢失问题进度丢失&#xff0c;前端不支持bigInt解决问题 拦截器失效验证及解决 关于bigInt的使用 这篇文章算是使用中的小笔记吧&#xff0c;主要是我自己搜索没找到直接的方法&#x1f613;&am…

SSH隧道功能

随着互联网的普及和发展&#xff0c;越来越多的企业需要申请公网IP地址。&#xff08;公网IP地址是指可以在互联网上直接访问的P地址&#xff0c;可以用于建立网站、远程办公、视频监控等应用。&#xff09; 而公网IP费用较高&#xff0c;笔者在某搜索软件上搜了一下&#xff…

科研创新服务平台性能分析案例

前言 信息中心老师反应&#xff0c;用户反馈科研创新服务器平台有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原…