用于计算每种颜色出现次数的数组定义如下:
values = np.zeros((1, 256), dtype="uint8")
这意味着每个计数用一个字节来表示,这意味着最大值是255。一旦该颜色的额外像素出现,计数将溢出到0。
这几乎是肯定会发生的,因为您正在处理的ROI大小约为100x100像素。
解决方案很简单——使用更大的数据类型,例如
int32
def mode_filter(self, roi):
values = np.zeros((1, 256), dtype="int32")
for pos, val in np.ndenumerate(roi):
values[0, val] += 1
print(values)
return int(np.argmax(values[0]))
例如,在平铺(0,5)上,如下所示:
[[144 15 9 13 8 1 5 9 4 5 5 1 2 4 4 4 4 6
7 5 4 2 1 2 1 1 0 1 2 1 6 3 4 7 2 3
1 1 2 1 0 4 2 2 3 2 0 2 0 2 0 1 2 5
1 3 2 4 2 2 3 3 1 3 4 2 2 2 2 4 3 2
4 0 1 2 0 2 2 2 1 0 2 2 1 1 2 1 0 3
2 0 1 1 0 4 1 3 1 2 3 1 0 3 0 1 1 0
0 1 2 1 2 0 1 2 2 1 1 0 1 2 2 4 2 1
2 1 1 1 1 2 1 1 1 3 1 1 2 3 2 1 2 0
1 1 1 3 4 2 3 1 1 2 1 1 5 3 1 2 1 1
1 0 2 3 0 1 1 3 4 0 2 1 4 3 0 1 4 1
1 2 2 1 0 1 1 2 1 1 1 3 2 3 1 5 0 2
2 1 2 2 0 2 1 0 1 1 4 2 4 2 2 4 1 4
4 4 1 3 1 0 3 6 3 2 0 2 3 5 3 3 5 5
5 4 3 6 7 4 1 7 2 10 5 10 6 10 7 7 16 8
10 14 16 125]]
0
鉴于修正后的版本:
[[2960 15 9 13 8 1 5 9 4 5 5 1 2 4
4 4 4 6 7 5 4 2 1 2 1 1 0 1
2 1 6 3 4 7 2 3 1 1 2 1 0 4
2 2 3 2 0 2 0 2 0 1 2 5 1 3
2 4 2 2 3 3 1 3 4 2 2 2 2 4
3 2 4 0 1 2 0 2 2 2 1 0 2 2
1 1 2 1 0 3 2 0 1 1 0 4 1 3
1 2 3 1 0 3 0 1 1 0 0 1 2 1
2 0 1 2 2 1 1 0 1 2 2 4 2 1
2 1 1 1 1 2 1 1 1 3 1 1 2 3
2 1 2 0 1 1 1 3 4 2 3 1 1 2
1 1 5 3 1 2 1 1 1 0 2 3 0 1
1 3 4 0 2 1 4 3 0 1 4 1 1 2
2 1 0 1 1 2 1 1 1 3 2 3 1 5
0 2 2 1 2 2 0 2 1 0 1 1 4 2
4 2 2 4 1 4 4 4 1 3 1 0 3 6
3 2 0 2 3 5 3 3 5 5 5 4 3 6
7 4 1 7 2 10 5 10 6 10 7 7 16 8
10 14 16 7293]]
255