Python-计算直方图的土方移动距离
我正试图使用以下我从中获得的片段,计算我得到的两个直方图(x1,x2)之间的土方机距离: 然而,我不断得到这个错误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格式,但没有成功。我做错什么了吗 下面是我正在使用
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)