我有一个图像的直方图,基本上图像的直方图是一个图表,显示转换为 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 秒,即使对于速度较慢的计算机来说,这也有点长。
这是示例图片:
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())