Opencv 比较RGB直方图:plt.hist、np.histogram和cv2.compareHist

Opencv 比较RGB直方图:plt.hist、np.histogram和cv2.compareHist,opencv,numpy,histogram,Opencv,Numpy,Histogram,从两个jpeg文件中,我使用PIL创建了两个rgb值的np数组,一个是nx3维,另一个是mx3维。问题是如何将这两个数组馈送到cv2.compareHist(h1,h2,method)中。在创建了名为“bob1”和“mark1”的np数组之后,下面是代码的相关部分: 我得到的错误是: d = cv2.compareHist(h1,h2, cv2.cv.CV_COMP_BHATTACHARYYA) TypeError: <unknown> is not a numpy array

从两个jpeg文件中,我使用PIL创建了两个rgb值的np数组,一个是nx3维,另一个是mx3维。问题是如何将这两个数组馈送到cv2.compareHist(h1,h2,method)中。在创建了名为“bob1”和“mark1”的np数组之后,下面是代码的相关部分:

我得到的错误是:

d = cv2.compareHist(h1,h2, cv2.cv.CV_COMP_BHATTACHARYYA)

TypeError: <unknown> is not a numpy array

您遇到错误的原因是OpenCV的
cv2.compareList
函数需要一个Nx1列的bin计数数组,而Numpy函数返回的元组格式为
(bin\u计数,bin\u边)
。(请参阅以获取有关通过Python绑定公开的OpenCV直方图功能的一些信息。)

如果您通过直方图比较彩色图像,多维函数实际上更合适,因为在装箱之前实际上会将输入数组展平

在这两种情况下,以下函数将Numpy直方图输出映射到相应的OpenCV兼容表单:

def np_hist_to_cv(np_histogram_output):
    counts, bin_edges = np_histogram_output
    return counts.ravel().astype('float32')
因此,给定您描述的形式的随机数据:

import numpy as np
import cv2

bob1 = np.random.rand(100, 3).astype('float32')
mark1 = np.random.rand(100, 3).astype('float32')
您可以按如下方式构建3D(即颜色空间)直方图:

h1 = np.histogramdd(bob1)
h2 = np.histogramdd(mark1)
d = cv2.compareHist(np_hist_to_cv(h1), np_hist_to_cv(h2),
                    cv2.cv.CV_COMP_BHATTACHARYYA)
print d
0.932737905309
并使用上述函数将参数传递给OpenCV
compareList
函数,如下所示:

h1 = np.histogramdd(bob1)
h2 = np.histogramdd(mark1)
d = cv2.compareHist(np_hist_to_cv(h1), np_hist_to_cv(h2),
                    cv2.cv.CV_COMP_BHATTACHARYYA)
print d
0.932737905309

我还检查了,即使bob1.shape=mark1.shape,错误仍然存在,例如:函数compareList中的H1.type()==H2.type()&&H1.type()==CV_32F。也许以下内容与我的潜在问题有关?:您好,没有使用python接口,但是如果您想比较不同大小的直方图,您可以尝试EMD距离,也可以尝试在比较之前转换为浮点值。为什么不使用OpenCV中的cv2.calcHist()函数?compareHist()需要两个numpy数组,但您传递的是元组。(ph1应该是三个numpy数组的元组)