如果您想将像素映射到9 箱,那么您可以转换为灰度,然后使用// 除以(256/9) 以获得整数
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
result = img_gray[x:x+w,y:y+h] // (256/9)
在calcHist 中,您使用通道列表[1],因此您只需要一个通道的直方图,这意味着您不必转换为灰度,而是使用[..., ..., 1]
result = img[x:x+w, y:y+h, 1] // (256/9)
编辑:我测试了你的示例数据[[154, 192], [67, 115]],它给了我
[[5, 6], [2, 4]] 而不是 [[5, 7], [3, 4]]
import numpy as np
bins_number = 9
x = np.array([[154, 192], [67, 115]])
result = (x // (256/bins_number)).astype(int)
print('result:', result.tolist())
使用谷歌"numpy histcounts matlab" 我还发现How do i replicate this matlab function in numpy? 使用np.digitize() 复制histcounts,它也给了我[[5, 6], [2, 4]] 而不是[[5, 7], [3, 4]],但我不知道我是否正确创建了垃圾箱范围。
import numpy as np
bins_number = 9
x = np.array([[154, 192], [67, 115]])
bins = [(256/bins_number)*x for x in range(1, bins_number+1)]
result = np.digitize(x, bins)
print('result:', result.tolist())
print('bins:', bins)
我没有Matlab,所以我尝试在Octave 中使用histc()
>> [a, b] = histc([154, 192, 67, 115], [ 28.44444444, 56.88888889,
85.33333333, 113.77777778, 142.22222222, 170.66666667, 199.11111111, 227.55555556, 256. ])
a =
0 1 0 1 1 1 0 0 0
b =
5 6 2 4
它还给了我[[5, 6], [2, 4]] 而不是[[5, 7], [3, 4]]
编辑:我发现 numpy.histogram_bin_edges 可以生成 bin 范围
import numpy as np
bins_number = 9
x = np.array([[154, 192], [67, 115], [0,1]])
bins = np.histogram_bin_edges(x, bins=9, range=(0, 256))
print('bins:', bins)
但它将0 添加为第一条边,因此稍后它使用数字1-9 而不是0-8,但如果您使用bins[1:],那么它仍然使用数字0-8
import numpy as np
bins_number = 9
x = np.array([[154, 192], [67, 115]])
bins = np.histogram_bin_edges(x, bins=9, range=(0, 255))
print('bins:', bins)
print('result:', np.digitize(x, bins[1:]).tolist())