【问题标题】:Comparing RGB histograms: plt.hist, np.histogram, and cv2.compareHist比较 RGB 直方图:plt.hist、np.histogram 和 cv2.compareHist
【发布时间】:2014-09-20 17:34:01
【问题描述】:

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

-----
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

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

感谢您的帮助。最终我想在几个 h_i 上迭代这个过程,并为每对 h_i、h_j 返回一个“d”值列表。

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,)

【问题讨论】:

  • 我也查过了,即使bob1.shape = mark1.shape,错误依然存在,比如:H1.type() == H2.type() && H1.type() == 函数 compareHist 中的 CV_32F。也许以下与我的根本问题有关?:answers.opencv.org/question/6695/…
  • 你好,没用过python接口,但是如果你想比较不同大小的直方图你可以试试EMD距离docs.opencv.org/modules/imgproc/doc/…
  • 在比较之前也尝试转换为浮点数
  • 为什么不使用 OpenCV 的 cv2.calcHist() 函数?
  • compareHist() 需要两个 numpy 数组,但您传递的是一个元组。 (ph1 应该是三个 numpy 数组的元组)

标签: opencv numpy histogram


【解决方案1】:

您遇到错误的原因是 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)

并使用上述函数将参数传递给OpenCVcompareHist函数如下:

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

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2018-04-04
    • 2013-10-13
    • 1970-01-01
    • 2015-05-01
    • 2015-07-27
    • 2021-07-08
    • 2017-01-24
    • 2013-01-14
    相关资源
    最近更新 更多