上一篇博客我们了解了图像在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值放到任意的图片上~