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

时间:2014-07-29 10:59:30

标签: opencv numpy histogram

从两个jpeg文件我已经使用PIL创建了两个ng的rgb值数组,一个具有维度nx 3,另一个具有mx 3.问题是如何将这两个数组提供给cv2.compareHist(h1, h2,方法)。这是我的代码的相关部分,在创建名为" bob1"的np数组之后。和" mark1":

-----
h1 = np.histogram(bob1)
ph1 = plt.hist(bob1)
plt.show() #looks nice, get 3 bars per bin

h2 = np.histogram(mark1)
ph2 = plt.hist(mark1)

#the problem occurs here:
d = cv2.compareHist(h1,h2, cv2.cv.CV_COMP_BHATTACHARYYA)
print d
---

我得到的错误是:

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

TypeError: <unknown> is not a numpy array

如果我在上面的代码中的最后一行用ph1和h2替换h1,我会得到同样的错误。

帮助表示赞赏。最后,我想在几个h_i上迭代这个过程并返回一个&#34; d&#34;每对h_i,h_j的值。

PS。以下是一些示例值:

bob1.shape = (9223, 3)
mark1.shape = (7861,3) 
#could make shapes equal via deleting rows

ph1 =[   91   758  1337  1669  1701  1595  1829  2759  5395 10535] 
ph2= [   81    363  1402  2042  1679  1777  1570  2051  2396 10222]
#here, ph1.shape == ph2.shape is True and ph1.shape = (10,)

1 个答案:

答案 0 :(得分:2)

您遇到错误的原因是OpenCV的cv2.compareHist函数需要一个Nx1列数组的bin计数,而Numpy histogram函数返回一个表单的元组(bin_counts, bin_edges)。 (请参阅here以获取有关通过Python绑定公开的OpenCV直方图功能的一些信息。)

如果您通过直方图比较彩色图像,则多维histogramdd函数实际上更合适,因为histogram实际上在合并之前使输入数组变平。

在这两种情况下,以下函数都会将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)

使用上面的函数将参数传递给OpenCV compareHist函数,如下所示:

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