我正在阅读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
答案 0 :(得分:0)
从docs:numpy.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 item
和itemset
处理单个像素值时,因为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))