用户对问题“如何使用opencv计算两个数组的"EMD“,即”直方图“?”的回答 您所在的位置:网站首页 直方图怎么求 用户对问题“如何使用opencv计算两个数组的"EMD“,即”直方图“?”的回答

用户对问题“如何使用opencv计算两个数组的"EMD“,即”直方图“?”的回答

2023-04-02 18:35| 来源: 网络整理| 查看: 265

你必须用权重和坐标来定义你的数组。如果有两个数组a= 1,1,0,0,1和b= 0,1,0,1表示一维直方图,那么numpy数组应该如下所示:

a = [[1 1] [1 2] [0 3] [0 4] [1 5]] b = [[0 1] [1 2] [0 3] [1 4]]

请注意,行数可以不同。列数应该是维度+ 1。第一列包含权重,第二列包含坐标。

下一步是在将CV_32FC1数组作为签名输入到CalcEMD2函数之前,将数组转换为numpy Mat。代码将如下所示:

from cv2 import * import numpy as np # Initialize a and b numpy arrays with coordinates and weights a = np.zeros((5,2)) for i in range(0,5): a[i][1] = i+1 a[0][0] = 1 a[1][0] = 1 a[2][0] = 0 a[3][0] = 0 a[4][0] = 1 b = np.zeros((4,2)) for i in range(0,4): b[i][1] = i+1 b[0][0] = 0 b[1][0] = 1 b[2][0] = 0 b[3][0] = 1 # Convert from numpy array to CV_32FC1 Mat a64 = cv.fromarray(a) a32 = cv.CreateMat(a64.rows, a64.cols, cv.CV_32FC1) cv.Convert(a64, a32) b64 = cv.fromarray(b) b32 = cv.CreateMat(b64.rows, b64.cols, cv.CV_32FC1) cv.Convert(b64, b32) # Calculate Earth Mover's print cv.CalcEMD2(a32,b32,cv.CV_DIST_L2) # Wait for key cv.WaitKey(0)

请注意,欧几里德距离CV_DIST_L2是CalcEMD2的第三个参数。第三个参数的另一个选项是曼哈顿距离CV_DIST_L1。

我还想提一下,我用Python编写了计算地球移动器两个2D直方图距离的代码。你可以找到这个代码here。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有