Python-计算直方图的土方移动距离

Python-计算直方图的土方移动距离,python,opencv,numpy,histogram,Python,Opencv,Numpy,Histogram,我正试图使用以下我从中获得的片段,计算我得到的两个直方图(x1,x2)之间的土方机距离: 然而,我不断得到这个错误 TypeError: CvArr argument 'signature1' must be IplImage, CvMat or CvMatND. Use fromarray() to convert numpy arrays to CvMat or cvMatND" 我尝试使用.fromarray()将我拥有的转换为CvMat格式,但没有成功。我做错什么了吗 下面是我正在使用

我正试图使用以下我从中获得的片段,计算我得到的两个直方图(x1,x2)之间的土方机距离:

然而,我不断得到这个错误

TypeError: CvArr argument 'signature1' must be IplImage, CvMat or CvMatND. Use fromarray() to convert numpy arrays to CvMat or cvMatND"
我尝试使用.fromarray()将我拥有的转换为CvMat格式,但没有成功。我做错什么了吗

下面是我正在使用的两种类型的数组(为了清晰起见,缩写为三个元素),我尝试使用cv2.cv.fromarray()转换它们:

给我:

(array([  28.,    5.,    0.]), [array([-1.71194523, -1.66131523, -1.61068523])])
和普通np数组:

[28.    5.    0.]

这两种方法都不适用于我,也不允许我计算阵列之间的地球移动器距离。任何帮助都将不胜感激

是的,经过多次尝试和错误,我认为这就是解决方案: (从最佳答案中获得)

ref=参考np数组 meas=np数组以将其与之进行比较

创建numpy数组[[data][weights]]的直方图,并将其转换为[data[i],weight[i]]格式。然后将其转换为EMD函数的信号函数

这不是一个理想的解决方案-出于教育目的,任何进一步的改进/建议都将不胜感激

#reference array:
j = np.histogramdd(ref, bins = 80)
a = np.zeros((len(j[0]), 2))
for i, x in enumerate(j[0]):
    a[i][0] = x
    a[i][1] = j[1][0][i]
cv_array_ref = cv2.cv.fromarray(a)

a32 = cv2.cv.CreateMat(cv_array_ref.rows, cv_array_ref.cols,cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_ref, a32)


#measured array:

jj = np.histogramdd(amplitude_norm_data[0], bins = 80)
aa = np.zeros((len(jj[0]), 2))
for ii, xx in enumerate(jj[0]):
    aa[ii][0] = xx
    aa[i][1] = jj[1][0][ii]
cv_array_meas = cv2.cv.fromarray(aa)
a322 = cv2.cv.CreateMat(cv_array_meas.rows, cv_array_meas.cols, cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_meas, a322)


cv2.cv.CalcEMD2(a32, a322,cv2.cv.CV_DIST_L1)

对,经过反复试验,我认为这是解决办法: (从最佳答案中获得)

ref=参考np数组 meas=np数组以将其与之进行比较

创建numpy数组[[data][weights]]的直方图,并将其转换为[data[i],weight[i]]格式。然后将其转换为EMD函数的信号函数

这不是一个理想的解决方案-出于教育目的,任何进一步的改进/建议都将不胜感激

#reference array:
j = np.histogramdd(ref, bins = 80)
a = np.zeros((len(j[0]), 2))
for i, x in enumerate(j[0]):
    a[i][0] = x
    a[i][1] = j[1][0][i]
cv_array_ref = cv2.cv.fromarray(a)

a32 = cv2.cv.CreateMat(cv_array_ref.rows, cv_array_ref.cols,cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_ref, a32)


#measured array:

jj = np.histogramdd(amplitude_norm_data[0], bins = 80)
aa = np.zeros((len(jj[0]), 2))
for ii, xx in enumerate(jj[0]):
    aa[ii][0] = xx
    aa[i][1] = jj[1][0][ii]
cv_array_meas = cv2.cv.fromarray(aa)
a322 = cv2.cv.CreateMat(cv_array_meas.rows, cv_array_meas.cols, cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_meas, a322)


cv2.cv.CalcEMD2(a32, a322,cv2.cv.CV_DIST_L1)
#reference array:
j = np.histogramdd(ref, bins = 80)
a = np.zeros((len(j[0]), 2))
for i, x in enumerate(j[0]):
    a[i][0] = x
    a[i][1] = j[1][0][i]
cv_array_ref = cv2.cv.fromarray(a)

a32 = cv2.cv.CreateMat(cv_array_ref.rows, cv_array_ref.cols,cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_ref, a32)


#measured array:

jj = np.histogramdd(amplitude_norm_data[0], bins = 80)
aa = np.zeros((len(jj[0]), 2))
for ii, xx in enumerate(jj[0]):
    aa[ii][0] = xx
    aa[i][1] = jj[1][0][ii]
cv_array_meas = cv2.cv.fromarray(aa)
a322 = cv2.cv.CreateMat(cv_array_meas.rows, cv_array_meas.cols, cv2.cv.CV_32FC1)
cv2.cv.Convert(cv_array_meas, a322)


cv2.cv.CalcEMD2(a32, a322,cv2.cv.CV_DIST_L1)