我想在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直方图
答案 0 :(得分:4)
我在尝试制作HSV图像的3D直方图时遇到了这个问题,并遇到了同样的错误。事实证明,OpenCV documentation使我们误入歧途。这些文档是为C ++ API编写的,因此只能用作Python cv2
API的模糊指南(尽管我发现这些文档有时会对C ++产生误导)。
功能签名如下:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
关键是channels
,histSize
和ranges
参数应该是平面列表,而不是示例中的嵌套列表。假设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)