计算 numpy.ndarray 中项目列表出现次数的最快方法

问题描述 投票:0回答:1

我有一个图像的直方图,基本上图像的直方图是一个图表,显示转换为 0-255 值的像素在图像中出现了多少次。 Y 轴为出现次数,X 轴为像素值。

我需要的是从75-125的像素值总数

image= cv2.imread('grade_0.jpg')
listOfNumbers = image.ravel() #generates the long list of 0-255 values from the image) type numpy.ndarray

现在我的代码通过将 numpy.ndarray 转换为列表并逐一计算每个值来实现此目的

start = time.time()
numberlist = list(list0fNumbers)

sum = 0
for x in range(75,125):
    sum = sum + numberlist.count(x)
end = time.time()

print('Sum: ' + str(sum))
print('Execution time_ms: ' + str((end-start) * 10**3))

结果:

Sum: 57111
Execution time_ms: 13492.571830749512

我会对数千张图像执行类似的操作,仅这张图像就需要 13 秒。这实在是太低效了。关于如何将其速度加快到大约 10 毫秒以下,有什么建议吗?我不会只得到 75-125 的总和,还会得到其他范围,例如0-80,75-125,120-220,210-255。假设处理单个 256x256 像素图像也需要 13 秒,大约需要 60 秒,即使对于速度较慢的计算机来说,这也有点长。

这是示例图片:

python numpy numpy-ndarray
1个回答
0
投票

您可以使用

np.bincount

y = np.bincount(arr)
print(y[75:125].sum())

打印:

57032

完整代码:

import numpy as np
from PIL import Image

# Open your image file:
image_path = "image.png"
image = Image.open(image_path)

arr = np.array(image).ravel()

y = np.bincount(arr)
print(y[75:125].sum())
© www.soinside.com 2019 - 2024. All rights reserved.