可以使用简单的布尔运算符:
import cv2
image = cv2.imread('grade_0.jpg')
out = ((image>=75)&(image<125)).sum()
# 57032
或者,正如@ jared所建议的:
out = np.count_nonzero((image>=75)&(image<125))
计数时间:
# sum
170 µs ± 2.81 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
# count_non_zero
47.6 µs ± 2.94 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
编辑:我知道您想要处理几个垃圾箱,这可以使用以下方法完成:
bins = [(0,80),(75,125),(120,220),(210,255)]
out = {f'{a}-{b}': np.count_nonzero((image>=a)&(image<b)) for a, b in bins}
# {'0-80': 26274, '75-125': 57032, '120-220': 86283, '210-255': 40967}
但这将再次读取图像的数据 for each 仓.
在本例中,@Andrej建议使用bincount
,因为它只计算像素一次:
bins = [(0,80),(75,125),(120,220),(210,255)]
counts = np.bincount(image.ravel())
out = {'-'.join(map(str, t)): counts[slice(*t)].sum() for t in bins}
# {'0-80': 26274, '75-125': 57032, '120-220': 86283, '210-255': 40967}
时间将取决于图像的大小和箱的数量.对于小图像,再次计数可能更有效,而对于大图像,bincount
可能更好(但令人惊讶的是,并不总是如此).
256 x 256
# count_nonzero in loop
198 µs ± 8.75 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
# bincount
440 µs ± 6.82 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
512 x 512:
# count_nonzero in loop
918 µs ± 31 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
# bincount
1.76 ms ± 26.1 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
1024 x 1024:
# count_nonzero in loop
11 ms ± 210 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# bincount
8.15 ms ± 437 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2048 x 2048:
# count_nonzero in loop
47.1 ms ± 3.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# bincount
48.8 ms ± 3.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)