OpenCV for Python 入坑第三天 :图片处理(2)

news2025/7/17 3:26:43

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

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

相关文章

tinymce编辑器导入docx、doc格式Word文档完整版

看此文章之前需要注意一点 在前端使用导入Word文档并自动解析成html再插入到tinymce编辑器中,在这里我使用的是mammoth.js识别Word内容,并set到编辑器中,使用mammoth只可解析.docx格式的Word,目前的mammoth不支持.doc格式&#x…

Ghost Buster Pro for mac(快速清理卸载的应用残存文件)

Ghost Buster Pro for mac可从您已卸载的应用程序中查找并删除文件。该应用程序速度快如闪电,可立即释放内存。 许多应用程序都安装在计算机上,但它们通常只会在您的计算机上停留很短的时间。每个应用程序都会创建文件,但删除应用程序不会删…

01 - 如何制定性能调优标准?

1、为什么要做性能调优? 一款线上产品如果没有经过性能测试,那它就好比是一颗定时炸弹,你不知道它什么时候会出现问题,你也不清楚它能承受的极限在哪儿。 有些性能问题是时间累积慢慢产生的,到了一定时间自然就爆炸了…

使用dhtmlx-gantt甘特图插件定制预约表【实战】

示例传送门 定制预约表展示 一、安装 npm i dhtmlx-gantt二、配置解释与汇总 //自定义表头列 gantt.config.columns = [{name: "

服务器部署 Python 项目总结

title: 服务器部署 Python 项目总结 date: 2023-07-05 16:33:49 tags: 服务器Python categories:服务器 cover: https://cover.png feature: false 1. 准备 Python 项目需要 Python 的环境,假如服务器操作系统为 CentOS 7 的话,默认安装了 Python2 与 …

安达发|APS高级排程系统界的天花板!

APS 系统不仅为生产部门提供制造依据,而且涉及到采购计划、安全库存、订单交付等方面。这是非常复杂的管理。一个易于使用的 APS 系统不仅能够充分整合生产相关业务流程,保证生产计划的顺利进行,而且能够大大提高生产效率,降低管理…

导出python环境的所有安装包

导出操作 pip freeze > requests.txt批量导入操作 pip install -r requests.txt

redis数据类型基本操作(list,string,hash,keys相关操作),mongodb(增删改查)

1、 string类型数据的命令操作: (1) 设置键值: (2) 读取键值: (3) 数值类型自增1: (4) 数值类型自减1: (5…

Java面试突击

Java面向对象有哪些特征,如何应用 ​ 面向对象编程是利用类和对象编程的一种思想。万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的继承关系&…

三菱PLC 控制灯一秒钟交替闪烁

三菱PLC中常用的特殊继电器: M8000 上电一直ON标志 M8002 上电导通一次 M8004 PLC出错 M8005 PLC备用电池电量低标志 M8011 10ms时钟脉冲 M8012 100ms时钟脉冲 M8013 1s时钟脉冲 M8014 1min时钟脉冲 M8034…

【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析

目录 一、介绍 二、使用方法 1.推理 2.训练 三、MPRNet结构 1.整体结构 2.CAB(Channel Attention Block) 3.Stage1 Encoder 4.Stage2 Encoder 5.Decoder 6.SAM(Supervised Attention Module) 7.ORSNet(Original Resolution Subnetwork) 四、损失函数 1.Charbonni…

[LINUX]之grep文本过滤

linux通过使用grep -v操作来实现文本过滤 新创建文本如下 执行过滤命令如下,已经过滤了test3 cat test.txt |grep -v "test3"

Dockerd的迁移与备份

1、容器保存为镜像 (1) 通过以下命令将容器保存为镜像 # 保存nginx容器为镜像 docker commit 容器名称 镜像名称 例如:docker commit mynginx mynginx_i(2)用 docker ps -a 查看所有的容器 (3&#xf…

15-C++基本算法-贪心法

📚 理论基础 贪心法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择中都采取当前状态下最优的选择,以期望获得全局最优解。贪心法通常适用于问题具有最优子结构和贪心选择性质的情况。 适用场景 贪心法适用…

react 实现浮动可吸附悬浮窗,悬浮球,悬浮按钮,支持拖动拖拽功能(suspend-button)

前言: 最近在做移动端,有个需求是 实现一个浮动球可拖拽,能吸附(吸附到 左右两则,距离哪进就吸附到哪边)。 实现过程: 使用 suspend-button (但是此组件不支持 ts 和pc端&#x…

VMWare安装统信UOS虚拟机

单击 创建新的虚拟机 按钮,然后选择 自定义, 然后 下一步 硬件兼容性 选择 Workstation16.x ,然后 下一步 选择“稍后安装操作系统”, 然后 下一步 选择 Linux , 再选 版本 CentOS 8 64位/ Ubuntu 均可,然…

【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

文章目录 😏专栏导读🤖文章导读🙀树的预备知识🙀二叉树😳树的代码实现及其各类讲解🌲树的结构体初始化 总结 😏专栏导读 👻作者简介:M malloc,致力于成为嵌入…

LinkNet分割模型搭建

原论文:LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation 直接步入正题~~~ 一、LinkNet 1.decoder模块 class DecoderBlock(nn.Module):def __init__(self, in_channels, n_filters): #512, 256super(DecoderBlock, self).__in…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 …

关于21电赛数字识别

这里我们只讲数字识别的代码。 关于模型的训练,这里就不多讲了,看我的这篇文章: K210学习篇(八)在MaixHub训练模型_ODF..的博客-CSDN博客 这里着重讲我们得到训练后的模型该怎么去修改以及和stm32单片机通信。 当我们把下载的模型解压后,就得到一些这些文件,我们只需…