访问像素值时item()函数如何工作?

时间:2019-01-13 23:16:09

标签: python opencv

我正在阅读OpenCV python教程,他们说NumPy数组函数item()是访问图像中像素值的最佳方法,但我不知道它的作用。

import cv2
import numpy as np

img = cv2.imread('image.jpg')

print(img.item(10, 10, 2)) # I don't know what the item() function does/what it's parameters are

1 个答案:

答案 0 :(得分:0)

docsnumpy.ndarray.item()将数组的元素复制到标准Python标量并返回。

换句话说,调用img.item(i)将获得数组中由索引i表示的值的副本,类似于img[i],但返回的区别是它作为Python标量而不是数组。按照文档进行操作后,获取Python标量有助于加快对数组元素的访问速度,并利用Python的优化数学对值进行算术运算。

一个例子:

>>> x = np.random.randint(9, size=(3, 3))
>>> x
array([[1, 8, 4],
      [8, 7, 5],
      [2, 1, 1]])
>>> x.item((1,0))
8
>>> x[1,0] # both calls seem to return the same value, but...
8
>>> type(x[1,0]) # Numpy's own int32
<class 'numpy.int32'>
>>> type(x.item((1,0))) # Python's standard int
<class 'int'>

item仅接受一个参数,该参数可以为None,该参数仅适用于单个项目数组;一个int_type,其作用类似于平面索引;以及一个tuple int_type的值,它被解释为数组的多维索引。

回到您的具体问题,OpenCV recommends itemitemset处理单个像素值时,因为numpy已针对数组计算进行了优化,因此访问单个项泄气。

所以不要这样做:

import cv2
import numpy as np

img = cv2.imread('image.jpg')
img[0, 0] = 255 # Setting a single pixel
px = img[0, 0]  # Getting a single pixel

要做:

img.itemset((0, 0), 255)
px = img.item((0, 0))