从两个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,)
答案 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