[英]Python - Computing Earth Mover Distance of histograms
我试图使用从http://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html获得的以下片段来计算我有两个直方图(x1,x2)之间的地球移动距离:
cv2.cv.CalcEMD2(x1, x2,cv2.cv.CV_DIST_L1)
但是我一直收到此错误。
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()进行转换:
np.histogramdd(data, bins = 80))
给我:
(array([ 28., 5., 0.]), [array([-1.71194523, -1.66131523, -1.61068523])])
和一个普通的np数组:
[28. 5. 0.]
两种方法都不适合我,也不允许我计算阵列之间的推土机距离。 任何帮助将不胜感激!
正确,经过反复试验,我认为这是解决方案:(从如何为2个numpy数组(即使用opencv的“直方图”计算“ EMD”的最佳答案中获得)
ref =参考np阵列测量值=与其比较的np阵列
创建numpy数组[[data] [weights]]的直方图,并将其转换为[data [i],weight [i]]格式。 然后到cv数组,然后将其转换为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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.