繁体   English   中英

Python - 计算地球移动器直方图的距离

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM