Python 如何使用合并的容器计算直方图?

Python 如何使用合并的容器计算直方图?,python,image,opencv,image-processing,histogram,Python,Image,Opencv,Image Processing,Histogram,我想问一下如何使用OpenCV在Python中计算直方图。我使用了以下代码: hist=cv2.calcHist(im[0,1,2],无[8,8,8],[0,256,0,256,0,256]) 结果给出了每个颜色通道的柱状图,共有8个存储箱,但我想得到的是: 第一箱(R=0-32,G=0-32,B=0-32) 第二箱(R=33-64,G=0-32,B=0-32) 等等, 因此,我总共有512个垃圾箱。从我的角度来看,您的cv2.calcHist呼叫不正确: hist=cv2.calcHis

我想问一下如何使用OpenCV在Python中计算直方图。我使用了以下代码:

hist=cv2.calcHist(im[0,1,2],无[8,8,8],[0,256,0,256,0,256])
结果给出了每个颜色通道的柱状图,共有8个存储箱,但我想得到的是:

  • 第一箱(R=0-32,G=0-32,B=0-32)
  • 第二箱(R=33-64,G=0-32,B=0-32
  • 等等,

因此,我总共有512个垃圾箱。

从我的角度来看,您的
cv2.calcHist
呼叫不正确:

hist=cv2.calcHist(im[0,1,2],无[8,8,8],[0,256,0,256,0,256])
第一个参数应该是图像列表:

hist=cv2.calcHist([im],[0,1,2],无,[8,8,8],[0,256,0,256,0,256])
让我们看一个小例子:

导入cv2
将numpy作为np导入
#大小为[4,4]的红蓝色正方形,即八个像素(255,0,0)和八个像素(0,0,255);注意:BGR订购!
image=np.zero((4,4,3),dtype=np.uint8)
图像[:,0:2,2]=255
图像[:,2:4,0]=255
#使用每个通道的两个存储单元[0-127]和[128-255]计算直方图:
#结果应为hist[“bin 0”、“bin 0”、“bin 1”]=8(红色)和hist[“bin 1”、“bin 0”、“bin 0”]=8(蓝色)
#原始cv2.calcHist调用,带有两个BIN[0-127]和[128-255]
hist=cv2.calcHist(图像[0,1,2],无[2,2,2],[0,256,0,256,0,256])
打印(历史,'\n')#不正确
#正确的cv2.calcHist调用
hist=cv2.calcHist([image],[0,1,2],无[2,2,2],[0,256,0,256,0,256])
打印(历史,'\n')#正确
[[8.0]
[0. 0.]]
[[0. 0.]
[0. 4.]]] 
[[[0. 8.]
[0. 0.]]
[[8. 0.]
[0. 0.]]] 
正如您所能做到的,您的版本总共只有12个值,而图像中有16个像素!此外,还不清楚代表了什么“箱子”(如果有的话)

因此,通过正确的
cv2.calcHist
调用,您的总体想法/方法是正确的!也许,您只需要一点提示,“如何阅读”结果
hist

导入cv2
将numpy作为np导入
#尺寸为[32,16]的彩色矩形,每个槽有一个“颜色”,每个通道有八个槽,
#即,512像素,使得所得512个存储单元中的每一个具有值1
x=np.linspace(16240,8,dtype=np.uint8)
image=np.重塑(np.移动轴(np.数组(np.网格(x,x,x)),[0,1,2,3],[3,0,1,2]),(32,16,3))
#正确的cv2.calcHist调用
hist=cv2.calcHist([image],[0,1,2],无[8,8,8],[0,256,0,256,0,256])
#每个直方图箱的冗长输出
对于np.arange中的B(历史形状[0]):
对于np.arange中的G(历史形状[1]):
对于np.arange中的R(历史形状[2]):
r='r='+str(r*32).zfill(3)+'-'+str(r+1)*32-1.zfill(3)
g='g='+str(g*32).zfill(3)+'-'+str(g+1)*32-1.zfill(3)
b='b='+str(b*32).zfill(3)+'-'+str(b+1)*32-1.zfill(3)
打印(“(“+r+”,“+g+”,“+b+”):”,int(hist[b,g,r]))
(R=000-031,G=000-031,B=000-031):1
(R=032-063,G=000-031,B=000-031):1
(R=064-095,G=000-031,B=000-031):1
[…506多行…]
(R=160-191,G=224-255,B=224-255):1
(R=192-223,G=224-255,B=224-255):1
(R=224-255,G=224-255,B=224-255):1

希望有帮助

非常感谢你纠正我的问题太好了。。这是我想要的,非常感谢^^
print('('+r+','+g+','+b+'):',int(hist[b,g,r]))
。我认为这一部分应该改为this@pingxiu是的,你说得对。我会在我的回答中解决这个问题。谢谢