【问题标题】:How to calculate 3D histogram in python using open CV如何使用开放CV在python中计算3D直方图
【发布时间】:2013-03-27 21:47:58
【问题描述】:

我想在 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 直方图

【问题讨论】:

  • 我在使用numpy库生成的直方图上使用了compareHist函数,所以我不再需要上面的函数来计算我的直方图了。

标签: python opencv histogram


【解决方案1】:

我在尝试制作 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)

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

【讨论】:

    【解决方案2】:

    为了在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 2012-06-09
      • 2014-04-18
      • 2011-01-02
      • 2014-04-05
      • 1970-01-01
      • 2013-03-09
      • 2014-01-31
      相关资源
      最近更新 更多