您应该复制数组:
b,g,r = img[:,:,0].copy(), img[:,:,1].copy(), img[:,:,2].copy()
但是,由于calcHist()可以接受channels参数,因此您无需将img拆分为三个数组。
import cv2
import numpy as np
img = cv2.imread('zzzyj.jpg')
h = np.zeros((300,256,3))
bins = np.arange(256).reshape(256,1)
color = [ (255,0,0),(0,255,0),(0,0,255) ]
for ch, col in enumerate(color):
hist_item = cv2.calcHist([img],[ch],None,[256],[0,255])
cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX)
hist=np.int32(np.around(hist_item))
pts = np.column_stack((bins,hist))
cv2.polylines(h,[pts],False,col)
h=np.flipud(h)
cv2.imshow('colorhist',h)
cv2.waitKey(0)
0
我只是想使用新的OpenCV Python界面(cv2)绘制直方图。
下面是我尝试的代码:
而且效果很好。以下是我获得的结果直方图。
然后我修改了一点代码。
b,g,r = cv2.split(img)
代码b,g,r = cv2.split(img)
的第六行更改为b,g,r = img[:,:,0], img[:,:,1], img[:,:,2]
(因为它比cv2.split
快一点)。现在的输出有所不同。以下是输出。
我从两个代码中检查了
b,g,r
的值。他们是一样的。区别在于
cv2.calcHist
的输出。在两种情况下,hist_item
结果均不同。问题 :
它是怎么发生的?当输入相同时,为什么
cv2.calcHist
的结果不同?编辑
我尝试了其他代码。现在,我第一个代码的numpy版本。
并且输出与第一个相同。
您可以在此处获得我的原始图像: zzz.jpg
谢谢。