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

时间:2016-03-15 15:29:59

标签: python opencv numpy histogram

我正在尝试使用从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.]

对我来说都不起作用,也不允许我计算阵列之间的地球移动距离。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

是的,经过多次试验和错误,我认为这是解决方案: (从How to compute "EMD" for 2 numpy arrays i.e "histogram" using opencv?的最佳答案获得)

ref = reference np array meas = 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)