如何使用开放CV在python中计算3D直方图

时间:2013-04-05 12:58:11

标签: python opencv histogram

我想在python中计算我的Cielab图像的3D直方图。我正在使用openCV来计算直方图。我想使用openCV的compareHist函数比较图像,这就是我使用openCV来计算图像的3D直方图的原因。

我尝试使用以下变量:

i_lab = image.copy()
i_lab = i_lab.astype(np.uint8)
Range_hist = [[0, 100], [-100, 100], [-100, 100]]    
hist_1 = cv2.calcHist([i_lab], [[0], [1], [2]], None, [[20], [20], [20]], Range_hist)

但是错误SystemError: error return without exception set 请告诉我我做错了什么,以及是否可以在python中使用openCV计算3D直方图

2 个答案:

答案 0 :(得分:4)

我在尝试制作HSV图像的3D直方图时遇到了这个问题,并遇到了同样的错误。事实证明,OpenCV documentation使我们误入歧途。这些文档是为C ++ API编写的,因此只能用作Python cv2 API的模糊指南(尽管我发现这些文档有时会对C ++产生误导)。

功能签名如下:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

关键是channelshistSizeranges参数应该是平面列表,而不是示例中的嵌套列表。假设i_lab是三通道图像,请尝试以下操作:

range_hist = [0, 100, -100, 100, -100, 100]
hist_1 = cv2.calcHist([i_lab], [0, 1, 2], None, [20, 20, 20], range_hist)

有关更完整的示例,请尝试this code listing中的opencvpython blog

答案 1 :(得分:0)

对于在cielab中计算直方图,这对我有用:

calcHist的功能签名:每个维度中的图像,通道,蒙版,bin数,直方图bin边界的dims数组。

img = cv2.imread(file) # in bgr 
hist = cv2.calcHist([img],[0, 1, 2],None,[256, 256, 256],[0, 255, 0, 255, 0, 255]) # in bgr
img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) # in lab 
hist = cv2.calcHist([img],[0, 1, 2],None,[100, 2*128, 2*128],[0, 100, -128, 127, -128, 127])`# in lab 

correlation = cv2.HISTCMP_CORREL # compare histograms using correlation
corr = cv2.compareHist(img, img2, correlation)